@itwin/core-backend 5.15.0-dev.1 → 5.15.0-dev.3

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 (46) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/lib/cjs/BriefcaseManager.d.ts +2 -2
  3. package/lib/cjs/BriefcaseManager.js.map +1 -1
  4. package/lib/cjs/ChangesetReaderTypes.d.ts +1 -1
  5. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  6. package/lib/cjs/ECSqlRowExecutor.d.ts +3 -3
  7. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  8. package/lib/cjs/ECSqlRowExecutor.js +2 -2
  9. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  10. package/lib/cjs/ECSqlStatement.d.ts +5 -0
  11. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  12. package/lib/cjs/ECSqlStatement.js +15 -2
  13. package/lib/cjs/ECSqlStatement.js.map +1 -1
  14. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
  15. package/lib/cjs/ECSqlSyncReader.js +2 -2
  16. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  17. package/lib/esm/BriefcaseManager.d.ts +2 -2
  18. package/lib/esm/BriefcaseManager.js.map +1 -1
  19. package/lib/esm/ChangesetReaderTypes.d.ts +1 -1
  20. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  21. package/lib/esm/ECSqlRowExecutor.d.ts +3 -3
  22. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  23. package/lib/esm/ECSqlRowExecutor.js +2 -2
  24. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  25. package/lib/esm/ECSqlStatement.d.ts +5 -0
  26. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  27. package/lib/esm/ECSqlStatement.js +15 -2
  28. package/lib/esm/ECSqlStatement.js.map +1 -1
  29. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
  30. package/lib/esm/ECSqlSyncReader.js +3 -3
  31. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  32. package/lib/esm/test/ecdb/ECSqlQuery.test.js +17 -11
  33. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  34. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +140 -0
  35. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  36. package/lib/esm/test/hubaccess/CodeSwap.test.js +78 -0
  37. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  38. package/lib/esm/test/standalone/ChangesetReader.test.js +5 -5
  39. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  40. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +2 -2
  41. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  42. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts +2 -0
  43. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts.map +1 -0
  44. package/lib/esm/test/standalone/SessionApplyIndirect.test.js +211 -0
  45. package/lib/esm/test/standalone/SessionApplyIndirect.test.js.map +1 -0
  46. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"CodeSwap.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/CodeSwap.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { BriefcaseDb, ChannelControl, DrawingCategory } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Code value management: null, swap, undo/redo, and cross-briefcase pull\", function (this: Suite) {\r\n this.timeout(60000);\r\n\r\n it(\"swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap2\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"set elem1 code to null\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n });\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n\r\n // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---\r\n // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"null elem1 code and swap code values\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final swapped code values after pulling\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull\", async () => {\r\n HubMock.startup(\"CodeDeleteInsertTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeDeleteInsertTest\",\r\n description: \"CodeDeleteInsertTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert an element with a code ---\r\n let elem1Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert element with CODE_A\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert element with CODE_A\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Delete elem1 and insert a new element with the same code ---\r\n let newElemId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"delete elem1 and insert new element with same code\", (txn) => {\r\n txn.deleteElement(elem1Id!);\r\n\r\n const newElemProps: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n newElemId = txn.insertElement(newElemProps);\r\n });\r\n\r\n b1.clearCaches();\r\n\r\n // Verify after delete + insert\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const newElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(newElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse the delete + insert) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(() => b1!.elements.getElementProps(newElemId!)).to.throw();\r\n\r\n // --- Redo (reinstate the delete + insert) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const redoneElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(redoneElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"delete elem1 and insert new element with same code\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final state after pulling\r\n chai.expect(() => b2!.elements.getElementProps(elem1Id!)).to.throw();\r\n const b2NewElem = b2.elements.getElementProps(newElemId!);\r\n chai.expect(b2NewElem.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n it(\"single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true\", async () => {\r\n HubMock.startup(\"CodeSwapNoUpdateLoopTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapNoUpdateLoopTest\",\r\n description: \"CodeSwapNoUpdateLoopTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // --- Single-transaction swap: null elem1, then swap codes ---\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"single-txn swap\", (txn) => {\r\n // Step 1: null out elem1's code to free the uniqueness slot\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n // Step 2: assign CODE_A to elem2, CODE_B to elem1\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n\r\n // Verify b1 has the swapped state\r\n b1.clearCaches();\r\n const b1e1 = b1.elements.getElementProps(elem1Id!);\r\n const b1e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(b1e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b1e2.code.value).to.equal(\"CODE_A\");\r\n\r\n await b1.pushChanges({ description: \"single-txn code swap\" });\r\n\r\n // Pull with noUpdateLoop: true — this uses the old (pre-fix) apply path.\r\n // The unique-index conflict handler skips the intermediate null step,\r\n // so the swap is silently dropped and b2 retains the original codes.\r\n // noUpdateLoop is intentionally not in the public PullChangesArgs type.\r\n type InternalPullArgs = Parameters<BriefcaseDb[\"pullChanges\"]>[0] & { noUpdateLoop?: boolean };\r\n await b2.pullChanges({ noUpdateLoop: true } as InternalPullArgs);\r\n\r\n b2.clearCaches();\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n // Old behaviour: swap did NOT land — b2 still sees the original codes\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_B\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"CodeSwap.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/CodeSwap.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { BriefcaseDb, ChannelControl, DrawingCategory } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Code value management: null, swap, undo/redo, and cross-briefcase pull\", function (this: Suite) {\r\n this.timeout(60000);\r\n\r\n it(\"swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap2\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"set elem1 code to null\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n });\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n\r\n // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---\r\n // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"null elem1 code and swap code values\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final swapped code values after pulling\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull\", async () => {\r\n HubMock.startup(\"CodeDeleteInsertTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeDeleteInsertTest\",\r\n description: \"CodeDeleteInsertTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert an element with a code ---\r\n let elem1Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert element with CODE_A\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert element with CODE_A\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Delete elem1 and insert a new element with the same code ---\r\n let newElemId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"delete elem1 and insert new element with same code\", (txn) => {\r\n txn.deleteElement(elem1Id!);\r\n\r\n const newElemProps: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n newElemId = txn.insertElement(newElemProps);\r\n });\r\n\r\n b1.clearCaches();\r\n\r\n // Verify after delete + insert\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const newElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(newElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse the delete + insert) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(() => b1!.elements.getElementProps(newElemId!)).to.throw();\r\n\r\n // --- Redo (reinstate the delete + insert) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const redoneElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(redoneElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"delete elem1 and insert new element with same code\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final state after pulling\r\n chai.expect(() => b2!.elements.getElementProps(elem1Id!)).to.throw();\r\n const b2NewElem = b2.elements.getElementProps(newElemId!);\r\n chai.expect(b2NewElem.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n // Regression for iTwin/itwinjs-backlog#2435: rebasing a code swap must not cascade-delete derived-class rows.\r\n it(\"preserves both drawing graphics when rebasing a local code swap over an unrelated incoming change\", async () => {\r\n HubMock.startup(\"CodeSwapRebaseCascadeTest\", KnownTestLocations.outputDir);\r\n let far: BriefcaseDb | undefined;\r\n let local: BriefcaseDb | undefined;\r\n\r\n try {\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"far-user\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapRebaseCascadeTest\",\r\n description: \"CodeSwapRebaseCascadeTest\",\r\n });\r\n const source = far = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"far-user\", iTwinId: HubMock.iTwinId, iModelId });\r\n source.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n await source.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n const { drawingModelId, drawingCategoryId, codeSpecId } = withEditTxn(source, \"setup code swap rebase\", (txn) => {\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, IModelTestUtils.getUniqueModelCode(source, \"DrawingModel\"));\r\n const categoryId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n const specId = source.codeSpecs.insert(txn, \"CodeSwapRebaseCascadeCodeSpec\", CodeScopeSpec.Type.Model);\r\n return { drawingModelId: modelId, drawingCategoryId: categoryId, codeSpecId: specId };\r\n });\r\n await source.pushChanges({ description: \"setup\" });\r\n\r\n const target = local = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"local-user\", iTwinId: HubMock.iTwinId, iModelId });\r\n target.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const codeA = new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_A\" });\r\n const codeB = new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_B\" });\r\n\r\n await source.locks.acquireLocks({ shared: drawingModelId });\r\n const { elementA, elementB, unrelatedId } = withEditTxn(source, \"insert code swap elements\", (txn) => {\r\n const props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId,\r\n category: drawingCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n return {\r\n elementA: txn.insertElement({ ...props, code: codeA }),\r\n elementB: txn.insertElement({ ...props, code: codeB }),\r\n unrelatedId: txn.insertElement(props),\r\n };\r\n });\r\n await source.pushChanges({ description: \"insert code swap elements\" });\r\n await target.pullChanges();\r\n\r\n await target.locks.acquireLocks({ exclusive: [elementA, elementB] });\r\n withEditTxn(target, \"local code swap\", (txn) => {\r\n // The session captures only the net swap, discarding this temporary value.\r\n txn.updateElement({ id: elementA, code: new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_TEMP\" }) });\r\n txn.updateElement({ id: elementB, code: codeA });\r\n txn.updateElement({ id: elementA, code: codeB });\r\n });\r\n chai.expect(target.txns.hasPendingTxns).to.be.true;\r\n\r\n // Force a genuine rebase of the local swap, rather than a fast-forward pull.\r\n await source.locks.acquireLocks({ exclusive: unrelatedId });\r\n withEditTxn(source, \"unrelated incoming change\", (txn) => {\r\n txn.updateElement({ id: unrelatedId, userLabel: \"remote update\" });\r\n });\r\n await source.pushChanges({ description: \"unrelated incoming change\" });\r\n\r\n let rebaseCount = 0;\r\n target.txns.rebaser.onRebaseBegin.addListener(() => { ++rebaseCount; });\r\n await target.pullChanges();\r\n chai.expect(rebaseCount).to.equal(1);\r\n chai.expect(target.txns.hasPendingTxns).to.be.true;\r\n target.clearCaches();\r\n\r\n const a = target.elements.getElementProps<GeometricElement2dProps>(elementA);\r\n const b = target.elements.getElementProps<GeometricElement2dProps>(elementB);\r\n chai.expect(a.code).to.deep.equal(codeB.toJSON());\r\n chai.expect(b.code).to.deep.equal(codeA.toJSON());\r\n chai.expect(a.category).to.equal(drawingCategoryId);\r\n chai.expect(b.category).to.equal(drawingCategoryId);\r\n chai.expect(a.model).to.equal(drawingModelId);\r\n chai.expect(b.model).to.equal(drawingModelId);\r\n chai.expect(target.elements.getElementProps(unrelatedId).userLabel).to.equal(\"remote update\");\r\n } finally {\r\n far?.close();\r\n local?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n it(\"single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true\", async () => {\r\n HubMock.startup(\"CodeSwapNoUpdateLoopTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapNoUpdateLoopTest\",\r\n description: \"CodeSwapNoUpdateLoopTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // --- Single-transaction swap: null elem1, then swap codes ---\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"single-txn swap\", (txn) => {\r\n // Step 1: null out elem1's code to free the uniqueness slot\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n // Step 2: assign CODE_A to elem2, CODE_B to elem1\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n\r\n // Verify b1 has the swapped state\r\n b1.clearCaches();\r\n const b1e1 = b1.elements.getElementProps(elem1Id!);\r\n const b1e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(b1e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b1e2.code.value).to.equal(\"CODE_A\");\r\n\r\n await b1.pushChanges({ description: \"single-txn code swap\" });\r\n\r\n // Pull with noUpdateLoop: true — this uses the old (pre-fix) apply path.\r\n // The unique-index conflict handler skips the intermediate null step,\r\n // so the swap is silently dropped and b2 retains the original codes.\r\n // noUpdateLoop is intentionally not in the public PullChangesArgs type.\r\n type InternalPullArgs = Parameters<BriefcaseDb[\"pullChanges\"]>[0] & { noUpdateLoop?: boolean };\r\n await b2.pullChanges({ noUpdateLoop: true } as InternalPullArgs);\r\n\r\n b2.clearCaches();\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n // Old behaviour: swap did NOT land — b2 still sees the original codes\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_B\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n});\r\n"]}
@@ -1854,7 +1854,7 @@ describe("ChangesetReader update-full", () => {
1854
1854
  const elemNew = instances.find((i) => i.ECInstanceId === fullElementId && i.$meta.stage === "New");
1855
1855
  expect(elemNew).to.exist;
1856
1856
  assert.equal(elemNew.ECInstanceId, fullElementId);
1857
- assert.equal(elemNew.ECClassId, "0x176");
1857
+ assert.equal(rwIModel.getClassNameFromId(elemNew.ECClassId), "TestDomain:Test2dElement");
1858
1858
  assert.equal(elemNew.StrProp, "updated");
1859
1859
  assert.equal(elemNew.IntProp, 99);
1860
1860
  assert.equal(elemNew.LongProp, 0);
@@ -1901,7 +1901,7 @@ describe("ChangesetReader update-full", () => {
1901
1901
  const elemOld = instances.find((i) => i.ECInstanceId === fullElementId && i.$meta.stage === "Old");
1902
1902
  expect(elemOld).to.exist;
1903
1903
  assert.equal(elemOld.ECInstanceId, fullElementId);
1904
- assert.equal(elemOld.ECClassId, "0x176");
1904
+ assert.equal(rwIModel.getClassNameFromId(elemOld.ECClassId), "TestDomain:Test2dElement");
1905
1905
  assert.equal(elemOld.StrProp, "hello");
1906
1906
  assert.equal(elemOld.IntProp, 42);
1907
1907
  assert.equal(elemOld.LongProp, 9007199254740991);
@@ -2042,7 +2042,7 @@ describe("ChangesetReader update-full", () => {
2042
2042
  const elemNew = instances.find((i) => i.ECInstanceId === fullElementId && i.$meta.stage === "New");
2043
2043
  expect(elemNew).to.exist;
2044
2044
  assert.equal(elemNew.ECInstanceId, fullElementId);
2045
- assert.equal(elemNew.ECClassId, "0x176");
2045
+ assert.equal(rwIModel.getClassNameFromId(elemNew.ECClassId), "TestDomain:Test2dElement");
2046
2046
  assert.isUndefined(elemNew.StrProp);
2047
2047
  assert.isUndefined(elemNew.Model);
2048
2048
  assert.isUndefined(elemNew.LastMod);
@@ -2061,7 +2061,7 @@ describe("ChangesetReader update-full", () => {
2061
2061
  const elemOld = instances.find((i) => i.ECInstanceId === fullElementId && i.$meta.stage === "Old");
2062
2062
  expect(elemOld).to.exist;
2063
2063
  assert.equal(elemOld.ECInstanceId, fullElementId);
2064
- assert.equal(elemOld.ECClassId, "0x176");
2064
+ assert.equal(rwIModel.getClassNameFromId(elemOld.ECClassId), "TestDomain:Test2dElement");
2065
2065
  assert.isUndefined(elemOld.StrProp);
2066
2066
  assert.isUndefined(elemOld.Model);
2067
2067
  assert.deepEqual(Object.keys(elemOld).sort(), ["ECInstanceId", "ECClassId", "$meta"].sort());
@@ -2153,7 +2153,7 @@ describe("ChangesetReader update-full", () => {
2153
2153
  "StructProp.Y", "StructProp.Z"].sort());
2154
2154
  const elemOld = instances.find((i) => i.ECInstanceId === fullElementId && i.$meta.stage === "Old");
2155
2155
  expect(elemOld).to.exist;
2156
- assert.equal(elemOld.ECClassId, "0x176");
2156
+ assert.equal(rwIModel.getClassNameFromId(elemOld.ECClassId), "TestDomain:Test2dElement");
2157
2157
  assert.equal(elemOld.StrProp, "hello");
2158
2158
  assert.include(String(elemOld.BinProp), "bytes");
2159
2159
  assert.deepEqual(elemOld.$meta.rowOptions, { abbreviateBlobs: true });