@itwin/core-backend 5.9.0-dev.8 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -1
- package/lib/cjs/BackendHubAccess.d.ts +38 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +6 -3
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +9 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +255 -249
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChangesetReader.d.ts +186 -0
- package/lib/cjs/ChangesetReader.d.ts.map +1 -0
- package/lib/cjs/ChangesetReader.js +372 -0
- package/lib/cjs/ChangesetReader.js.map +1 -0
- package/lib/cjs/ChangesetReaderTypes.d.ts +120 -0
- package/lib/cjs/ChangesetReaderTypes.d.ts.map +1 -0
- package/lib/cjs/ChangesetReaderTypes.js +23 -0
- package/lib/cjs/ChangesetReaderTypes.js.map +1 -0
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +1 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +68 -13
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +55 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +43 -1
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +79 -10
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +38 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +5 -5
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.d.ts +2 -2
- package/lib/cjs/ExternalSource.d.ts.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.d.ts +15 -0
- package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
- package/lib/cjs/GeographicCRSServices.js +13 -4
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +31 -23
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +53 -34
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +33 -13
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -6
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.d.ts +85 -1
- package/lib/cjs/LockControl.d.ts.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +40 -6
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js +24 -0
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PartialChangeUnifier.d.ts +77 -0
- package/lib/cjs/PartialChangeUnifier.d.ts.map +1 -0
- package/lib/cjs/PartialChangeUnifier.js +234 -0
- package/lib/cjs/PartialChangeUnifier.js.map +1 -0
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +10 -10
- package/lib/cjs/Relationship.js +6 -6
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.d.ts +4 -4
- package/lib/cjs/SheetIndex.d.ts.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +114 -4
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +196 -8
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +25 -13
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +77 -25
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js +63 -21
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.d.ts +3 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +3 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.d.ts +2 -2
- package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.d.ts +2 -2
- package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.d.ts +2 -0
- package/lib/cjs/internal/HubMock.d.ts.map +1 -1
- package/lib/cjs/internal/HubMock.js +7 -0
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +10 -10
- package/lib/cjs/internal/IntegrityCheck.js +22 -22
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.d.ts.map +1 -1
- package/lib/cjs/internal/NoLocks.js +6 -0
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +285 -4
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +6 -4
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +38 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +6 -3
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts +9 -1
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +255 -249
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChangesetReader.d.ts +186 -0
- package/lib/esm/ChangesetReader.d.ts.map +1 -0
- package/lib/esm/ChangesetReader.js +368 -0
- package/lib/esm/ChangesetReader.js.map +1 -0
- package/lib/esm/ChangesetReaderTypes.d.ts +120 -0
- package/lib/esm/ChangesetReaderTypes.d.ts.map +1 -0
- package/lib/esm/ChangesetReaderTypes.js +20 -0
- package/lib/esm/ChangesetReaderTypes.js.map +1 -0
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +1 -1
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js +69 -14
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +55 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +43 -1
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +79 -10
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +38 -2
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts +5 -5
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.d.ts +2 -2
- package/lib/esm/ExternalSource.d.ts.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.d.ts +15 -0
- package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
- package/lib/esm/GeographicCRSServices.js +12 -4
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +31 -23
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +54 -35
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +33 -13
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -6
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.js +1 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.d.ts +85 -1
- package/lib/esm/LockControl.d.ts.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.d.ts +40 -6
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js +24 -0
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PartialChangeUnifier.d.ts +77 -0
- package/lib/esm/PartialChangeUnifier.d.ts.map +1 -0
- package/lib/esm/PartialChangeUnifier.js +230 -0
- package/lib/esm/PartialChangeUnifier.js.map +1 -0
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.d.ts +10 -10
- package/lib/esm/Relationship.js +6 -6
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.d.ts +4 -4
- package/lib/esm/SheetIndex.d.ts.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/esm/SqliteChangesetReader.js +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +114 -4
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +196 -8
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +25 -13
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +78 -26
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.d.ts.map +1 -1
- package/lib/esm/ViewStore.js +64 -22
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.d.ts +3 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +3 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.d.ts +2 -2
- package/lib/esm/domains/GenericElements.d.ts.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.d.ts +2 -2
- package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.d.ts +2 -0
- package/lib/esm/internal/HubMock.d.ts.map +1 -1
- package/lib/esm/internal/HubMock.js +7 -0
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +10 -10
- package/lib/esm/internal/IntegrityCheck.js +22 -22
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.d.ts.map +1 -1
- package/lib/esm/internal/NoLocks.js +6 -0
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/esm/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js +286 -5
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +1 -0
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +5 -0
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +112 -0
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestEditTxn.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +0 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +819 -26
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +283 -142
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +57 -57
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +45 -45
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +77 -13
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js +43 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +4201 -1671
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DeleteElements.test.d.ts +2 -0
- package/lib/esm/test/standalone/DeleteElements.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/DeleteElements.test.js +625 -0
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -0
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +214 -5
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.d.ts +2 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +1862 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -0
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js +907 -3
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +90 -0
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js +18 -7
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/Settings.d.ts +6 -4
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrityCheck.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/IntegrityCheck.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { assert, expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { BriefcaseDb, IModelDb } from \"../../IModelDb\";\r\nimport { getIntegrityCheckName, performQuickIntegrityCheck, performSpecificIntegrityCheck, QuickIntegrityCheckResultRow } from \"../../internal/IntegrityCheck\";\r\nimport { DbResult, GuidString, Id64 } from \"@itwin/core-bentley\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { HubWrappers } from \"../IModelTestUtils\";\r\nimport { IModel, IModelError } from \"@itwin/core-common\";\r\nimport { _nativeDb, ChannelControl, Subject, SubjectOwnsSubjects } from \"../../core-backend\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\ndescribe(\"Integrity Check Tests\", () => {\r\n let iModelStub: sinon.SinonStubbedInstance<IModelDb>;\r\n\r\n beforeEach(() => {\r\n iModelStub = sinon.createStubInstance(IModelDb);\r\n });\r\n\r\n afterEach(() => {\r\n sinon.restore();\r\n });\r\n\r\n describe(\"getIntegrityCheckName\", () => {\r\n it(\"should return the correct name for a valid check type\", () => {\r\n expect(getIntegrityCheckName(\"checkDataColumns\")).to.equal(\"Check Data Columns\");\r\n expect(getIntegrityCheckName(\"checkECProfile\")).to.equal(\"Check EC Profile\");\r\n expect(getIntegrityCheckName(\"checkNavigationClassIds\")).to.equal(\"Check Navigation Class Ids\");\r\n expect(getIntegrityCheckName(\"checkNavigationIds\")).to.equal(\"Check Navigation Ids\");\r\n expect(getIntegrityCheckName(\"checkLinktableForeignKeyClassIds\")).to.equal(\"Check Link Table Foreign Key Class Ids\");\r\n expect(getIntegrityCheckName(\"checkLinktableForeignKeyIds\")).to.equal(\"Check Link Table Foreign Key Ids\");\r\n expect(getIntegrityCheckName(\"checkClassIds\")).to.equal(\"Check Class Ids\");\r\n expect(getIntegrityCheckName(\"checkDataSchema\")).to.equal(\"Check Data Schema\");\r\n expect(getIntegrityCheckName(\"checkSchemaLoad\")).to.equal(\"Check Schema Load\");\r\n expect(getIntegrityCheckName(\"checkMissingChildRows\")).to.equal(\"Check Missing Child Rows\");\r\n });\r\n\r\n it(\"should return the correct name when sqlCommand string is passed\", () => {\r\n expect(getIntegrityCheckName(\"check_data_columns\")).to.equal(\"Check Data Columns\");\r\n expect(getIntegrityCheckName(\"check_ec_profile\")).to.equal(\"Check EC Profile\");\r\n expect(getIntegrityCheckName(\"check_nav_class_ids\")).to.equal(\"Check Navigation Class Ids\");\r\n expect(getIntegrityCheckName(\"check_nav_ids\")).to.equal(\"Check Navigation Ids\");\r\n expect(getIntegrityCheckName(\"check_linktable_fk_class_ids\")).to.equal(\"Check Link Table Foreign Key Class Ids\");\r\n expect(getIntegrityCheckName(\"check_linktable_fk_ids\")).to.equal(\"Check Link Table Foreign Key Ids\");\r\n expect(getIntegrityCheckName(\"check_class_ids\")).to.equal(\"Check Class Ids\");\r\n expect(getIntegrityCheckName(\"check_data_schema\")).to.equal(\"Check Data Schema\");\r\n expect(getIntegrityCheckName(\"check_schema_load\")).to.equal(\"Check Schema Load\");\r\n expect(getIntegrityCheckName(\"check_missing_child_rows\")).to.equal(\"Check Missing Child Rows\");\r\n });\r\n\r\n it(\"should return the input string if check type is not found\", () => {\r\n expect(getIntegrityCheckName(\"unknownCheck\")).to.equal(\"unknownCheck\");\r\n });\r\n });\r\n\r\n describe(\"performQuickIntegrityCheck\", () => {\r\n it(\"should return quick integrity check results\", async () => {\r\n const mockResults = [\r\n { check: \"check_data_columns\", result: true, elapsed_sec: \"0.5\" },\r\n { check: \"check_ec_profile\", result: false, elapsed_sec: \"0.3\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performQuickIntegrityCheck(iModelStub as any);\r\n\r\n expect(results).to.have.lengthOf(2);\r\n expect(results[0]).to.deep.include({ check: \"Check Data Columns\", passed: true, elapsedSeconds: \"0.5\" });\r\n expect(results[1]).to.deep.include({ check: \"Check EC Profile\", passed: false, elapsedSeconds: \"0.3\" });\r\n });\r\n\r\n it(\"should handle empty results\", async () => {\r\n const asyncIterator = async function* () { };\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performQuickIntegrityCheck(iModelStub as any);\r\n\r\n expect(results).to.be.an(\"array\").that.is.empty;\r\n });\r\n });\r\n\r\n describe(\"performSpecificIntegrityCheck\", () => {\r\n it(\"should return CheckDataColumnsResultRow for checkDataColumns\", async () => {\r\n const mockResults = [\r\n { sno: 1, table: \"ElementProps\", column: \"testColumn\" },\r\n { sno: 2, table: \"ElementTable\", column: \"missingColumn\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkDataColumns\");\r\n\r\n expect(results).to.have.lengthOf(2);\r\n expect(results[0]).to.deep.equal({ sno: 1, table: \"ElementProps\", column: \"testColumn\" });\r\n expect(results[1]).to.deep.equal({ sno: 2, table: \"ElementTable\", column: \"missingColumn\" });\r\n });\r\n\r\n it(\"should return CheckECProfileResultRow for checkECProfile\", async () => {\r\n const mockResults = [\r\n { sno: 1, type: \"Schema\", name: \"BisCore\", issue: \"Invalid schema definition\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkECProfile\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, type: \"Schema\", name: \"BisCore\", issue: \"Invalid schema definition\" });\r\n });\r\n\r\n it(\"should return CheckNavClassIdsResultRow for checkNavigationClassIds\", async () => {\r\n const mockResults = [\r\n { sno: 1, id: \"1\", class: \"Element\", property: \"parent\", nav_id: \"2\", nav_classId: \"3\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkNavigationClassIds\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", class: \"Element\", property: \"parent\", navId: \"2\", navClassId: \"3\" });\r\n });\r\n\r\n it(\"should return CheckNavIdsResultRow for checkNavigationIds\", async () => {\r\n const mockResults = [\r\n { sno: 1, id: \"1\", class: \"Element\", property: \"parent\", nav_id: \"2\", primary_class: \"Element\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkNavigationIds\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", class: \"Element\", property: \"parent\", navId: \"2\", primaryClass: \"Element\" });\r\n });\r\n\r\n it(\"should return CheckLinkTableFkClassIdsResultRow for checkLinktableForeignKeyClassIds\", async () => {\r\n const mockResults = [\r\n { sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", key_id: \"2\", key_classId: \"3\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkLinktableForeignKeyClassIds\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", keyId: \"2\", keyClassId: \"3\" });\r\n });\r\n\r\n it(\"should return CheckLinkTableFkIdsResultRow for checkLinktableForeignKeyIds\", async () => {\r\n const mockResults = [\r\n { sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", key_id: \"2\", primary_class: \"Element\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkLinktableForeignKeyIds\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", keyId: \"2\", primaryClass: \"Element\" });\r\n });\r\n\r\n it(\"should return CheckClassIdsResultRow for checkClassIds\", async () => {\r\n const mockResults = [\r\n { sno: 1, class: \"Element\", id: \"1\", class_id: \"2\", type: \"Element\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkClassIds\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, class: \"Element\", id: \"1\", classId: \"2\", type: \"Element\" });\r\n });\r\n\r\n it(\"should return CheckDataSchemaResultRow for checkDataSchema\", async () => {\r\n const mockResults = [\r\n { sno: 1, type: \"Schema\", name: \"BisCore\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkDataSchema\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, type: \"Schema\", name: \"BisCore\" });\r\n });\r\n\r\n it(\"should return CheckSchemaLoadResultRow for checkSchemaLoad\", async () => {\r\n const mockResults = [\r\n { sno: 1, schema: \"BisCore\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkSchemaLoad\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, schema: \"BisCore\" });\r\n });\r\n\r\n it(\"should return CheckMissingChildRowsResultRow for checkMissingChildRows\", async () => {\r\n const mockResults = [\r\n { sno: 1, class: \"Element\", id: \"1\", class_id: \"2\", MissingRowInTables: \"ElementTable\" },\r\n ];\r\n\r\n const asyncIterator = async function* () {\r\n for (const result of mockResults) {\r\n yield result;\r\n }\r\n };\r\n\r\n iModelStub.createQueryReader.returns(asyncIterator() as any);\r\n\r\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkMissingChildRows\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, class: \"Element\", id: \"1\", classId: \"2\", missingRowInTables: \"ElementTable\" });\r\n });\r\n });\r\n});\r\n\r\ndescribe(\"iModelDb integrityCheck Tests\", () => {\r\n let iTwinId: GuidString;\r\n let iModel: BriefcaseDb;\r\n\r\n before(() => {\r\n HubMock.startup(\"ChangesetReaderTest\", KnownTestLocations.outputDir);\r\n iTwinId = HubMock.iTwinId;\r\n });\r\n\r\n after(() => HubMock.shutdown());\r\n\r\n beforeEach(async () => {\r\n // Create new iModel\r\n const adminToken = \"super manager token\";\r\n const iModelName = \"PRAGMA_test\";\r\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\r\n assert.isNotEmpty(iModelId);\r\n iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId, accessToken: adminToken });\r\n });\r\n\r\n afterEach(() => {\r\n // Cleanup\r\n iModel.close();\r\n });\r\n\r\n it(\"should call integrityCheck on a new iModel and return no errors\", async () => {\r\n const results = await iModel.integrityCheck();\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(results[0]).to.have.property(\"passed\").that.equals(true);\r\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\r\n expect(results[0].results.length).to.equal(9);\r\n assert(results[0].results.every((row) => (row as QuickIntegrityCheckResultRow).passed === true), \"All specific checks should pass\");\r\n });\r\n\r\n it(\"should call integrityCheck with no options selected and default to quick check\", async () => {\r\n const results = await iModel.integrityCheck({});\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(results[0]).to.have.property(\"passed\").that.equals(true);\r\n expect(results[0].results.length).to.equal(9);\r\n\r\n const results2 = await iModel.integrityCheck({ quickCheck: false });\r\n expect(results2).to.have.lengthOf(1);\r\n expect(results2[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(results2[0]).to.have.property(\"passed\").that.equals(true);\r\n expect(results2[0].results.length).to.equal(9);\r\n\r\n const results3 = await iModel.integrityCheck({\r\n quickCheck: false,\r\n specificChecks: {\r\n checkDataColumns: false,\r\n checkECProfile: false,\r\n checkNavigationClassIds: false,\r\n checkNavigationIds: false,\r\n checkLinktableForeignKeyClassIds: false,\r\n checkLinktableForeignKeyIds: false,\r\n checkClassIds: false,\r\n checkDataSchema: false,\r\n checkSchemaLoad: false,\r\n checkMissingChildRows: false,\r\n }\r\n });\r\n expect(results3).to.have.lengthOf(1);\r\n expect(results3[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(results3[0]).to.have.property(\"passed\").that.equals(true);\r\n expect(results3[0].results.length).to.equal(9);\r\n });\r\n\r\n it(\"should throw an error when iModel is closed\", async () => {\r\n iModel.close();\r\n\r\n try {\r\n await iModel.integrityCheck();\r\n assert.fail(\"Expected error was not thrown\");\r\n } catch (error) {\r\n expect((error as IModelError).message).to.include(\"IModel is not open\");\r\n }\r\n });\r\n\r\n it(\"should call integrityCheck on a new iModel and run all specific integrity checks and return no errors\", async () => {\r\n const results = await iModel.integrityCheck({\r\n specificChecks: {\r\n checkDataColumns: true,\r\n checkECProfile: true,\r\n checkNavigationClassIds: true,\r\n checkNavigationIds: true,\r\n checkLinktableForeignKeyClassIds: true,\r\n checkLinktableForeignKeyIds: true,\r\n checkClassIds: true,\r\n checkDataSchema: true,\r\n checkSchemaLoad: true,\r\n checkMissingChildRows: true,\r\n },\r\n });\r\n expect(results).to.be.an(\"array\");\r\n expect(results).to.have.lengthOf(10);\r\n\r\n // Verify each check is present and has the expected structure\r\n const checkNames = results.map((r) => r.check);\r\n expect(checkNames).to.include.members([\r\n \"Check Data Columns\",\r\n \"Check EC Profile\",\r\n \"Check Navigation Class Ids\",\r\n \"Check Navigation Ids\",\r\n \"Check Link Table Foreign Key Class Ids\",\r\n \"Check Link Table Foreign Key Ids\",\r\n \"Check Class Ids\",\r\n \"Check Data Schema\",\r\n \"Check Schema Load\",\r\n \"Check Missing Child Rows\",\r\n ]);\r\n\r\n // All checks should pass\r\n results.forEach((result) => {\r\n expect(result.passed).to.equal(true, `${result.check} should pass`);\r\n expect(result.results).to.be.empty;\r\n });\r\n });\r\n\r\n it(\"should call integrityCheck on an iModel with corrupt foreignKey Ids and return results\", async () => {\r\n // Insert two elements\r\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\r\n\r\n const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([\r\n txn.insertElement({\r\n classFullName: Subject.classFullName,\r\n model: IModel.repositoryModelId,\r\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\r\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject1\"),\r\n }),\r\n txn.insertElement({\r\n classFullName: Subject.classFullName,\r\n model: IModel.repositoryModelId,\r\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\r\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject2\"),\r\n }),\r\n ]));\r\n\r\n // Create a relationship between them\r\n await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });\r\n const relationship = iModel.relationships.createInstance({\r\n classFullName: \"BisCore:SubjectRefersToSubject\",\r\n sourceId: element1Id,\r\n targetId: element2Id,\r\n });\r\n const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));\r\n assert.isTrue(Id64.isValidId64(relationshipId));\r\n\r\n // Delete one element without deleting the relationship to corrupt the iModel\r\n withEditTxn(iModel, () => {\r\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);\r\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\r\n });\r\n\r\n // Run integrity check specifically for linktable foreign key Ids\r\n const results = await iModel.integrityCheck({\r\n quickCheck: true,\r\n specificChecks: {\r\n checkLinktableForeignKeyClassIds: true,\r\n checkLinktableForeignKeyIds: true,\r\n },\r\n });\r\n\r\n // Verify that the checkLinktableForeignKeyIds check reports the corruption\r\n expect(results).to.have.lengthOf(3);\r\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(results[0]).to.have.property(\"passed\").that.equals(false);\r\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\r\n expect(results[0].results.length).to.equal(9);\r\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quickcheck should report failed specific check\");\r\n expect(results[1]).to.have.property(\"passed\").that.equals(true);\r\n expect(results[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\r\n expect(results[2]).to.have.property(\"passed\").that.equals(false);\r\n expect(results[2].results).to.have.lengthOf(1);\r\n expect(results[2].results[0]).to.deep.include({\r\n sno: 1,\r\n id: \"0x20000000001\",\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: \"0x20000000002\",\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"IntegrityCheck.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/IntegrityCheck.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { assert, expect } from \"chai\";\nimport * as sinon from \"sinon\";\nimport { BriefcaseDb, IModelDb } from \"../../IModelDb\";\nimport { getIntegrityCheckName, performQuickIntegrityCheck, performSpecificIntegrityCheck, QuickIntegrityCheckResultRow } from \"../../internal/IntegrityCheck\";\nimport { DbResult, GuidString, Id64 } from \"@itwin/core-bentley\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { HubWrappers } from \"../IModelTestUtils\";\nimport { IModel, IModelError } from \"@itwin/core-common\";\nimport { _nativeDb, ChannelControl, Subject, SubjectOwnsSubjects } from \"../../core-backend\";\nimport { withEditTxn } from \"../../EditTxn\";\n\ndescribe(\"Integrity Check Tests\", () => {\n let iModelStub: sinon.SinonStubbedInstance<IModelDb>;\n\n beforeEach(() => {\n iModelStub = sinon.createStubInstance(IModelDb);\n });\n\n afterEach(() => {\n sinon.restore();\n });\n\n describe(\"getIntegrityCheckName\", () => {\n it(\"should return the correct name for a valid check type\", () => {\n expect(getIntegrityCheckName(\"checkDataColumns\")).to.equal(\"Check Data Columns\");\n expect(getIntegrityCheckName(\"checkECProfile\")).to.equal(\"Check EC Profile\");\n expect(getIntegrityCheckName(\"checkNavigationClassIds\")).to.equal(\"Check Navigation Class Ids\");\n expect(getIntegrityCheckName(\"checkNavigationIds\")).to.equal(\"Check Navigation Ids\");\n expect(getIntegrityCheckName(\"checkLinktableForeignKeyClassIds\")).to.equal(\"Check Link Table Foreign Key Class Ids\");\n expect(getIntegrityCheckName(\"checkLinktableForeignKeyIds\")).to.equal(\"Check Link Table Foreign Key Ids\");\n expect(getIntegrityCheckName(\"checkClassIds\")).to.equal(\"Check Class Ids\");\n expect(getIntegrityCheckName(\"checkDataSchema\")).to.equal(\"Check Data Schema\");\n expect(getIntegrityCheckName(\"checkSchemaLoad\")).to.equal(\"Check Schema Load\");\n expect(getIntegrityCheckName(\"checkMissingChildRows\")).to.equal(\"Check Missing Child Rows\");\n });\n\n it(\"should return the correct name when sqlCommand string is passed\", () => {\n expect(getIntegrityCheckName(\"check_data_columns\")).to.equal(\"Check Data Columns\");\n expect(getIntegrityCheckName(\"check_ec_profile\")).to.equal(\"Check EC Profile\");\n expect(getIntegrityCheckName(\"check_nav_class_ids\")).to.equal(\"Check Navigation Class Ids\");\n expect(getIntegrityCheckName(\"check_nav_ids\")).to.equal(\"Check Navigation Ids\");\n expect(getIntegrityCheckName(\"check_linktable_fk_class_ids\")).to.equal(\"Check Link Table Foreign Key Class Ids\");\n expect(getIntegrityCheckName(\"check_linktable_fk_ids\")).to.equal(\"Check Link Table Foreign Key Ids\");\n expect(getIntegrityCheckName(\"check_class_ids\")).to.equal(\"Check Class Ids\");\n expect(getIntegrityCheckName(\"check_data_schema\")).to.equal(\"Check Data Schema\");\n expect(getIntegrityCheckName(\"check_schema_load\")).to.equal(\"Check Schema Load\");\n expect(getIntegrityCheckName(\"check_missing_child_rows\")).to.equal(\"Check Missing Child Rows\");\n });\n\n it(\"should return the input string if check type is not found\", () => {\n expect(getIntegrityCheckName(\"unknownCheck\")).to.equal(\"unknownCheck\");\n });\n });\n\n describe(\"performQuickIntegrityCheck\", () => {\n it(\"should return quick integrity check results\", async () => {\n const mockResults = [\n { check: \"check_data_columns\", result: true, elapsed_sec: \"0.5\" },\n { check: \"check_ec_profile\", result: false, elapsed_sec: \"0.3\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performQuickIntegrityCheck(iModelStub);\n\n expect(results).to.have.lengthOf(2);\n expect(results[0]).to.deep.include({ check: \"Check Data Columns\", passed: true, elapsedSeconds: \"0.5\" });\n expect(results[1]).to.deep.include({ check: \"Check EC Profile\", passed: false, elapsedSeconds: \"0.3\" });\n });\n\n it(\"should handle empty results\", async () => {\n const asyncIterator = async function* () { };\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performQuickIntegrityCheck(iModelStub);\n\n expect(results).to.be.an(\"array\").that.is.empty;\n });\n });\n\n describe(\"performSpecificIntegrityCheck\", () => {\n it(\"should return CheckDataColumnsResultRow for checkDataColumns\", async () => {\n const mockResults = [\n { sno: 1, table: \"ElementProps\", column: \"testColumn\" },\n { sno: 2, table: \"ElementTable\", column: \"missingColumn\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkDataColumns\");\n\n expect(results).to.have.lengthOf(2);\n expect(results[0]).to.deep.equal({ sno: 1, table: \"ElementProps\", column: \"testColumn\" });\n expect(results[1]).to.deep.equal({ sno: 2, table: \"ElementTable\", column: \"missingColumn\" });\n });\n\n it(\"should return CheckECProfileResultRow for checkECProfile\", async () => {\n const mockResults = [\n { sno: 1, type: \"Schema\", name: \"BisCore\", issue: \"Invalid schema definition\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkECProfile\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, type: \"Schema\", name: \"BisCore\", issue: \"Invalid schema definition\" });\n });\n\n it(\"should return CheckNavClassIdsResultRow for checkNavigationClassIds\", async () => {\n const mockResults = [\n { sno: 1, id: \"1\", class: \"Element\", property: \"parent\", nav_id: \"2\", nav_classId: \"3\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkNavigationClassIds\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", class: \"Element\", property: \"parent\", navId: \"2\", navClassId: \"3\" });\n });\n\n it(\"should return CheckNavIdsResultRow for checkNavigationIds\", async () => {\n const mockResults = [\n { sno: 1, id: \"1\", class: \"Element\", property: \"parent\", nav_id: \"2\", primary_class: \"Element\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkNavigationIds\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", class: \"Element\", property: \"parent\", navId: \"2\", primaryClass: \"Element\" });\n });\n\n it(\"should return CheckLinkTableFkClassIdsResultRow for checkLinktableForeignKeyClassIds\", async () => {\n const mockResults = [\n { sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", key_id: \"2\", key_classId: \"3\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkLinktableForeignKeyClassIds\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", keyId: \"2\", keyClassId: \"3\" });\n });\n\n it(\"should return CheckLinkTableFkIdsResultRow for checkLinktableForeignKeyIds\", async () => {\n const mockResults = [\n { sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", key_id: \"2\", primary_class: \"Element\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkLinktableForeignKeyIds\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, id: \"1\", relationship: \"ElementOwnsChildElements\", property: \"parent\", keyId: \"2\", primaryClass: \"Element\" });\n });\n\n it(\"should return CheckClassIdsResultRow for checkClassIds\", async () => {\n const mockResults = [\n { sno: 1, class: \"Element\", id: \"1\", class_id: \"2\", type: \"Element\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkClassIds\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, class: \"Element\", id: \"1\", classId: \"2\", type: \"Element\" });\n });\n\n it(\"should return CheckDataSchemaResultRow for checkDataSchema\", async () => {\n const mockResults = [\n { sno: 1, type: \"Schema\", name: \"BisCore\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkDataSchema\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, type: \"Schema\", name: \"BisCore\" });\n });\n\n it(\"should return CheckSchemaLoadResultRow for checkSchemaLoad\", async () => {\n const mockResults = [\n { sno: 1, schema: \"BisCore\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkSchemaLoad\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, schema: \"BisCore\" });\n });\n\n it(\"should return CheckMissingChildRowsResultRow for checkMissingChildRows\", async () => {\n const mockResults = [\n { sno: 1, class: \"Element\", id: \"1\", class_id: \"2\", MissingRowInTables: \"ElementTable\" },\n ];\n\n const asyncIterator = async function* () {\n for (const result of mockResults) {\n yield result;\n }\n };\n\n iModelStub.createQueryReader.returns(asyncIterator() as any);\n\n const results = await performSpecificIntegrityCheck(iModelStub as any, \"checkMissingChildRows\");\n\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.deep.equal({ sno: 1, class: \"Element\", id: \"1\", classId: \"2\", missingRowInTables: \"ElementTable\" });\n });\n });\n});\n\ndescribe(\"iModelDb integrityCheck Tests\", () => {\n let iTwinId: GuidString;\n let iModel: BriefcaseDb;\n\n before(() => {\n HubMock.startup(\"IntegrityCheckTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n\n after(() => HubMock.shutdown());\n\n beforeEach(async () => {\n // Create new iModel\n const adminToken = \"super manager token\";\n const iModelName = \"PRAGMA_test\";\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(iModelId);\n iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId, accessToken: adminToken });\n });\n\n afterEach(() => {\n // Cleanup\n iModel.close();\n });\n\n it(\"should call integrityCheck on a new iModel and return no errors\", async () => {\n const results = await iModel.integrityCheck();\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(true);\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\n expect(results[0].results.length).to.equal(9);\n assert(results[0].results.every((row) => (row as QuickIntegrityCheckResultRow).passed === true), \"All specific checks should pass\");\n });\n\n it(\"should call integrityCheck with no options selected and default to quick check\", async () => {\n const results = await iModel.integrityCheck({});\n expect(results).to.have.lengthOf(1);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(true);\n expect(results[0].results.length).to.equal(9);\n\n const results2 = await iModel.integrityCheck({ quickCheck: false });\n expect(results2).to.have.lengthOf(1);\n expect(results2[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results2[0]).to.have.property(\"passed\").that.equals(true);\n expect(results2[0].results.length).to.equal(9);\n\n const results3 = await iModel.integrityCheck({\n quickCheck: false,\n specificChecks: {\n checkDataColumns: false,\n checkECProfile: false,\n checkNavigationClassIds: false,\n checkNavigationIds: false,\n checkLinktableForeignKeyClassIds: false,\n checkLinktableForeignKeyIds: false,\n checkClassIds: false,\n checkDataSchema: false,\n checkSchemaLoad: false,\n checkMissingChildRows: false,\n }\n });\n expect(results3).to.have.lengthOf(1);\n expect(results3[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results3[0]).to.have.property(\"passed\").that.equals(true);\n expect(results3[0].results.length).to.equal(9);\n });\n\n it(\"should throw an error when iModel is closed\", async () => {\n iModel.close();\n\n try {\n await iModel.integrityCheck();\n assert.fail(\"Expected error was not thrown\");\n } catch (error) {\n expect((error as IModelError).message).to.include(\"IModel is not open\");\n }\n });\n\n it(\"should call integrityCheck on a new iModel and run all specific integrity checks and return no errors\", async () => {\n const results = await iModel.integrityCheck({\n specificChecks: {\n checkDataColumns: true,\n checkECProfile: true,\n checkNavigationClassIds: true,\n checkNavigationIds: true,\n checkLinktableForeignKeyClassIds: true,\n checkLinktableForeignKeyIds: true,\n checkClassIds: true,\n checkDataSchema: true,\n checkSchemaLoad: true,\n checkMissingChildRows: true,\n },\n });\n expect(results).to.be.an(\"array\");\n expect(results).to.have.lengthOf(10);\n\n // Verify each check is present and has the expected structure\n const checkNames = results.map((r) => r.check);\n expect(checkNames).to.include.members([\n \"Check Data Columns\",\n \"Check EC Profile\",\n \"Check Navigation Class Ids\",\n \"Check Navigation Ids\",\n \"Check Link Table Foreign Key Class Ids\",\n \"Check Link Table Foreign Key Ids\",\n \"Check Class Ids\",\n \"Check Data Schema\",\n \"Check Schema Load\",\n \"Check Missing Child Rows\",\n ]);\n\n // All checks should pass\n results.forEach((result) => {\n expect(result.passed).to.equal(true, `${result.check} should pass`);\n expect(result.results).to.be.empty;\n });\n });\n\n it(\"should report corrupt foreignKey Ids\", async () => {\n // Insert two elements\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n\n const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject1\"),\n }),\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject2\"),\n }),\n ]));\n\n // Create a relationship between them\n await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });\n const relationship = iModel.relationships.createInstance({\n classFullName: \"BisCore:SubjectRefersToSubject\",\n sourceId: element1Id,\n targetId: element2Id,\n });\n const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));\n assert.isTrue(Id64.isValidId64(relationshipId));\n\n // Delete one element without deleting the relationship to corrupt the iModel\n withEditTxn(iModel, () => {\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\n });\n\n // Run integrity check specifically for linktable foreign key Ids\n const results = await iModel.integrityCheck({\n quickCheck: true,\n specificChecks: {\n checkLinktableForeignKeyClassIds: true,\n checkLinktableForeignKeyIds: true,\n },\n });\n\n // Run integrity check with default options — quickCheck only, no specific checks\n const justQuickCheck = await iModel.integrityCheck();\n\n expect(justQuickCheck).to.have.lengthOf(1);\n expect(justQuickCheck[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(justQuickCheck[0]).to.have.property(\"passed\").that.equals(false);\n expect(justQuickCheck[0].results.length).to.equal(9);\n const foreignKeyCheck = justQuickCheck[0].results.find((row) => (row as QuickIntegrityCheckResultRow).check === \"Check Link Table Foreign Key Ids\");\n assert.isDefined(foreignKeyCheck, \"Check Link Table Foreign Key Ids sub-check should be present in quickCheck results\");\n expect((foreignKeyCheck as QuickIntegrityCheckResultRow).passed).to.equal(false, \"Check Link Table Foreign Key Ids should report failure\");\n\n // Verify that the checkLinktableForeignKeyIds check reports the corruption\n expect(results).to.have.lengthOf(3);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(false);\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\n expect(results[0].results.length).to.equal(9);\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\n expect(results[1]).to.have.property(\"passed\").that.equals(true);\n expect(results[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\n expect(results[2]).to.have.property(\"passed\").that.equals(false);\n expect(results[2].results).to.have.lengthOf(1);\n expect(results[2].results[0]).to.deep.include({\n sno: 1,\n id: relationshipId,\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"TargetECInstanceId\",\n keyId: element2Id,\n primaryClass: \"BisCore:Element\",\n });\n });\n\n it(\"should report corrupt foreignKey Ids after calling clearCaches\", async () => {\n // Insert two elements\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n\n const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject1\"),\n }),\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject2\"),\n }),\n ]));\n\n // Create a relationship between them\n await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });\n const relationship = iModel.relationships.createInstance({\n classFullName: \"BisCore:SubjectRefersToSubject\",\n sourceId: element1Id,\n targetId: element2Id,\n });\n const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));\n assert.isTrue(Id64.isValidId64(relationshipId));\n\n // Delete one element without deleting the relationship to corrupt the iModel\n withEditTxn(iModel, () => {\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\n });\n\n // Run integrity check specifically for linktable foreign key Ids\n const results = await iModel.integrityCheck({\n quickCheck: true,\n specificChecks: {\n checkLinktableForeignKeyClassIds: true,\n checkLinktableForeignKeyIds: true,\n },\n });\n\n // Verify that the checkLinktableForeignKeyIds check reports the corruption\n expect(results).to.have.lengthOf(3);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(false);\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\n expect(results[0].results.length).to.equal(9);\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\n expect(results[1]).to.have.property(\"passed\").that.equals(true);\n expect(results[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\n expect(results[2]).to.have.property(\"passed\").that.equals(false);\n expect(results[2].results).to.have.lengthOf(1);\n expect(results[2].results[0]).to.deep.include({\n sno: 1,\n id: relationshipId,\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"TargetECInstanceId\",\n keyId: element2Id,\n primaryClass: \"BisCore:Element\",\n });\n\n // Clear caches\n iModel.clearCaches();\n\n // Run integrity check again after clearing cache\n const resultsAfterClearCache = await iModel.integrityCheck({\n quickCheck: true,\n specificChecks: {\n checkLinktableForeignKeyClassIds: true,\n checkLinktableForeignKeyIds: true,\n },\n });\n\n // Verify that the checkLinktableForeignKeyIds check still reports the corruption after clearing cache\n expect(resultsAfterClearCache).to.have.lengthOf(3);\n expect(resultsAfterClearCache[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(resultsAfterClearCache[0]).to.have.property(\"passed\").that.equals(false);\n expect(resultsAfterClearCache[0]).to.have.property(\"results\").that.is.an(\"array\");\n expect(resultsAfterClearCache[0].results.length).to.equal(9);\n assert(resultsAfterClearCache[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\n expect(resultsAfterClearCache[1]).to.have.property(\"passed\").that.equals(true);\n expect(resultsAfterClearCache[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\n expect(resultsAfterClearCache[2]).to.have.property(\"passed\").that.equals(false);\n expect(resultsAfterClearCache[2].results).to.have.lengthOf(1);\n expect(resultsAfterClearCache[2].results[0]).to.deep.include({\n sno: 1,\n id: relationshipId,\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"TargetECInstanceId\",\n keyId: element2Id,\n primaryClass: \"BisCore:Element\",\n });\n });\n\n it(\"should report corrupt foreignKey Ids on an iModel with unsaved changes\", async () => {\n // Insert two elements\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n\n const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject1\"),\n }),\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject2\"),\n }),\n ]));\n\n // Create a relationship between them\n await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });\n const relationship = iModel.relationships.createInstance({\n classFullName: \"BisCore:SubjectRefersToSubject\",\n sourceId: element1Id,\n targetId: element2Id,\n });\n const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));\n assert.isTrue(Id64.isValidId64(relationshipId));\n\n // Delete one element without deleting the relationship to corrupt the iModel - don't save it\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\n\n // Run integrity check specifically for linktable foreign key Ids\n const results = await iModel.integrityCheck({\n quickCheck: true,\n specificChecks: {\n checkLinktableForeignKeyClassIds: true,\n checkLinktableForeignKeyIds: true,\n },\n });\n\n await iModel.discardChanges();\n\n // Verify that the checkLinktableForeignKeyIds check reports the corruption\n expect(results).to.have.lengthOf(3);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(false);\n expect(results[0]).to.have.property(\"results\").that.is.an(\"array\");\n expect(results[0].results.length).to.equal(9);\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\n expect(results[1]).to.have.property(\"passed\").that.equals(true);\n expect(results[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\n expect(results[2]).to.have.property(\"passed\").that.equals(false);\n expect(results[2].results).to.have.lengthOf(1);\n expect(results[2].results[0]).to.deep.include({\n sno: 1,\n id: relationshipId,\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"TargetECInstanceId\",\n keyId: element2Id,\n primaryClass: \"BisCore:Element\",\n });\n });\n\n it(\"should report corrupt source-side foreignKey Ids\", async () => {\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n\n const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject1\"),\n }),\n txn.insertElement({\n classFullName: Subject.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsSubjects(IModel.rootSubjectId),\n code: Subject.createCode(iModel, IModel.rootSubjectId, \"Subject2\"),\n }),\n ]));\n\n await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });\n const relationship = iModel.relationships.createInstance({\n classFullName: \"BisCore:SubjectRefersToSubject\",\n sourceId: element1Id,\n targetId: element2Id,\n });\n const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));\n assert.isTrue(Id64.isValidId64(relationshipId));\n\n // Delete the SOURCE element to create a source-side FK orphan\n withEditTxn(iModel, () => {\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element1Id}`);\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\n });\n\n const results = await iModel.integrityCheck({\n quickCheck: true,\n specificChecks: {\n checkLinktableForeignKeyIds: true,\n },\n });\n\n // Quick Check + specific Check Link Table Foreign Key Ids\n expect(results).to.have.lengthOf(2);\n expect(results[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\n expect(results[0]).to.have.property(\"passed\").that.equals(false);\n\n // Specific check should find the source-side orphan\n expect(results[1]).to.have.property(\"check\").that.equals(\"Check Link Table Foreign Key Ids\");\n expect(results[1]).to.have.property(\"passed\").that.equals(false);\n expect(results[1].results).to.have.length.greaterThanOrEqual(1);\n expect(results[1].results[0]).to.deep.include({\n id: relationshipId,\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"SourceECInstanceId\",\n keyId: element1Id,\n primaryClass: \"BisCore:Element\",\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeConflict.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/MergeConflict.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { GuidString, Id64String } from \"@itwin/core-bentley\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\nimport {\r\n ElementAspectProps,\r\n IModel,\r\n SubCategoryAppearance,\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert, expect } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"../\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n ExternalSourceAspect,\r\n SpatialCategory,\r\n SqliteChangeOp,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { RebaseChangesetConflictArgs, SqliteConflictCause } from \"../../internal/ChangesetConflictArgs\";\r\nchai.use(chaiAsPromised);\r\nimport * as sinon from \"sinon\";\r\n\r\nexport async function createNewModelAndCategory(txn: EditTxn, parent?: Id64String) {\r\n const rwIModel = txn.iModel as BriefcaseDb;\r\n // Create a new physical model.\r\n const [, modelId] = await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(txn, IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel\"), true, parent);\r\n\r\n // Find or create a SpatialCategory.\r\n const dictionary: DictionaryModel = rwIModel.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n const category = SpatialCategory.create(rwIModel, IModel.dictionaryId, newCategoryCode.value);\r\n const spatialCategoryId = txn.insertElement(category.toJSON());\r\n category.setDefaultAppearance(txn, new SubCategoryAppearance({ color: 0xff0000 }));\r\n\r\n return { modelId, spatialCategoryId };\r\n}\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\ndescribe.skip(\"Merge conflict & locking\", () => { // ###TODO FLAKY https://github.com/iTwin/itwinjs-core/issues/7730\r\n let iTwinId: GuidString;\r\n\r\n before(() => {\r\n HubMock.startup(\"MergeConflictTest\", KnownTestLocations.outputDir);\r\n iTwinId = HubMock.iTwinId;\r\n });\r\n after(() => HubMock.shutdown());\r\n\r\n it(\"pull/merge causing update conflict - dirty read/modify (with no lock)\", async () => {\r\n /**\r\n * To simulate a a data conflict for dirty read we update same aspect from two different briefcases\r\n * and when the second briefcase try to push its changes it will fail with following error.\r\n * \"UPDATE/DELETE before value do not match with one in db or CASCADE action was triggered.\"\r\n */\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n\r\n // Delete any existing iModels with the same name as the read-write test iModel\r\n const iModelName = \"TestIModel\";\r\n\r\n // Create a new empty iModel on the Hub & obtain a briefcase\r\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\r\n assert.isNotEmpty(rwIModelId);\r\n\r\n // to reproduce the issue we will disable locks altogether.\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId, noLock: true });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId, noLock: true });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId, noLock: true });\r\n const b1Txn = new EditTxn(b1, \"merge conflict\");\r\n b1Txn.start();\r\n const b2Txn = new EditTxn(b2, \"merge conflict\");\r\n b2Txn.start();\r\n\r\n // create and insert a new model with code1\r\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1Txn,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n\r\n const spatialCategoryId = SpatialCategory.insert(\r\n b1Txn,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n\r\n // insert element and aspect\r\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\r\n await b1.pullChanges();\r\n const aspectId1 = b1Txn.insertAspect({\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier\",\r\n } as ElementAspectProps);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` });\r\n\r\n // b1 same as b2 and now both will modify same aspect\r\n await b2.pullChanges();\r\n\r\n // b1 will change identifier from \"test identifier\" to \"test identifier (modified by b1)\"\r\n b1Txn.updateAspect({\r\n id: aspectId1,\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier (modified by b1)\",\r\n } as ElementAspectProps);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ accessToken: accessToken1, description: `modify aspect ${aspectId1} with no lock` });\r\n\r\n // b2 will change identifier from \"test identifier\" to \"test identifier (modified by b2)\"\r\n b2Txn.updateAspect({\r\n id: aspectId1,\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier (modified by b2)\",\r\n } as ElementAspectProps);\r\n b2Txn.saveChanges();\r\n\r\n const conflicts: {\r\n cause: SqliteConflictCause,\r\n tableName: string,\r\n opcode?: SqliteChangeOp,\r\n id: Id64String,\r\n }[] = [];\r\n\r\n // we will not handle conflict and let the default conflict handler deal with it.\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"custom\", handler: (arg: RebaseChangesetConflictArgs) => {\r\n conflicts.push({\r\n cause: arg.cause,\r\n tableName: arg.tableName,\r\n opcode: arg.opcode,\r\n id: arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String,\r\n });\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ accessToken: accessToken1, description: `modify aspect ${aspectId1} with no lock` });\r\n\r\n expect(conflicts.length).to.be.equals(3);\r\n\r\n chai.expect(\r\n [\r\n {\r\n \"cause\": \"Data\",\r\n \"tableName\": \"bis_Element\",\r\n \"opcode\": \"Updated\",\r\n \"id\": \"0x20000000004\"\r\n },\r\n {\r\n \"cause\": \"Data\",\r\n \"tableName\": \"bis_ElementMultiAspect\",\r\n \"opcode\": \"Updated\",\r\n \"id\": \"0x20000000001\"\r\n },\r\n {\r\n \"cause\": \"Data\",\r\n \"tableName\": \"bis_Model\",\r\n \"opcode\": \"Updated\",\r\n \"id\": \"0x20000000001\"\r\n }\r\n ]).to.be.deep.equals(conflicts);\r\n\r\n await b3.pullChanges();\r\n await b1.pullChanges();\r\n\r\n // b2 win as default conflict handler choose Replace to override local changes over master.\r\n (b2.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\r\n (b3.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\r\n (b1.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\r\n\r\n b1.close();\r\n b2.close();\r\n b3.close();\r\n });\r\n it(\"pull/merge causing update conflict - update causing local changes (with no lock)\", async () => {\r\n /**\r\n * To simulate a a data conflict for dirty read we update same aspect from two different briefcases\r\n * and when the second briefcase try to push its changes it will fail with following error.\r\n * \"UPDATE/DELETE before value do not match with one in db or CASCADE action was triggered.\"\r\n */\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n\r\n // Delete any existing iModels with the same name as the read-write test iModel\r\n const iModelName = \"TestIModel\";\r\n\r\n // Create a new empty iModel on the Hub & obtain a briefcase\r\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\r\n assert.isNotEmpty(rwIModelId);\r\n\r\n // to reproduce the issue we will disable locks altogether.\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId, noLock: true });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId, noLock: true });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId, noLock: true });\r\n const b1Txn = new EditTxn(b1, \"merge conflict\");\r\n b1Txn.start();\r\n const b2Txn = new EditTxn(b2, \"merge conflict\");\r\n b2Txn.start();\r\n\r\n // create and insert a new model with code1\r\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1Txn,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n\r\n const spatialCategoryId = SpatialCategory.insert(\r\n b1Txn,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n\r\n // insert element and aspect\r\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` });\r\n\r\n await b2.pullChanges();\r\n const aspectId1 = b2Txn.insertAspect({\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier\",\r\n } as ElementAspectProps);\r\n b2Txn.saveChanges();\r\n\r\n b1Txn.deleteElement(el1);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ accessToken: accessToken1, description: `deleted element ${el1}` });\r\n\r\n const conflicts: {\r\n cause: SqliteConflictCause,\r\n tableName: string,\r\n opcode?: SqliteChangeOp,\r\n id: Id64String | undefined,\r\n }[] = [];\r\n\r\n // we will not handle conflict and let the default conflict handler deal with it.\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"custom\", handler: (arg: RebaseChangesetConflictArgs) => {\r\n let id;\r\n if (arg.cause !== \"ForeignKey\") {\r\n id = arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String;\r\n }\r\n conflicts.push({\r\n cause: arg.cause,\r\n tableName: arg.tableName,\r\n opcode: arg.opcode,\r\n id,\r\n });\r\n return undefined;\r\n }\r\n });\r\n\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` }),\r\n \"Foreign key conflicts in ChangeSet. Aborting rebase.\");\r\n\r\n expect(conflicts.length).to.be.equals(3);\r\n expect(conflicts).to.deep.equal([\r\n {\r\n cause: \"NotFound\",\r\n tableName: \"bis_Element\",\r\n opcode: \"Updated\",\r\n id: \"0x20000000004\"\r\n },\r\n {\r\n cause: \"Data\",\r\n tableName: \"bis_Model\",\r\n opcode: \"Updated\",\r\n id: \"0x20000000001\"\r\n },\r\n {\r\n cause: \"ForeignKey\",\r\n tableName: \"\",\r\n opcode: undefined,\r\n id: undefined\r\n }\r\n ]);\r\n\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"delete_aspect_when_element_is_deleted\", handler: (arg: RebaseChangesetConflictArgs) => {\r\n if (arg.cause === \"NotFound\" && arg.tableName === \"bis_Element\") {\r\n // if element does not exist any more let delete the aspects as well.\r\n const elId = arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String;\r\n withEditTxn(b2, (txn) => {\r\n b2.elements.getAspects(elId).forEach((aspect) => {\r\n txn.deleteAspect(aspect.id);\r\n });\r\n });\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n b2Txn.saveChanges();\r\n conflicts.length = 0;\r\n\r\n await b2.pushChanges({ accessToken: accessToken1, description: `nothing is pushed as the only change we made is reverted` });\r\n await b3.pullChanges();\r\n await b1.pullChanges();\r\n\r\n expect(() => b1.elements.getElement(el1)).throws(`Element=${el1}`);\r\n expect(() => b2.elements.getElement(el1)).throws(`Element=${el1}`);\r\n expect(() => b3.elements.getElement(el1)).throws(`Element=${el1}`);\r\n\r\n expect(() => b1.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\r\n expect(() => b2.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\r\n expect(() => b3.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\r\n\r\n b1.close();\r\n b2.close();\r\n b3.close();\r\n });\r\n\r\n it(\"aspect insert, update & delete requires exclusive lock\", async () => {\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n\r\n // Delete any existing iModels with the same name as the read-write test iModel\r\n const iModelName = \"TestIModel\";\r\n\r\n // Create a new empty iModel on the Hub & obtain a briefcase\r\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\r\n assert.isNotEmpty(rwIModelId);\r\n\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId });\r\n const b1Txn = new EditTxn(b1, \"merge conflict\");\r\n b1Txn.start();\r\n const b2Txn = new EditTxn(b2, \"merge conflict\");\r\n b2Txn.start();\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.repositoryModelId });\r\n await b2.locks.acquireLocks({ shared: IModel.repositoryModelId });\r\n\r\n // create and insert a new model with code1\r\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1Txn,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n\r\n await b1.locks.acquireLocks({ shared: dictionary.id });\r\n const spatialCategoryId = SpatialCategory.insert(\r\n b1Txn,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element ${el1}` });\r\n\r\n await b2.pullChanges();\r\n let aspectId: Id64String;\r\n const insertAspectIntoB2 = () => {\r\n aspectId = b2Txn.insertAspect({\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier\",\r\n } as ElementAspectProps);\r\n };\r\n\r\n /* attempt to insert aspect without a lock */\r\n assert.throws(insertAspectIntoB2, \"Error inserting ElementAspect [exclusive lock not held on element for insert aspect (id=0x20000000004)], class: BisCore:ExternalSourceAspect\");\r\n\r\n /* acquire lock and try again */\r\n await b2.locks.acquireLocks({ exclusive: el1 });\r\n insertAspectIntoB2();\r\n\r\n /* b1 cannot acquire lock on el1 as its already taken by b2 */\r\n await expect(b1.locks.acquireLocks({ exclusive: el1 })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n /* push changes on b2 to release lock on el1 */\r\n b2Txn.saveChanges();\r\n await b2.pushChanges({ accessToken: accessToken2, description: `add aspect to element ${el1}` });\r\n\r\n await b1.pullChanges();\r\n\r\n const updateAspectIntoB1 = () => {\r\n b1Txn.updateAspect({\r\n id: aspectId,\r\n classFullName: \"BisCore:ExternalSourceAspect\",\r\n element: {\r\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\r\n id: el1,\r\n },\r\n kind: \"\",\r\n identifier: \"test identifier (modified)\",\r\n } as ElementAspectProps);\r\n };\r\n\r\n /* attempt to update aspect without a lock */\r\n assert.throws(updateAspectIntoB1, \"Error updating ElementAspect [exclusive lock not held on element for update aspect (id=0x20000000004)], id: 0x30000000001\");\r\n\r\n /* acquire lock and try again */\r\n await b1.locks.acquireLocks({ exclusive: el1 });\r\n updateAspectIntoB1();\r\n\r\n /* delete the element */\r\n b1Txn.deleteElement(el1);\r\n b1Txn.saveChanges();\r\n\r\n await b1.pushChanges({ accessToken: accessToken1, description: `deleted element ${el1}` });\r\n\r\n const onChangesetConflictStub = sinon.stub(BriefcaseDb.prototype, \"onChangesetConflict\" as any);\r\n /* we should be able to apply all changesets */\r\n await b3.pullChanges();\r\n expect(onChangesetConflictStub.callCount).eq(0, \"native conflict handler should not be called BriefcaseDb.onChangesetConflict()\");\r\n onChangesetConflictStub.restore();\r\n b1.close();\r\n b2.close();\r\n b3.close();\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"MergeConflict.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/MergeConflict.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { GuidString, Id64String } from \"@itwin/core-bentley\";\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\nimport {\n ElementAspectProps,\n IModel,\n SubCategoryAppearance,\n} from \"@itwin/core-common\";\nimport * as chai from \"chai\";\nimport { assert, expect } from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { HubWrappers, KnownTestLocations } from \"../\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport {\n BriefcaseDb,\n ChannelControl,\n DictionaryModel,\n ExternalSourceAspect,\n SpatialCategory,\n SqliteChangeOp,\n} from \"../../core-backend\";\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\nimport { RebaseChangesetConflictArgs, SqliteConflictCause } from \"../../internal/ChangesetConflictArgs\";\nchai.use(chaiAsPromised);\nimport * as sinon from \"sinon\";\n\nexport async function createNewModelAndCategory(txn: EditTxn, parent?: Id64String) {\n const rwIModel = txn.iModel as BriefcaseDb;\n // Create a new physical model.\n const [, modelId] = await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(txn, IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel\"), true, parent);\n\n // Find or create a SpatialCategory.\n const dictionary: DictionaryModel = rwIModel.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n const category = SpatialCategory.create(rwIModel, IModel.dictionaryId, newCategoryCode.value);\n const spatialCategoryId = txn.insertElement(category.toJSON());\n category.setDefaultAppearance(txn, new SubCategoryAppearance({ color: 0xff0000 }));\n\n return { modelId, spatialCategoryId };\n}\n\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\n try {\n await test();\n } catch (e) {\n if (e instanceof Error && msg) {\n assert.equal(e.message, msg);\n }\n return;\n }\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\n}\n\ndescribe.skip(\"Merge conflict & locking\", () => { // ###TODO FLAKY https://github.com/iTwin/itwinjs-core/issues/7730\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"MergeConflictTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n after(() => HubMock.shutdown());\n\n it(\"pull/merge causing update conflict - dirty read/modify (with no lock)\", async () => {\n /**\n * To simulate a a data conflict for dirty read we update same aspect from two different briefcases\n * and when the second briefcase try to push its changes it will fail with following error.\n * \"UPDATE/DELETE before value do not match with one in db or CASCADE action was triggered.\"\n */\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\n\n // Delete any existing iModels with the same name as the read-write test iModel\n const iModelName = \"TestIModel\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\n assert.isNotEmpty(rwIModelId);\n\n // to reproduce the issue we will disable locks altogether.\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId, noLock: true });\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId, noLock: true });\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId, noLock: true });\n const b1Txn = new EditTxn(b1, \"merge conflict\");\n b1Txn.start();\n const b2Txn = new EditTxn(b2, \"merge conflict\");\n b2Txn.start();\n\n // create and insert a new model with code1\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\n b1Txn,\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\n true);\n\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n\n const spatialCategoryId = SpatialCategory.insert(\n b1Txn,\n dictionary.id,\n newCategoryCode.value,\n new SubCategoryAppearance({ color: 0xff0000 }),\n );\n\n // insert element and aspect\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\n await b1.pullChanges();\n const aspectId1 = b1Txn.insertAspect({\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier\",\n } as ElementAspectProps);\n b1Txn.saveChanges();\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` });\n\n // b1 same as b2 and now both will modify same aspect\n await b2.pullChanges();\n\n // b1 will change identifier from \"test identifier\" to \"test identifier (modified by b1)\"\n b1Txn.updateAspect({\n id: aspectId1,\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier (modified by b1)\",\n } as ElementAspectProps);\n b1Txn.saveChanges();\n await b1.pushChanges({ accessToken: accessToken1, description: `modify aspect ${aspectId1} with no lock` });\n\n // b2 will change identifier from \"test identifier\" to \"test identifier (modified by b2)\"\n b2Txn.updateAspect({\n id: aspectId1,\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier (modified by b2)\",\n } as ElementAspectProps);\n b2Txn.saveChanges();\n\n const conflicts: {\n cause: SqliteConflictCause,\n tableName: string,\n opcode?: SqliteChangeOp,\n id: Id64String,\n }[] = [];\n\n // we will not handle conflict and let the default conflict handler deal with it.\n b2.txns.rebaser.addConflictHandler({\n id: \"custom\", handler: (arg: RebaseChangesetConflictArgs) => {\n conflicts.push({\n cause: arg.cause,\n tableName: arg.tableName,\n opcode: arg.opcode,\n id: arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String,\n });\n return undefined;\n }\n });\n\n await b2.pushChanges({ accessToken: accessToken1, description: `modify aspect ${aspectId1} with no lock` });\n\n expect(conflicts.length).to.be.equals(3);\n\n chai.expect(\n [\n {\n \"cause\": \"Data\",\n \"tableName\": \"bis_Element\",\n \"opcode\": \"Updated\",\n \"id\": \"0x20000000004\"\n },\n {\n \"cause\": \"Data\",\n \"tableName\": \"bis_ElementMultiAspect\",\n \"opcode\": \"Updated\",\n \"id\": \"0x20000000001\"\n },\n {\n \"cause\": \"Data\",\n \"tableName\": \"bis_Model\",\n \"opcode\": \"Updated\",\n \"id\": \"0x20000000001\"\n }\n ]).to.be.deep.equals(conflicts);\n\n await b3.pullChanges();\n await b1.pullChanges();\n\n // b2 win as default conflict handler choose Replace to override local changes over master.\n (b2.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\n (b3.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\n (b1.elements.getAspect(aspectId1) as ExternalSourceAspect).identifier = \"test identifier (modified by b2)\";\n\n b1.close();\n b2.close();\n b3.close();\n });\n it(\"pull/merge causing update conflict - update causing local changes (with no lock)\", async () => {\n /**\n * To simulate a a data conflict for dirty read we update same aspect from two different briefcases\n * and when the second briefcase try to push its changes it will fail with following error.\n * \"UPDATE/DELETE before value do not match with one in db or CASCADE action was triggered.\"\n */\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\n\n // Delete any existing iModels with the same name as the read-write test iModel\n const iModelName = \"TestIModel\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\n assert.isNotEmpty(rwIModelId);\n\n // to reproduce the issue we will disable locks altogether.\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId, noLock: true });\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId, noLock: true });\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId, noLock: true });\n const b1Txn = new EditTxn(b1, \"merge conflict\");\n b1Txn.start();\n const b2Txn = new EditTxn(b2, \"merge conflict\");\n b2Txn.start();\n\n // create and insert a new model with code1\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\n b1Txn,\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\n true);\n\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n\n const spatialCategoryId = SpatialCategory.insert(\n b1Txn,\n dictionary.id,\n newCategoryCode.value,\n new SubCategoryAppearance({ color: 0xff0000 }),\n );\n\n // insert element and aspect\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\n b1Txn.saveChanges();\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` });\n\n await b2.pullChanges();\n const aspectId1 = b2Txn.insertAspect({\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier\",\n } as ElementAspectProps);\n b2Txn.saveChanges();\n\n b1Txn.deleteElement(el1);\n b1Txn.saveChanges();\n await b1.pushChanges({ accessToken: accessToken1, description: `deleted element ${el1}` });\n\n const conflicts: {\n cause: SqliteConflictCause,\n tableName: string,\n opcode?: SqliteChangeOp,\n id: Id64String | undefined,\n }[] = [];\n\n // we will not handle conflict and let the default conflict handler deal with it.\n b2.txns.rebaser.addConflictHandler({\n id: \"custom\", handler: (arg: RebaseChangesetConflictArgs) => {\n let id;\n if (arg.cause !== \"ForeignKey\") {\n id = arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String;\n }\n conflicts.push({\n cause: arg.cause,\n tableName: arg.tableName,\n opcode: arg.opcode,\n id,\n });\n return undefined;\n }\n });\n\n\n await assertThrowsAsync(\n async () => b2.pushChanges({ accessToken: accessToken1, description: `inserted element with aspect ${el1}` }),\n \"Foreign key conflicts in ChangeSet. Aborting rebase.\");\n\n expect(conflicts.length).to.be.equals(3);\n expect(conflicts).to.deep.equal([\n {\n cause: \"NotFound\",\n tableName: \"bis_Element\",\n opcode: \"Updated\",\n id: \"0x20000000004\"\n },\n {\n cause: \"Data\",\n tableName: \"bis_Model\",\n opcode: \"Updated\",\n id: \"0x20000000001\"\n },\n {\n cause: \"ForeignKey\",\n tableName: \"\",\n opcode: undefined,\n id: undefined\n }\n ]);\n\n b2.txns.rebaser.addConflictHandler({\n id: \"delete_aspect_when_element_is_deleted\", handler: (arg: RebaseChangesetConflictArgs) => {\n if (arg.cause === \"NotFound\" && arg.tableName === \"bis_Element\") {\n // if element does not exist any more let delete the aspects as well.\n const elId = arg.getValueId(0, arg.opcode === \"Inserted\" ? \"New\" : \"Old\") as Id64String;\n withEditTxn(b2, (txn) => {\n b2.elements.getAspects(elId).forEach((aspect) => {\n txn.deleteAspect(aspect.id);\n });\n });\n }\n return undefined;\n }\n });\n\n b2Txn.saveChanges();\n conflicts.length = 0;\n\n await b2.pushChanges({ accessToken: accessToken1, description: `nothing is pushed as the only change we made is reverted` });\n await b3.pullChanges();\n await b1.pullChanges();\n\n expect(() => b1.elements.getElement(el1)).throws(`Element=${el1}`);\n expect(() => b2.elements.getElement(el1)).throws(`Element=${el1}`);\n expect(() => b3.elements.getElement(el1)).throws(`Element=${el1}`);\n\n expect(() => b1.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\n expect(() => b2.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\n expect(() => b3.elements.getAspect(aspectId1)).throws(`ElementAspect not found ${aspectId1}`);\n\n b1.close();\n b2.close();\n b3.close();\n });\n\n it(\"aspect insert, update & delete requires exclusive lock\", async () => {\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Regular);\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\n\n // Delete any existing iModels with the same name as the read-write test iModel\n const iModelName = \"TestIModel\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: \"TestSubject\", noLocks: undefined });\n assert.isNotEmpty(rwIModelId);\n\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId: rwIModelId });\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId: rwIModelId });\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId: rwIModelId });\n const b1Txn = new EditTxn(b1, \"merge conflict\");\n b1Txn.start();\n const b2Txn = new EditTxn(b2, \"merge conflict\");\n b2Txn.start();\n\n await b1.locks.acquireLocks({ shared: IModel.repositoryModelId });\n await b2.locks.acquireLocks({ shared: IModel.repositoryModelId });\n\n // create and insert a new model with code1\n const [, modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\n b1Txn,\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\n true);\n\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n\n await b1.locks.acquireLocks({ shared: dictionary.id });\n const spatialCategoryId = SpatialCategory.insert(\n b1Txn,\n dictionary.id,\n newCategoryCode.value,\n new SubCategoryAppearance({ color: 0xff0000 }),\n );\n const el1 = b1Txn.insertElement(IModelTestUtils.createPhysicalObject(b1, modelId, spatialCategoryId).toJSON());\n b1Txn.saveChanges();\n await b1.pushChanges({ accessToken: accessToken1, description: `inserted element ${el1}` });\n\n await b2.pullChanges();\n let aspectId: Id64String;\n const insertAspectIntoB2 = () => {\n aspectId = b2Txn.insertAspect({\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier\",\n } as ElementAspectProps);\n };\n\n /* attempt to insert aspect without a lock */\n assert.throws(insertAspectIntoB2, \"Error inserting ElementAspect [exclusive lock not held on element for insert aspect (id=0x20000000004)], class: BisCore:ExternalSourceAspect\");\n\n /* acquire lock and try again */\n await b2.locks.acquireLocks({ exclusive: el1 });\n insertAspectIntoB2();\n\n /* b1 cannot acquire lock on el1 as its already taken by b2 */\n await expect(b1.locks.acquireLocks({ exclusive: el1 })).to.be.rejectedWith(\"exclusive lock is already held\");\n\n /* push changes on b2 to release lock on el1 */\n b2Txn.saveChanges();\n await b2.pushChanges({ accessToken: accessToken2, description: `add aspect to element ${el1}` });\n\n await b1.pullChanges();\n\n const updateAspectIntoB1 = () => {\n b1Txn.updateAspect({\n id: aspectId,\n classFullName: \"BisCore:ExternalSourceAspect\",\n element: {\n relClassName: \"BisCore:ElementOwnsExternalSourceAspects\",\n id: el1,\n },\n kind: \"\",\n identifier: \"test identifier (modified)\",\n } as ElementAspectProps);\n };\n\n /* attempt to update aspect without a lock */\n assert.throws(updateAspectIntoB1, \"Error updating ElementAspect [exclusive lock not held on element for update aspect (id=0x20000000004)], id: 0x30000000001\");\n\n /* acquire lock and try again */\n await b1.locks.acquireLocks({ exclusive: el1 });\n updateAspectIntoB1();\n\n /* delete the element */\n b1Txn.deleteElement(el1);\n b1Txn.saveChanges();\n\n await b1.pushChanges({ accessToken: accessToken1, description: `deleted element ${el1}` });\n\n const onChangesetConflictStub = sinon.stub(BriefcaseDb.prototype, \"onChangesetConflict\" as any);\n /* we should be able to apply all changesets */\n await b3.pullChanges();\n expect(onChangesetConflictStub.callCount).eq(0, \"native conflict handler should not be called BriefcaseDb.onChangesetConflict()\");\n onChangesetConflictStub.restore();\n b1.close();\n b2.close();\n b3.close();\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAppStorage.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/NativeAppStorage.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert, expect } from \"chai\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { NativeHost } from \"../../NativeHost\";\r\nimport { NativeAppStorage } from \"../../NativeAppStorage\";\r\n\r\ndescribe(\"NativeApp storage backend\", () => {\r\n before(async () => {\r\n IModelJsFs.purgeDirSync(NativeHost.appSettingsCacheDir);\r\n });\r\n\r\n it(\"should persistence primitive type values\", () => {\r\n const test1 = NativeAppStorage.open(\"backend_test_1\");\r\n test1.removeAll();\r\n const dataset = [\r\n { key: \"a\", value: 100 },\r\n { key: \"b\", value: 11.22 },\r\n { key: \"c\", value: \"Hello World\" },\r\n { key: \"d\", value: Uint8Array.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) },\r\n { key: \"e\", value: undefined },\r\n ];\r\n\r\n for (const item of dataset) {\r\n test1.setData(item.key, item.value);\r\n if (item.value instanceof Uint8Array) {\r\n assert.equal((test1.getData(item.key) as Uint8Array).length, item.value.length);\r\n } else {\r\n assert.equal(test1.getData(item.key), item.value, `${item.key} -> ${item.value} <> ${String(test1.getData(item.key))}`);\r\n }\r\n }\r\n assert.equal(test1.getKeys().length, dataset.length, \"Number keys must match\");\r\n\r\n // Close storage show now all function to throw exception\r\n test1.close();\r\n assert.throw(() => test1.close());\r\n assert.throw(() => test1.setData(\"t\", \"\"));\r\n assert.throw(() => test1.getData(\"t\"));\r\n assert.throw(() => test1.removeData(\"t\"));\r\n\r\n // Reopen it.\r\n const test2 = NativeAppStorage.open(\"backend_test_1\");\r\n\r\n // reopen and test it\r\n for (const item of dataset) {\r\n test2.setData(item.key, item.value);\r\n if (item.value instanceof Uint8Array) {\r\n assert.equal((test2.getData(item.key) as Uint8Array).length, item.value.length);\r\n } else {\r\n assert.equal(test2.getData(item.key), item.value, `${item.key} -> ${item.value} <> ${String(test2.getData(item.key))}`);\r\n }\r\n }\r\n\r\n const test3 = NativeAppStorage.open(\"backend_test_1\");\r\n // return same storage if it was previously opened\r\n assert.equal(test3, test2);\r\n test2.close(true);\r\n assert.throw(() => test3.close());\r\n });\r\n\r\n it(\"should override and type check\", () => {\r\n const test1 = NativeAppStorage.open(\"backend_test_2\");\r\n test1.removeAll();\r\n test1.setData(\"key1\", undefined);\r\n assert.isUndefined(test1.getData(\"key1\"));\r\n assert.isTrue(test1.hasNullValue(\"key1\"));\r\n\r\n test1.setData(\"key1\", 2222);\r\n assert.isNumber(test1.getData(\"key1\"));\r\n assert.equal(test1.getValueType(\"key1\"), \"number\");\r\n assert.equal(test1.getData(\"key1\"), 2222);\r\n assert.equal(test1.getNumber(\"key1\"), 2222);\r\n assert.equal(test1.getString(\"key1\"), undefined);\r\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\r\n assert.equal(test1.getBoolean(\"key1\"), undefined);\r\n\r\n test1.setData(\"key1\", \"Hello, World\");\r\n assert.isString(test1.getData(\"key1\"));\r\n assert.equal(test1.getData(\"key1\"), \"Hello, World\");\r\n assert.equal(test1.getString(\"key1\"), \"Hello, World\");\r\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\r\n assert.equal(test1.getBoolean(\"key1\"), undefined);\r\n assert.equal(test1.getNumber(\"key1\"), undefined);\r\n\r\n test1.setData(\"key1\", true);\r\n assert.isBoolean(test1.getData(\"key1\"));\r\n assert.equal(test1.getData(\"key1\"), true);\r\n assert.equal(test1.getBoolean(\"key1\"), true);\r\n assert.equal(test1.getString(\"key1\"), undefined);\r\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\r\n assert.equal(test1.getNumber(\"key1\"), undefined);\r\n\r\n test1.setData(\"key1\", false);\r\n assert.isBoolean(test1.getData(\"key1\"));\r\n assert.equal(test1.getData(\"key1\"), false);\r\n assert.equal(test1.getBoolean(\"key1\"), false);\r\n\r\n const testArray = new Uint8Array([1, 2, 3, 4, 5]);\r\n test1.setData(\"key1\", testArray);\r\n assert.isTrue(test1.getData(\"key1\") instanceof Uint8Array);\r\n assert.equal(test1.getUint8Array(\"key1\")!.length, testArray.length);\r\n assert.equal(test1.getBoolean(\"key1\"), undefined);\r\n assert.equal(test1.getString(\"key1\"), undefined);\r\n assert.equal(test1.getNumber(\"key1\"), undefined);\r\n test1.removeAll();\r\n assert.isFalse(test1.hasNullValue(\"key1\"));\r\n assert.equal(test1.getKeys().length, 0);\r\n test1.close(true);\r\n });\r\n\r\n it(\"storage open/close\", () => {\r\n const storages: NativeAppStorage[] = [];\r\n for (let i = 0; i < 20; i++) {\r\n storages.push(NativeAppStorage.open(`backend_test_3-${i}`));\r\n }\r\n storages.forEach((storage) => {\r\n storage.setData(\"name\", storage.id);\r\n storage.setData(\"created_on\", Date.now());\r\n });\r\n storages.forEach((storage) => {\r\n storage.close(true);\r\n });\r\n });\r\n\r\n it(\"should not allow null in the name\", async () => {\r\n expect(() => NativeAppStorage.open(\"my-storage\\x00-name\")).to.throw();\r\n });\r\n\r\n it(\"should not allow names which points to the parent directory\", async () => {\r\n expect(() => NativeAppStorage.open(\"dir/../../storage\")).to.throw();\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"NativeAppStorage.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/NativeAppStorage.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport { IModelJsFs } from \"../../IModelJsFs\";\nimport { NativeHost } from \"../../NativeHost\";\nimport { NativeAppStorage } from \"../../NativeAppStorage\";\n\ndescribe(\"NativeApp storage backend\", () => {\n before(async () => {\n IModelJsFs.purgeDirSync(NativeHost.appSettingsCacheDir);\n });\n\n it(\"should persistence primitive type values\", () => {\n const test1 = NativeAppStorage.open(\"backend_test_1\");\n test1.removeAll();\n const dataset = [\n { key: \"a\", value: 100 },\n { key: \"b\", value: 11.22 },\n { key: \"c\", value: \"Hello World\" },\n { key: \"d\", value: Uint8Array.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) },\n { key: \"e\", value: undefined },\n ];\n\n for (const item of dataset) {\n test1.setData(item.key, item.value);\n if (item.value instanceof Uint8Array) {\n assert.equal((test1.getData(item.key) as Uint8Array).length, item.value.length);\n } else {\n assert.equal(test1.getData(item.key), item.value, `${item.key} -> ${item.value} <> ${String(test1.getData(item.key))}`);\n }\n }\n assert.equal(test1.getKeys().length, dataset.length, \"Number keys must match\");\n\n // Close storage show now all function to throw exception\n test1.close();\n assert.throw(() => test1.close());\n assert.throw(() => test1.setData(\"t\", \"\"));\n assert.throw(() => test1.getData(\"t\"));\n assert.throw(() => test1.removeData(\"t\"));\n\n // Reopen it.\n const test2 = NativeAppStorage.open(\"backend_test_1\");\n\n // reopen and test it\n for (const item of dataset) {\n test2.setData(item.key, item.value);\n if (item.value instanceof Uint8Array) {\n assert.equal((test2.getData(item.key) as Uint8Array).length, item.value.length);\n } else {\n assert.equal(test2.getData(item.key), item.value, `${item.key} -> ${item.value} <> ${String(test2.getData(item.key))}`);\n }\n }\n\n const test3 = NativeAppStorage.open(\"backend_test_1\");\n // return same storage if it was previously opened\n assert.equal(test3, test2);\n test2.close(true);\n assert.throw(() => test3.close());\n });\n\n it(\"should override and type check\", () => {\n const test1 = NativeAppStorage.open(\"backend_test_2\");\n test1.removeAll();\n test1.setData(\"key1\", undefined);\n assert.isUndefined(test1.getData(\"key1\"));\n assert.isTrue(test1.hasNullValue(\"key1\"));\n\n test1.setData(\"key1\", 2222);\n assert.isNumber(test1.getData(\"key1\"));\n assert.equal(test1.getValueType(\"key1\"), \"number\");\n assert.equal(test1.getData(\"key1\"), 2222);\n assert.equal(test1.getNumber(\"key1\"), 2222);\n assert.equal(test1.getString(\"key1\"), undefined);\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\n assert.equal(test1.getBoolean(\"key1\"), undefined);\n\n test1.setData(\"key1\", \"Hello, World\");\n assert.isString(test1.getData(\"key1\"));\n assert.equal(test1.getData(\"key1\"), \"Hello, World\");\n assert.equal(test1.getString(\"key1\"), \"Hello, World\");\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\n assert.equal(test1.getBoolean(\"key1\"), undefined);\n assert.equal(test1.getNumber(\"key1\"), undefined);\n\n test1.setData(\"key1\", true);\n assert.isBoolean(test1.getData(\"key1\"));\n assert.equal(test1.getData(\"key1\"), true);\n assert.equal(test1.getBoolean(\"key1\"), true);\n assert.equal(test1.getString(\"key1\"), undefined);\n assert.equal(test1.getUint8Array(\"key1\"), undefined);\n assert.equal(test1.getNumber(\"key1\"), undefined);\n\n test1.setData(\"key1\", false);\n assert.isBoolean(test1.getData(\"key1\"));\n assert.equal(test1.getData(\"key1\"), false);\n assert.equal(test1.getBoolean(\"key1\"), false);\n\n const testArray = new Uint8Array([1, 2, 3, 4, 5]);\n test1.setData(\"key1\", testArray);\n assert.isTrue(test1.getData(\"key1\") instanceof Uint8Array);\n assert.equal(test1.getUint8Array(\"key1\")!.length, testArray.length);\n assert.equal(test1.getBoolean(\"key1\"), undefined);\n assert.equal(test1.getString(\"key1\"), undefined);\n assert.equal(test1.getNumber(\"key1\"), undefined);\n test1.removeAll();\n assert.isFalse(test1.hasNullValue(\"key1\"));\n assert.equal(test1.getKeys().length, 0);\n test1.close(true);\n });\n\n it(\"storage open/close\", () => {\n const storages: NativeAppStorage[] = [];\n for (let i = 0; i < 20; i++) {\n storages.push(NativeAppStorage.open(`backend_test_3-${i}`));\n }\n storages.forEach((storage) => {\n storage.setData(\"name\", storage.id);\n storage.setData(\"created_on\", Date.now());\n });\n storages.forEach((storage) => {\n storage.close(true);\n });\n });\n\n it(\"should not allow null in the name\", async () => {\n expect(() => NativeAppStorage.open(\"my-storage\\x00-name\")).to.throw();\n });\n\n it(\"should not allow names which points to the parent directory\", async () => {\n expect(() => NativeAppStorage.open(\"dir/../../storage\")).to.throw();\n });\n});\n"]}
|