@itwin/core-backend 5.13.0-dev.8 → 5.14.0-dev.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.
Files changed (235) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/lib/cjs/Category.d.ts +4 -4
  3. package/lib/cjs/Category.js.map +1 -1
  4. package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
  5. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  6. package/lib/cjs/ChangesetECAdaptor.js +13 -3
  7. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  8. package/lib/cjs/CodeSpecs.d.ts +3 -3
  9. package/lib/cjs/CodeSpecs.js.map +1 -1
  10. package/lib/cjs/DisplayStyle.d.ts +2 -2
  11. package/lib/cjs/DisplayStyle.js.map +1 -1
  12. package/lib/cjs/EditTxn.d.ts.map +1 -1
  13. package/lib/cjs/EditTxn.js +1 -0
  14. package/lib/cjs/EditTxn.js.map +1 -1
  15. package/lib/cjs/Element.d.ts +48 -12
  16. package/lib/cjs/Element.d.ts.map +1 -1
  17. package/lib/cjs/Element.js +120 -24
  18. package/lib/cjs/Element.js.map +1 -1
  19. package/lib/cjs/IModelDb.d.ts +30 -15
  20. package/lib/cjs/IModelDb.d.ts.map +1 -1
  21. package/lib/cjs/IModelDb.js +51 -15
  22. package/lib/cjs/IModelDb.js.map +1 -1
  23. package/lib/cjs/Model.d.ts +5 -5
  24. package/lib/cjs/Model.d.ts.map +1 -1
  25. package/lib/cjs/Model.js.map +1 -1
  26. package/lib/cjs/PropertyStore.js +1 -1
  27. package/lib/cjs/PropertyStore.js.map +1 -1
  28. package/lib/cjs/SchemaSync.d.ts +37 -9
  29. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  30. package/lib/cjs/SchemaSync.js +125 -6
  31. package/lib/cjs/SchemaSync.js.map +1 -1
  32. package/lib/cjs/SynchronousChannel.d.ts +62 -0
  33. package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
  34. package/lib/cjs/SynchronousChannel.js +11 -0
  35. package/lib/cjs/SynchronousChannel.js.map +1 -0
  36. package/lib/cjs/Texture.d.ts +1 -1
  37. package/lib/cjs/Texture.js.map +1 -1
  38. package/lib/cjs/TxnManager.d.ts +44 -4
  39. package/lib/cjs/TxnManager.d.ts.map +1 -1
  40. package/lib/cjs/TxnManager.js +72 -14
  41. package/lib/cjs/TxnManager.js.map +1 -1
  42. package/lib/cjs/ViewDefinition.d.ts +6 -6
  43. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  44. package/lib/cjs/ViewDefinition.js.map +1 -1
  45. package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
  46. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  47. package/lib/cjs/annotations/LeaderGeometry.js +104 -36
  48. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  49. package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
  50. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  51. package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
  52. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  53. package/lib/cjs/core-backend.d.ts +1 -0
  54. package/lib/cjs/core-backend.d.ts.map +1 -1
  55. package/lib/cjs/core-backend.js +1 -0
  56. package/lib/cjs/core-backend.js.map +1 -1
  57. package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
  58. package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
  59. package/lib/cjs/internal/IntegrityCheck.js +13 -0
  60. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  61. package/lib/cjs/internal/NoReservations.d.ts +6 -0
  62. package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
  63. package/lib/cjs/internal/NoReservations.js +21 -0
  64. package/lib/cjs/internal/NoReservations.js.map +1 -0
  65. package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
  66. package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
  67. package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
  68. package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
  69. package/lib/cjs/internal/Symbols.d.ts +1 -0
  70. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  71. package/lib/cjs/internal/Symbols.js +2 -1
  72. package/lib/cjs/internal/Symbols.js.map +1 -1
  73. package/lib/esm/Category.d.ts +4 -4
  74. package/lib/esm/Category.js.map +1 -1
  75. package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
  76. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  77. package/lib/esm/ChangesetECAdaptor.js +13 -3
  78. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  79. package/lib/esm/CodeSpecs.d.ts +3 -3
  80. package/lib/esm/CodeSpecs.js.map +1 -1
  81. package/lib/esm/DisplayStyle.d.ts +2 -2
  82. package/lib/esm/DisplayStyle.js.map +1 -1
  83. package/lib/esm/EditTxn.d.ts.map +1 -1
  84. package/lib/esm/EditTxn.js +1 -0
  85. package/lib/esm/EditTxn.js.map +1 -1
  86. package/lib/esm/Element.d.ts +48 -12
  87. package/lib/esm/Element.d.ts.map +1 -1
  88. package/lib/esm/Element.js +121 -25
  89. package/lib/esm/Element.js.map +1 -1
  90. package/lib/esm/IModelDb.d.ts +30 -15
  91. package/lib/esm/IModelDb.d.ts.map +1 -1
  92. package/lib/esm/IModelDb.js +52 -16
  93. package/lib/esm/IModelDb.js.map +1 -1
  94. package/lib/esm/Model.d.ts +5 -5
  95. package/lib/esm/Model.d.ts.map +1 -1
  96. package/lib/esm/Model.js.map +1 -1
  97. package/lib/esm/PropertyStore.js +1 -1
  98. package/lib/esm/PropertyStore.js.map +1 -1
  99. package/lib/esm/SchemaSync.d.ts +37 -9
  100. package/lib/esm/SchemaSync.d.ts.map +1 -1
  101. package/lib/esm/SchemaSync.js +127 -8
  102. package/lib/esm/SchemaSync.js.map +1 -1
  103. package/lib/esm/SynchronousChannel.d.ts +62 -0
  104. package/lib/esm/SynchronousChannel.d.ts.map +1 -0
  105. package/lib/esm/SynchronousChannel.js +9 -0
  106. package/lib/esm/SynchronousChannel.js.map +1 -0
  107. package/lib/esm/Texture.d.ts +1 -1
  108. package/lib/esm/Texture.js.map +1 -1
  109. package/lib/esm/TxnManager.d.ts +44 -4
  110. package/lib/esm/TxnManager.d.ts.map +1 -1
  111. package/lib/esm/TxnManager.js +72 -14
  112. package/lib/esm/TxnManager.js.map +1 -1
  113. package/lib/esm/ViewDefinition.d.ts +6 -6
  114. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  115. package/lib/esm/ViewDefinition.js.map +1 -1
  116. package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
  117. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  118. package/lib/esm/annotations/LeaderGeometry.js +104 -36
  119. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  120. package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
  121. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  122. package/lib/esm/annotations/TextAnnotationElement.js +25 -10
  123. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  124. package/lib/esm/core-backend.d.ts +1 -0
  125. package/lib/esm/core-backend.d.ts.map +1 -1
  126. package/lib/esm/core-backend.js +1 -0
  127. package/lib/esm/core-backend.js.map +1 -1
  128. package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
  129. package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
  130. package/lib/esm/internal/IntegrityCheck.js +13 -0
  131. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  132. package/lib/esm/internal/NoReservations.d.ts +6 -0
  133. package/lib/esm/internal/NoReservations.d.ts.map +1 -0
  134. package/lib/esm/internal/NoReservations.js +18 -0
  135. package/lib/esm/internal/NoReservations.js.map +1 -0
  136. package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
  137. package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
  138. package/lib/esm/internal/SchemaSyncReservations.js +115 -0
  139. package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
  140. package/lib/esm/internal/Symbols.d.ts +1 -0
  141. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  142. package/lib/esm/internal/Symbols.js +1 -0
  143. package/lib/esm/internal/Symbols.js.map +1 -1
  144. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  145. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  146. package/lib/esm/test/IModelTestUtils.js +8 -3
  147. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  148. package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
  149. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  150. package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
  151. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  152. package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
  153. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  154. package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
  155. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  156. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
  157. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  158. package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
  159. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  160. package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
  161. package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
  162. package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
  163. package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
  164. package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
  165. package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
  166. package/lib/esm/test/imodel/IModelElements.test.js +969 -0
  167. package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
  168. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
  169. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
  170. package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
  171. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
  172. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
  173. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
  174. package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
  175. package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
  176. package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
  177. package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
  178. package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
  179. package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
  180. package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
  181. package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
  182. package/lib/esm/test/imodel/IModelModels.test.js +357 -0
  183. package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
  184. package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
  185. package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
  186. package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
  187. package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
  188. package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
  189. package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
  190. package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
  191. package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
  192. package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
  193. package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
  194. package/lib/esm/test/imodel/IModelViews.test.js +199 -0
  195. package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
  196. package/lib/esm/test/index.d.ts +0 -1
  197. package/lib/esm/test/index.d.ts.map +1 -1
  198. package/lib/esm/test/index.js +0 -1
  199. package/lib/esm/test/index.js.map +1 -1
  200. package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
  201. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  202. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
  203. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
  204. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
  205. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
  206. package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
  207. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  208. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  209. package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
  210. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  211. package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
  212. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  213. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
  214. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  215. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
  216. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
  217. package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
  218. package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
  219. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
  220. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
  221. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
  222. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
  223. package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
  224. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  225. package/lib/esm/test/standalone/TxnManager.test.js +108 -8
  226. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  227. package/package.json +13 -16
  228. package/lib/esm/test/RevisionUtility.d.ts +0 -33
  229. package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
  230. package/lib/esm/test/RevisionUtility.js +0 -52
  231. package/lib/esm/test/RevisionUtility.js.map +0 -1
  232. package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
  233. package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
  234. package/lib/esm/test/imodel/IModel.test.js +0 -3277
  235. package/lib/esm/test/imodel/IModel.test.js.map +0 -1
@@ -30,6 +30,7 @@ describe("Integrity Check Tests", () => {
30
30
  expect(getIntegrityCheckName("checkDataSchema")).to.equal("Check Data Schema");
31
31
  expect(getIntegrityCheckName("checkSchemaLoad")).to.equal("Check Schema Load");
32
32
  expect(getIntegrityCheckName("checkMissingChildRows")).to.equal("Check Missing Child Rows");
33
+ expect(getIntegrityCheckName("checkDivergedPropMaps")).to.equal("Check Diverged Property Maps");
33
34
  });
34
35
  it("should return the correct name when sqlCommand string is passed", () => {
35
36
  expect(getIntegrityCheckName("check_data_columns")).to.equal("Check Data Columns");
@@ -42,6 +43,7 @@ describe("Integrity Check Tests", () => {
42
43
  expect(getIntegrityCheckName("check_data_schema")).to.equal("Check Data Schema");
43
44
  expect(getIntegrityCheckName("check_schema_load")).to.equal("Check Schema Load");
44
45
  expect(getIntegrityCheckName("check_missing_child_rows")).to.equal("Check Missing Child Rows");
46
+ expect(getIntegrityCheckName("check_diverged_prop_maps")).to.equal("Check Diverged Property Maps");
45
47
  });
46
48
  it("should return the input string if check type is not found", () => {
47
49
  expect(getIntegrityCheckName("unknownCheck")).to.equal("unknownCheck");
@@ -214,6 +216,20 @@ describe("Integrity Check Tests", () => {
214
216
  expect(results).to.have.lengthOf(1);
215
217
  expect(results[0]).to.deep.equal({ sno: 1, class: "Element", id: "1", classId: "2", missingRowInTables: "ElementTable" });
216
218
  });
219
+ it("should return CheckDivergedPropMapsResultRow for checkDivergedPropMaps", async () => {
220
+ const mockResults = [
221
+ { sno: 1, derivedClassId: "1", derivedClassName: "Element", baseClassId: "2", baseClassName: "BaseElement", propertyName: "testProperty", baseColumn: "base_column", divergedColumn: "diverged_column" },
222
+ ];
223
+ const asyncIterator = async function* () {
224
+ for (const result of mockResults) {
225
+ yield result;
226
+ }
227
+ };
228
+ iModelStub.createQueryReader.returns(asyncIterator());
229
+ const results = await performSpecificIntegrityCheck(iModelStub, "checkDivergedPropMaps");
230
+ expect(results).to.have.lengthOf(1);
231
+ expect(results[0]).to.deep.equal({ sno: 1, derivedClassId: "1", derivedClassName: "Element", baseClassId: "2", baseClassName: "BaseElement", propertyName: "testProperty", baseColumn: "base_column", divergedColumn: "diverged_column" });
232
+ });
217
233
  });
218
234
  });
219
235
  describe("iModelDb integrityCheck Tests", () => {
@@ -242,7 +258,7 @@ describe("iModelDb integrityCheck Tests", () => {
242
258
  expect(results[0]).to.have.property("check").that.equals("Quick Check");
243
259
  expect(results[0]).to.have.property("passed").that.equals(true);
244
260
  expect(results[0]).to.have.property("results").that.is.an("array");
245
- expect(results[0].results.length).to.equal(9);
261
+ expect(results[0].results.length).to.equal(10);
246
262
  assert(results[0].results.every((row) => row.passed === true), "All specific checks should pass");
247
263
  });
248
264
  it("should call integrityCheck with no options selected and default to quick check", async () => {
@@ -250,12 +266,12 @@ describe("iModelDb integrityCheck Tests", () => {
250
266
  expect(results).to.have.lengthOf(1);
251
267
  expect(results[0]).to.have.property("check").that.equals("Quick Check");
252
268
  expect(results[0]).to.have.property("passed").that.equals(true);
253
- expect(results[0].results.length).to.equal(9);
269
+ expect(results[0].results.length).to.equal(10);
254
270
  const results2 = await iModel.integrityCheck({ quickCheck: false });
255
271
  expect(results2).to.have.lengthOf(1);
256
272
  expect(results2[0]).to.have.property("check").that.equals("Quick Check");
257
273
  expect(results2[0]).to.have.property("passed").that.equals(true);
258
- expect(results2[0].results.length).to.equal(9);
274
+ expect(results2[0].results.length).to.equal(10);
259
275
  const results3 = await iModel.integrityCheck({
260
276
  quickCheck: false,
261
277
  specificChecks: {
@@ -269,12 +285,13 @@ describe("iModelDb integrityCheck Tests", () => {
269
285
  checkDataSchema: false,
270
286
  checkSchemaLoad: false,
271
287
  checkMissingChildRows: false,
288
+ checkDivergedPropMaps: false,
272
289
  }
273
290
  });
274
291
  expect(results3).to.have.lengthOf(1);
275
292
  expect(results3[0]).to.have.property("check").that.equals("Quick Check");
276
293
  expect(results3[0]).to.have.property("passed").that.equals(true);
277
- expect(results3[0].results.length).to.equal(9);
294
+ expect(results3[0].results.length).to.equal(10);
278
295
  });
279
296
  it("should throw an error when iModel is closed", async () => {
280
297
  iModel.close();
@@ -299,10 +316,11 @@ describe("iModelDb integrityCheck Tests", () => {
299
316
  checkDataSchema: true,
300
317
  checkSchemaLoad: true,
301
318
  checkMissingChildRows: true,
319
+ checkDivergedPropMaps: true,
302
320
  },
303
321
  });
304
322
  expect(results).to.be.an("array");
305
- expect(results).to.have.lengthOf(10);
323
+ expect(results).to.have.lengthOf(11);
306
324
  // Verify each check is present and has the expected structure
307
325
  const checkNames = results.map((r) => r.check);
308
326
  expect(checkNames).to.include.members([
@@ -316,6 +334,7 @@ describe("iModelDb integrityCheck Tests", () => {
316
334
  "Check Data Schema",
317
335
  "Check Schema Load",
318
336
  "Check Missing Child Rows",
337
+ "Check Diverged Property Maps",
319
338
  ]);
320
339
  // All checks should pass
321
340
  results.forEach((result) => {
@@ -368,7 +387,7 @@ describe("iModelDb integrityCheck Tests", () => {
368
387
  expect(justQuickCheck).to.have.lengthOf(1);
369
388
  expect(justQuickCheck[0]).to.have.property("check").that.equals("Quick Check");
370
389
  expect(justQuickCheck[0]).to.have.property("passed").that.equals(false);
371
- expect(justQuickCheck[0].results.length).to.equal(9);
390
+ expect(justQuickCheck[0].results.length).to.equal(10);
372
391
  const foreignKeyCheck = justQuickCheck[0].results.find((row) => row.check === "Check Link Table Foreign Key Ids");
373
392
  assert.isDefined(foreignKeyCheck, "Check Link Table Foreign Key Ids sub-check should be present in quickCheck results");
374
393
  expect(foreignKeyCheck.passed).to.equal(false, "Check Link Table Foreign Key Ids should report failure");
@@ -377,7 +396,7 @@ describe("iModelDb integrityCheck Tests", () => {
377
396
  expect(results[0]).to.have.property("check").that.equals("Quick Check");
378
397
  expect(results[0]).to.have.property("passed").that.equals(false);
379
398
  expect(results[0]).to.have.property("results").that.is.an("array");
380
- expect(results[0].results.length).to.equal(9);
399
+ expect(results[0].results.length).to.equal(10);
381
400
  assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
382
401
  expect(results[1]).to.have.property("passed").that.equals(true);
383
402
  expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
@@ -437,7 +456,7 @@ describe("iModelDb integrityCheck Tests", () => {
437
456
  expect(results[0]).to.have.property("check").that.equals("Quick Check");
438
457
  expect(results[0]).to.have.property("passed").that.equals(false);
439
458
  expect(results[0]).to.have.property("results").that.is.an("array");
440
- expect(results[0].results.length).to.equal(9);
459
+ expect(results[0].results.length).to.equal(10);
441
460
  assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
442
461
  expect(results[1]).to.have.property("passed").that.equals(true);
443
462
  expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
@@ -466,7 +485,7 @@ describe("iModelDb integrityCheck Tests", () => {
466
485
  expect(resultsAfterClearCache[0]).to.have.property("check").that.equals("Quick Check");
467
486
  expect(resultsAfterClearCache[0]).to.have.property("passed").that.equals(false);
468
487
  expect(resultsAfterClearCache[0]).to.have.property("results").that.is.an("array");
469
- expect(resultsAfterClearCache[0].results.length).to.equal(9);
488
+ expect(resultsAfterClearCache[0].results.length).to.equal(10);
470
489
  assert(resultsAfterClearCache[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
471
490
  expect(resultsAfterClearCache[1]).to.have.property("passed").that.equals(true);
472
491
  expect(resultsAfterClearCache[1]).to.have.property("results").that.is.an("array").that.is.empty;
@@ -525,7 +544,7 @@ describe("iModelDb integrityCheck Tests", () => {
525
544
  expect(results[0]).to.have.property("check").that.equals("Quick Check");
526
545
  expect(results[0]).to.have.property("passed").that.equals(false);
527
546
  expect(results[0]).to.have.property("results").that.is.an("array");
528
- expect(results[0].results.length).to.equal(9);
547
+ expect(results[0].results.length).to.equal(10);
529
548
  assert(results[0].results.findIndex((row) => row.passed === false) !== -1, "Quick check should report failed specific check");
530
549
  expect(results[1]).to.have.property("passed").that.equals(true);
531
550
  expect(results[1]).to.have.property("results").that.is.an("array").that.is.empty;
@@ -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);\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);\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(\"IntegrityCheckTest\", 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 report corrupt foreignKey Ids\", 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 // Run integrity check with default options — quickCheck only, no specific checks\r\n const justQuickCheck = await iModel.integrityCheck();\r\n\r\n expect(justQuickCheck).to.have.lengthOf(1);\r\n expect(justQuickCheck[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(justQuickCheck[0]).to.have.property(\"passed\").that.equals(false);\r\n expect(justQuickCheck[0].results.length).to.equal(9);\r\n const foreignKeyCheck = justQuickCheck[0].results.find((row) => (row as QuickIntegrityCheckResultRow).check === \"Check Link Table Foreign Key Ids\");\r\n assert.isDefined(foreignKeyCheck, \"Check Link Table Foreign Key Ids sub-check should be present in quickCheck results\");\r\n expect((foreignKeyCheck as QuickIntegrityCheckResultRow).passed).to.equal(false, \"Check Link Table Foreign Key Ids should report failure\");\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, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt foreignKey Ids after calling clearCaches\", 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, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n\r\n // Clear caches\r\n iModel.clearCaches();\r\n\r\n // Run integrity check again after clearing cache\r\n const resultsAfterClearCache = 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 still reports the corruption after clearing cache\r\n expect(resultsAfterClearCache).to.have.lengthOf(3);\r\n expect(resultsAfterClearCache[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(resultsAfterClearCache[0]).to.have.property(\"passed\").that.equals(false);\r\n expect(resultsAfterClearCache[0]).to.have.property(\"results\").that.is.an(\"array\");\r\n expect(resultsAfterClearCache[0].results.length).to.equal(9);\r\n assert(resultsAfterClearCache[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\r\n expect(resultsAfterClearCache[1]).to.have.property(\"passed\").that.equals(true);\r\n expect(resultsAfterClearCache[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\r\n expect(resultsAfterClearCache[2]).to.have.property(\"passed\").that.equals(false);\r\n expect(resultsAfterClearCache[2].results).to.have.lengthOf(1);\r\n expect(resultsAfterClearCache[2].results[0]).to.deep.include({\r\n sno: 1,\r\n id: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt foreignKey Ids on an iModel with unsaved changes\", 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 - don't save it\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 // 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 await iModel.discardChanges();\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, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt source-side foreignKey Ids\", async () => {\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 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 the SOURCE element to create a source-side FK orphan\r\n withEditTxn(iModel, () => {\r\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element1Id}`);\r\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\r\n });\r\n\r\n const results = await iModel.integrityCheck({\r\n quickCheck: true,\r\n specificChecks: {\r\n checkLinktableForeignKeyIds: true,\r\n },\r\n });\r\n\r\n // Quick Check + specific Check Link Table Foreign Key Ids\r\n expect(results).to.have.lengthOf(2);\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\r\n // Specific check should find the source-side orphan\r\n expect(results[1]).to.have.property(\"check\").that.equals(\"Check Link Table Foreign Key Ids\");\r\n expect(results[1]).to.have.property(\"passed\").that.equals(false);\r\n expect(results[1].results).to.have.length.greaterThanOrEqual(1);\r\n expect(results[1].results[0]).to.deep.include({\r\n id: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"SourceECInstanceId\",\r\n keyId: element1Id,\r\n primaryClass: \"BisCore:Element\",\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 */\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 expect(getIntegrityCheckName(\"checkDivergedPropMaps\")).to.equal(\"Check Diverged Property Maps\");\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 expect(getIntegrityCheckName(\"check_diverged_prop_maps\")).to.equal(\"Check Diverged Property Maps\");\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);\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);\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 it(\"should return CheckDivergedPropMapsResultRow for checkDivergedPropMaps\", async () => {\r\n const mockResults = [\r\n { sno: 1, derivedClassId: \"1\", derivedClassName: \"Element\", baseClassId: \"2\", baseClassName: \"BaseElement\", propertyName: \"testProperty\", baseColumn: \"base_column\", divergedColumn: \"diverged_column\" },\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, \"checkDivergedPropMaps\");\r\n\r\n expect(results).to.have.lengthOf(1);\r\n expect(results[0]).to.deep.equal({ sno: 1, derivedClassId: \"1\", derivedClassName: \"Element\", baseClassId: \"2\", baseClassName: \"BaseElement\", propertyName: \"testProperty\", baseColumn: \"base_column\", divergedColumn: \"diverged_column\" });\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(\"IntegrityCheckTest\", 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(10);\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(10);\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(10);\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 checkDivergedPropMaps: 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(10);\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 checkDivergedPropMaps: true,\r\n },\r\n });\r\n expect(results).to.be.an(\"array\");\r\n expect(results).to.have.lengthOf(11);\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 \"Check Diverged Property Maps\",\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 report corrupt foreignKey Ids\", 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 // Run integrity check with default options — quickCheck only, no specific checks\r\n const justQuickCheck = await iModel.integrityCheck();\r\n\r\n expect(justQuickCheck).to.have.lengthOf(1);\r\n expect(justQuickCheck[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(justQuickCheck[0]).to.have.property(\"passed\").that.equals(false);\r\n expect(justQuickCheck[0].results.length).to.equal(10);\r\n const foreignKeyCheck = justQuickCheck[0].results.find((row) => (row as QuickIntegrityCheckResultRow).check === \"Check Link Table Foreign Key Ids\");\r\n assert.isDefined(foreignKeyCheck, \"Check Link Table Foreign Key Ids sub-check should be present in quickCheck results\");\r\n expect((foreignKeyCheck as QuickIntegrityCheckResultRow).passed).to.equal(false, \"Check Link Table Foreign Key Ids should report failure\");\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(10);\r\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt foreignKey Ids after calling clearCaches\", 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(10);\r\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n\r\n // Clear caches\r\n iModel.clearCaches();\r\n\r\n // Run integrity check again after clearing cache\r\n const resultsAfterClearCache = 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 still reports the corruption after clearing cache\r\n expect(resultsAfterClearCache).to.have.lengthOf(3);\r\n expect(resultsAfterClearCache[0]).to.have.property(\"check\").that.equals(\"Quick Check\");\r\n expect(resultsAfterClearCache[0]).to.have.property(\"passed\").that.equals(false);\r\n expect(resultsAfterClearCache[0]).to.have.property(\"results\").that.is.an(\"array\");\r\n expect(resultsAfterClearCache[0].results.length).to.equal(10);\r\n assert(resultsAfterClearCache[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check should report failed specific check\");\r\n expect(resultsAfterClearCache[1]).to.have.property(\"passed\").that.equals(true);\r\n expect(resultsAfterClearCache[1]).to.have.property(\"results\").that.is.an(\"array\").that.is.empty;\r\n expect(resultsAfterClearCache[2]).to.have.property(\"passed\").that.equals(false);\r\n expect(resultsAfterClearCache[2].results).to.have.lengthOf(1);\r\n expect(resultsAfterClearCache[2].results[0]).to.deep.include({\r\n sno: 1,\r\n id: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt foreignKey Ids on an iModel with unsaved changes\", 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 - don't save it\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 // 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 await iModel.discardChanges();\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(10);\r\n assert(results[0].results.findIndex((row) => (row as QuickIntegrityCheckResultRow).passed === false) !== -1, \"Quick check 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: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"TargetECInstanceId\",\r\n keyId: element2Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n\r\n it(\"should report corrupt source-side foreignKey Ids\", async () => {\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 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 the SOURCE element to create a source-side FK orphan\r\n withEditTxn(iModel, () => {\r\n const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element1Id}`);\r\n expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);\r\n });\r\n\r\n const results = await iModel.integrityCheck({\r\n quickCheck: true,\r\n specificChecks: {\r\n checkLinktableForeignKeyIds: true,\r\n },\r\n });\r\n\r\n // Quick Check + specific Check Link Table Foreign Key Ids\r\n expect(results).to.have.lengthOf(2);\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\r\n // Specific check should find the source-side orphan\r\n expect(results[1]).to.have.property(\"check\").that.equals(\"Check Link Table Foreign Key Ids\");\r\n expect(results[1]).to.have.property(\"passed\").that.equals(false);\r\n expect(results[1].results).to.have.length.greaterThanOrEqual(1);\r\n expect(results[1].results[0]).to.deep.include({\r\n id: relationshipId,\r\n relationship: \"BisCore:ElementRefersToElements\",\r\n property: \"SourceECInstanceId\",\r\n keyId: element1Id,\r\n primaryClass: \"BisCore:Element\",\r\n });\r\n });\r\n});\r\n"]}
@@ -88,6 +88,29 @@ describe("Sqlite Changeset Reader + ChangesetECAdaptor API", async () => {
88
88
  iTwinId = HubMock.iTwinId;
89
89
  });
90
90
  after(() => HubMock.shutdown());
91
+ it("setValue() rejects prototype chain access strings", async () => {
92
+ const setValue = (targetObj, accessString, value) => ChangesetECAdaptor.setValue(targetObj, accessString, value);
93
+ const pollutedProps = ["polluted", "pollutedNested"];
94
+ try {
95
+ for (const accessString of ["constructor.prototype.polluted", "nested.constructor.prototype.pollutedNested", "prototype.polluted", "__proto__.polluted"]) {
96
+ const target = {};
97
+ expect(() => setValue(target, accessString, "pwned"), accessString).to.throw(/access string cannot contain/);
98
+ expect({}.polluted, accessString).to.be.undefined;
99
+ expect({}.pollutedNested, accessString).to.be.undefined;
100
+ expect(target.nested, accessString).to.be.undefined;
101
+ }
102
+ // Legitimate nested struct access strings must continue to work.
103
+ const out = {};
104
+ setValue(out, "model.id", "0x1");
105
+ setValue(out, "location.origin.x", 10);
106
+ expect(out.model.id).to.equal("0x1");
107
+ expect(out.location.origin.x).to.equal(10);
108
+ }
109
+ finally {
110
+ for (const prop of pollutedProps)
111
+ delete Object.prototype[prop];
112
+ }
113
+ });
91
114
  it("Able to recover from when ExclusiveRootClassId is NULL for overflow table", async () => {
92
115
  /**
93
116
  * 1. Import schema with class that span overflow table.