@itwin/core-backend 5.9.0-dev.9 → 5.9.1
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 +45 -1
- package/lib/cjs/BriefcaseManager.d.ts +14 -62
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +29 -159
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.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 +7 -1
- 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/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/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.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/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.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/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/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/IModelDb.d.ts +31 -23
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +44 -25
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.d.ts +2 -0
- package/lib/cjs/IModelJsFs.d.ts.map +1 -1
- package/lib/cjs/IModelJsFs.js +14 -0
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +20 -9
- 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/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/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/Relationship.d.ts +10 -10
- package/lib/cjs/Relationship.js +6 -6
- package/lib/cjs/Relationship.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/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +17 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +120 -13
- 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/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/TextAnnotationElement.js.map +1 -1
- 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/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/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/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/workspace/WorkspaceImpl.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/esm/BriefcaseManager.d.ts +14 -62
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +30 -160
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.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 +7 -1
- 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/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/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.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/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.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/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/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/IModelDb.d.ts +31 -23
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +45 -26
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.d.ts +2 -0
- package/lib/esm/IModelJsFs.d.ts.map +1 -1
- package/lib/esm/IModelJsFs.js +14 -0
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +20 -9
- 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/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/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/Relationship.d.ts +10 -10
- package/lib/esm/Relationship.js +6 -6
- package/lib/esm/Relationship.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/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +17 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +121 -14
- 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/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/TextAnnotationElement.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/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/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/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/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
- package/lib/esm/test/ElementDrivesElement.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/IpcHost.test.js +112 -0
- package/lib/esm/test/IpcHost.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/ecsql/dataset/ECSqlDatasets.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/ElementRoundTrip.test.js +144 -3
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +2242 -68
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +1 -1
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +64 -0
- package/lib/esm/test/imodel/SchemaXmlImport.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/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +4184 -1654
- package/lib/esm/test/standalone/ChangesetReader.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/GeometryStream.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/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/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/Workspace.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/package.json +15 -15
|
@@ -220,7 +220,7 @@ describe("iModelDb integrityCheck Tests", () => {
|
|
|
220
220
|
let iTwinId;
|
|
221
221
|
let iModel;
|
|
222
222
|
before(() => {
|
|
223
|
-
HubMock.startup("
|
|
223
|
+
HubMock.startup("IntegrityCheckTest", KnownTestLocations.outputDir);
|
|
224
224
|
iTwinId = HubMock.iTwinId;
|
|
225
225
|
});
|
|
226
226
|
after(() => HubMock.shutdown());
|
|
@@ -323,7 +323,7 @@ describe("iModelDb integrityCheck Tests", () => {
|
|
|
323
323
|
expect(result.results).to.be.empty;
|
|
324
324
|
});
|
|
325
325
|
});
|
|
326
|
-
it("should
|
|
326
|
+
it("should report corrupt foreignKey Ids", async () => {
|
|
327
327
|
// Insert two elements
|
|
328
328
|
iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
329
329
|
await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });
|
|
@@ -363,23 +363,232 @@ describe("iModelDb integrityCheck Tests", () => {
|
|
|
363
363
|
checkLinktableForeignKeyIds: true,
|
|
364
364
|
},
|
|
365
365
|
});
|
|
366
|
+
// Run integrity check with default options — quickCheck only, no specific checks
|
|
367
|
+
const justQuickCheck = await iModel.integrityCheck();
|
|
368
|
+
expect(justQuickCheck).to.have.lengthOf(1);
|
|
369
|
+
expect(justQuickCheck[0]).to.have.property("check").that.equals("Quick Check");
|
|
370
|
+
expect(justQuickCheck[0]).to.have.property("passed").that.equals(false);
|
|
371
|
+
expect(justQuickCheck[0].results.length).to.equal(9);
|
|
372
|
+
const foreignKeyCheck = justQuickCheck[0].results.find((row) => row.check === "Check Link Table Foreign Key Ids");
|
|
373
|
+
assert.isDefined(foreignKeyCheck, "Check Link Table Foreign Key Ids sub-check should be present in quickCheck results");
|
|
374
|
+
expect(foreignKeyCheck.passed).to.equal(false, "Check Link Table Foreign Key Ids should report failure");
|
|
366
375
|
// Verify that the checkLinktableForeignKeyIds check reports the corruption
|
|
367
376
|
expect(results).to.have.lengthOf(3);
|
|
368
377
|
expect(results[0]).to.have.property("check").that.equals("Quick Check");
|
|
369
378
|
expect(results[0]).to.have.property("passed").that.equals(false);
|
|
370
379
|
expect(results[0]).to.have.property("results").that.is.an("array");
|
|
371
380
|
expect(results[0].results.length).to.equal(9);
|
|
372
|
-
assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "
|
|
381
|
+
assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
|
|
373
382
|
expect(results[1]).to.have.property("passed").that.equals(true);
|
|
374
383
|
expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
|
|
375
384
|
expect(results[2]).to.have.property("passed").that.equals(false);
|
|
376
385
|
expect(results[2].results).to.have.lengthOf(1);
|
|
377
386
|
expect(results[2].results[0]).to.deep.include({
|
|
378
387
|
sno: 1,
|
|
379
|
-
id:
|
|
388
|
+
id: relationshipId,
|
|
380
389
|
relationship: "BisCore:ElementRefersToElements",
|
|
381
390
|
property: "TargetECInstanceId",
|
|
382
|
-
keyId:
|
|
391
|
+
keyId: element2Id,
|
|
392
|
+
primaryClass: "BisCore:Element",
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
it("should report corrupt foreignKey Ids after calling clearCaches", async () => {
|
|
396
|
+
// Insert two elements
|
|
397
|
+
iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
398
|
+
await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });
|
|
399
|
+
const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([
|
|
400
|
+
txn.insertElement({
|
|
401
|
+
classFullName: Subject.classFullName,
|
|
402
|
+
model: IModel.repositoryModelId,
|
|
403
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
404
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject1"),
|
|
405
|
+
}),
|
|
406
|
+
txn.insertElement({
|
|
407
|
+
classFullName: Subject.classFullName,
|
|
408
|
+
model: IModel.repositoryModelId,
|
|
409
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
410
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject2"),
|
|
411
|
+
}),
|
|
412
|
+
]));
|
|
413
|
+
// Create a relationship between them
|
|
414
|
+
await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });
|
|
415
|
+
const relationship = iModel.relationships.createInstance({
|
|
416
|
+
classFullName: "BisCore:SubjectRefersToSubject",
|
|
417
|
+
sourceId: element1Id,
|
|
418
|
+
targetId: element2Id,
|
|
419
|
+
});
|
|
420
|
+
const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));
|
|
421
|
+
assert.isTrue(Id64.isValidId64(relationshipId));
|
|
422
|
+
// Delete one element without deleting the relationship to corrupt the iModel
|
|
423
|
+
withEditTxn(iModel, () => {
|
|
424
|
+
const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);
|
|
425
|
+
expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);
|
|
426
|
+
});
|
|
427
|
+
// Run integrity check specifically for linktable foreign key Ids
|
|
428
|
+
const results = await iModel.integrityCheck({
|
|
429
|
+
quickCheck: true,
|
|
430
|
+
specificChecks: {
|
|
431
|
+
checkLinktableForeignKeyClassIds: true,
|
|
432
|
+
checkLinktableForeignKeyIds: true,
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
// Verify that the checkLinktableForeignKeyIds check reports the corruption
|
|
436
|
+
expect(results).to.have.lengthOf(3);
|
|
437
|
+
expect(results[0]).to.have.property("check").that.equals("Quick Check");
|
|
438
|
+
expect(results[0]).to.have.property("passed").that.equals(false);
|
|
439
|
+
expect(results[0]).to.have.property("results").that.is.an("array");
|
|
440
|
+
expect(results[0].results.length).to.equal(9);
|
|
441
|
+
assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
|
|
442
|
+
expect(results[1]).to.have.property("passed").that.equals(true);
|
|
443
|
+
expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
|
|
444
|
+
expect(results[2]).to.have.property("passed").that.equals(false);
|
|
445
|
+
expect(results[2].results).to.have.lengthOf(1);
|
|
446
|
+
expect(results[2].results[0]).to.deep.include({
|
|
447
|
+
sno: 1,
|
|
448
|
+
id: relationshipId,
|
|
449
|
+
relationship: "BisCore:ElementRefersToElements",
|
|
450
|
+
property: "TargetECInstanceId",
|
|
451
|
+
keyId: element2Id,
|
|
452
|
+
primaryClass: "BisCore:Element",
|
|
453
|
+
});
|
|
454
|
+
// Clear caches
|
|
455
|
+
iModel.clearCaches();
|
|
456
|
+
// Run integrity check again after clearing cache
|
|
457
|
+
const resultsAfterClearCache = await iModel.integrityCheck({
|
|
458
|
+
quickCheck: true,
|
|
459
|
+
specificChecks: {
|
|
460
|
+
checkLinktableForeignKeyClassIds: true,
|
|
461
|
+
checkLinktableForeignKeyIds: true,
|
|
462
|
+
},
|
|
463
|
+
});
|
|
464
|
+
// Verify that the checkLinktableForeignKeyIds check still reports the corruption after clearing cache
|
|
465
|
+
expect(resultsAfterClearCache).to.have.lengthOf(3);
|
|
466
|
+
expect(resultsAfterClearCache[0]).to.have.property("check").that.equals("Quick Check");
|
|
467
|
+
expect(resultsAfterClearCache[0]).to.have.property("passed").that.equals(false);
|
|
468
|
+
expect(resultsAfterClearCache[0]).to.have.property("results").that.is.an("array");
|
|
469
|
+
expect(resultsAfterClearCache[0].results.length).to.equal(9);
|
|
470
|
+
assert(resultsAfterClearCache[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
|
|
471
|
+
expect(resultsAfterClearCache[1]).to.have.property("passed").that.equals(true);
|
|
472
|
+
expect(resultsAfterClearCache[1]).to.have.property("results").that.is.an("array").that.is.empty;
|
|
473
|
+
expect(resultsAfterClearCache[2]).to.have.property("passed").that.equals(false);
|
|
474
|
+
expect(resultsAfterClearCache[2].results).to.have.lengthOf(1);
|
|
475
|
+
expect(resultsAfterClearCache[2].results[0]).to.deep.include({
|
|
476
|
+
sno: 1,
|
|
477
|
+
id: relationshipId,
|
|
478
|
+
relationship: "BisCore:ElementRefersToElements",
|
|
479
|
+
property: "TargetECInstanceId",
|
|
480
|
+
keyId: element2Id,
|
|
481
|
+
primaryClass: "BisCore:Element",
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
it("should report corrupt foreignKey Ids on an iModel with unsaved changes", async () => {
|
|
485
|
+
// Insert two elements
|
|
486
|
+
iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
487
|
+
await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });
|
|
488
|
+
const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([
|
|
489
|
+
txn.insertElement({
|
|
490
|
+
classFullName: Subject.classFullName,
|
|
491
|
+
model: IModel.repositoryModelId,
|
|
492
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
493
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject1"),
|
|
494
|
+
}),
|
|
495
|
+
txn.insertElement({
|
|
496
|
+
classFullName: Subject.classFullName,
|
|
497
|
+
model: IModel.repositoryModelId,
|
|
498
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
499
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject2"),
|
|
500
|
+
}),
|
|
501
|
+
]));
|
|
502
|
+
// Create a relationship between them
|
|
503
|
+
await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });
|
|
504
|
+
const relationship = iModel.relationships.createInstance({
|
|
505
|
+
classFullName: "BisCore:SubjectRefersToSubject",
|
|
506
|
+
sourceId: element1Id,
|
|
507
|
+
targetId: element2Id,
|
|
508
|
+
});
|
|
509
|
+
const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));
|
|
510
|
+
assert.isTrue(Id64.isValidId64(relationshipId));
|
|
511
|
+
// Delete one element without deleting the relationship to corrupt the iModel - don't save it
|
|
512
|
+
const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);
|
|
513
|
+
expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);
|
|
514
|
+
// Run integrity check specifically for linktable foreign key Ids
|
|
515
|
+
const results = await iModel.integrityCheck({
|
|
516
|
+
quickCheck: true,
|
|
517
|
+
specificChecks: {
|
|
518
|
+
checkLinktableForeignKeyClassIds: true,
|
|
519
|
+
checkLinktableForeignKeyIds: true,
|
|
520
|
+
},
|
|
521
|
+
});
|
|
522
|
+
await iModel.discardChanges();
|
|
523
|
+
// Verify that the checkLinktableForeignKeyIds check reports the corruption
|
|
524
|
+
expect(results).to.have.lengthOf(3);
|
|
525
|
+
expect(results[0]).to.have.property("check").that.equals("Quick Check");
|
|
526
|
+
expect(results[0]).to.have.property("passed").that.equals(false);
|
|
527
|
+
expect(results[0]).to.have.property("results").that.is.an("array");
|
|
528
|
+
expect(results[0].results.length).to.equal(9);
|
|
529
|
+
assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
|
|
530
|
+
expect(results[1]).to.have.property("passed").that.equals(true);
|
|
531
|
+
expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
|
|
532
|
+
expect(results[2]).to.have.property("passed").that.equals(false);
|
|
533
|
+
expect(results[2].results).to.have.lengthOf(1);
|
|
534
|
+
expect(results[2].results[0]).to.deep.include({
|
|
535
|
+
sno: 1,
|
|
536
|
+
id: relationshipId,
|
|
537
|
+
relationship: "BisCore:ElementRefersToElements",
|
|
538
|
+
property: "TargetECInstanceId",
|
|
539
|
+
keyId: element2Id,
|
|
540
|
+
primaryClass: "BisCore:Element",
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
it("should report corrupt source-side foreignKey Ids", async () => {
|
|
544
|
+
iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
545
|
+
await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });
|
|
546
|
+
const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([
|
|
547
|
+
txn.insertElement({
|
|
548
|
+
classFullName: Subject.classFullName,
|
|
549
|
+
model: IModel.repositoryModelId,
|
|
550
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
551
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject1"),
|
|
552
|
+
}),
|
|
553
|
+
txn.insertElement({
|
|
554
|
+
classFullName: Subject.classFullName,
|
|
555
|
+
model: IModel.repositoryModelId,
|
|
556
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
557
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject2"),
|
|
558
|
+
}),
|
|
559
|
+
]));
|
|
560
|
+
await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });
|
|
561
|
+
const relationship = iModel.relationships.createInstance({
|
|
562
|
+
classFullName: "BisCore:SubjectRefersToSubject",
|
|
563
|
+
sourceId: element1Id,
|
|
564
|
+
targetId: element2Id,
|
|
565
|
+
});
|
|
566
|
+
const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));
|
|
567
|
+
assert.isTrue(Id64.isValidId64(relationshipId));
|
|
568
|
+
// Delete the SOURCE element to create a source-side FK orphan
|
|
569
|
+
withEditTxn(iModel, () => {
|
|
570
|
+
const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element1Id}`);
|
|
571
|
+
expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);
|
|
572
|
+
});
|
|
573
|
+
const results = await iModel.integrityCheck({
|
|
574
|
+
quickCheck: true,
|
|
575
|
+
specificChecks: {
|
|
576
|
+
checkLinktableForeignKeyIds: true,
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
// Quick Check + specific Check Link Table Foreign Key Ids
|
|
580
|
+
expect(results).to.have.lengthOf(2);
|
|
581
|
+
expect(results[0]).to.have.property("check").that.equals("Quick Check");
|
|
582
|
+
expect(results[0]).to.have.property("passed").that.equals(false);
|
|
583
|
+
// Specific check should find the source-side orphan
|
|
584
|
+
expect(results[1]).to.have.property("check").that.equals("Check Link Table Foreign Key Ids");
|
|
585
|
+
expect(results[1]).to.have.property("passed").that.equals(false);
|
|
586
|
+
expect(results[1].results).to.have.length.greaterThanOrEqual(1);
|
|
587
|
+
expect(results[1].results[0]).to.deep.include({
|
|
588
|
+
id: relationshipId,
|
|
589
|
+
relationship: "BisCore:ElementRefersToElements",
|
|
590
|
+
property: "SourceECInstanceId",
|
|
591
|
+
keyId: element1Id,
|
|
383
592
|
primaryClass: "BisCore:Element",
|
|
384
593
|
});
|
|
385
594
|
});
|
|
@@ -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 */\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 as any);\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 as any);\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(\"ChangesetReaderTest\", 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 call integrityCheck on an iModel with corrupt foreignKey Ids and return results\", 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, \"Quickcheck 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: \"0x20000000001\",\n relationship: \"BisCore:ElementRefersToElements\",\n property: \"TargetECInstanceId\",\n keyId: \"0x20000000002\",\n primaryClass: \"BisCore:Element\",\n });\n });\n\n});\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQliteChangesetReaderAndChangesetECAdaptor.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.ts"],"names":[],"mappings":""}
|