@itwin/core-backend 5.0.0-dev.97 → 5.0.0-dev.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/BackendHubAccess.d.ts +2 -8
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/CheckpointManager.d.ts +8 -15
- package/lib/cjs/CheckpointManager.d.ts.map +1 -1
- package/lib/cjs/CheckpointManager.js +23 -54
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/Element.d.ts +16 -4
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +40 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/HubMock.d.ts +1 -1
- package/lib/cjs/HubMock.d.ts.map +1 -1
- package/lib/cjs/HubMock.js +13 -2
- package/lib/cjs/HubMock.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +4 -2
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +2 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +3 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +11 -22
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +2 -8
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/CheckpointManager.d.ts +8 -15
- package/lib/esm/CheckpointManager.d.ts.map +1 -1
- package/lib/esm/CheckpointManager.js +22 -52
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/Element.d.ts +16 -4
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +40 -2
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/HubMock.d.ts +1 -1
- package/lib/esm/HubMock.d.ts.map +1 -1
- package/lib/esm/HubMock.js +13 -2
- package/lib/esm/HubMock.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +4 -2
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/internal/Symbols.d.ts +2 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +2 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js +13 -24
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/test/CloudSqliteMock.d.ts +37 -0
- package/lib/esm/test/CloudSqliteMock.d.ts.map +1 -0
- package/lib/esm/test/CloudSqliteMock.js +117 -0
- package/lib/esm/test/CloudSqliteMock.js.map +1 -0
- package/lib/esm/test/IModelTestUtils.d.ts +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +6 -4
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js +3 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +18 -7
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js +5 -91
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +0 -4
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.d.ts +2 -0
- package/lib/esm/test/standalone/Drawing.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/Drawing.test.js +120 -0
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -0
- package/lib/esm/test/standalone/IModelWrite.test.js +15 -6
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js +4 -3
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/package.json +12 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\nimport {\n IModel,\n SubCategoryAppearance\n} from \"@itwin/core-common\";\nimport * as chai from \"chai\";\nimport { assert } from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { HubWrappers, KnownTestLocations } from \"..\";\nimport {\n BriefcaseDb,\n ChannelControl,\n DictionaryModel,\n IModelHost,\n SpatialCategory,\n SqliteChangesetReader\n} from \"../../core-backend\";\nimport { HubMock } from \"../../HubMock\";\nimport { RebaseChangesetConflictArgs, TxnArgs } from \"../../internal/ChangesetConflictArgs\";\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\nchai.use(chaiAsPromised);\nimport * as sinon from \"sinon\";\n\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\n try {\n await test();\n } catch (e) {\n if (e instanceof Error && msg) {\n assert.equal(e.message, msg);\n }\n return;\n }\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\n}\n\n\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\n await b.locks.acquireLocks({ exclusive: el1 });\n const props = b.elements.getElement(el1);\n props.federationGuid = federationGuid;\n b.elements.updateElement(props.toJSON());\n}\n\ndescribe(\"Change merge method\", () => {\n const ctx = {\n accessTokens: {\n user1: \"\",\n user2: \"\",\n user3: \"\",\n },\n iModelId: \"\",\n iTwinId: \"\",\n modelId: \"\",\n spatialCategoryId: \"\",\n iModelName: \"TestIModel\",\n rootSubject: \"TestSubject\",\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n return b;\n },\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\n }\n\n async function insertPhysicalObject(b: BriefcaseDb,) {\n await b.locks.acquireLocks({ shared: ctx.modelId });\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\n }\n\n before(async () => {\n await IModelHost.startup();\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\n });\n\n after(async () => {\n HubMock.shutdown()\n //await IModelHost.shutdown();\n });\n\n beforeEach(async () => {\n ctx.iTwinId = HubMock.iTwinId;\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\n assert.isNotEmpty(ctx.iModelId);\n const b1 = await ctx.openB1();\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\n b1,\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\n true);\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n ctx.spatialCategoryId = SpatialCategory.insert(\n dictionary.iModel,\n dictionary.id,\n newCategoryCode.value,\n new SubCategoryAppearance({ color: 0xff0000 }),\n );\n b1.saveChanges();\n await b1.pushChanges({ description: \"\" });\n b1.close();\n });\n\n afterEach(async () => {\n sinon.restore();\n });\n\n it(\"rebase events (noFastForward:true)\", async () => {\n /**\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\n */\n const events = new Map<number, { args: TxnArgs, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\n\n const b1 = await ctx.openB1();\n events.set(b1.briefcaseId, []);\n b1.txns.onRebaseTxnBegin.addListener((args) => {\n\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b1.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n const b2 = await ctx.openB2();\n events.set(b2.briefcaseId, []);\n b2.txns.onRebaseTxnBegin.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b2.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n\n const e1 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e1}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\n assert.isDefined(b1.elements.getElement(e1));\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n const e2 = await insertPhysicalObject(b1);\n b1.saveChanges();\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e2));\n\n const e3 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e3}]`);\n const e4 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e4}]`);\n\n events.set(b2.briefcaseId, []);\n // fast-forward\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.descr, \"inserted physical object [id=0x40000000001]\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.descr, \"inserted physical object [id=0x40000000002]\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\n\n\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n\n const e5 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e5}]`);\n const e6 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e6}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.descr, \"inserted physical object [id=0x30000000003]\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.descr, \"inserted physical object [id=0x30000000004]\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\n\n\n assert.isDefined(b1.elements.getElement(e1));\n assert.isDefined(b1.elements.getElement(e2));\n assert.isDefined(b1.elements.getElement(e3)); // Not found\n assert.isDefined(b1.elements.getElement(e4));\n assert.isDefined(b1.elements.getElement(e5));\n assert.isDefined(b1.elements.getElement(e6));\n\n events.set(b2.briefcaseId, []);\n await b2.pullChanges();\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n assert.isDefined(b2.elements.getElement(e5));\n assert.isDefined(b2.elements.getElement(e6));\n\n await updatePhysicalObject(b1, e3, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e3}]`);\n await updatePhysicalObject(b1, e4, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e4}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n await updatePhysicalObject(b2, e1, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e1}]`);\n await updatePhysicalObject(b2, e2, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e2}]`);\n await updatePhysicalObject(b2, e5, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e5}]`);\n await updatePhysicalObject(b2, e6, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e6}]`);\n events.set(b2.briefcaseId, []);\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.descr, \"update physical object [id=0x30000000001]\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.descr, \"update physical object [id=0x30000000002]\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.descr, \"update physical object [id=0x30000000003]\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.descr, \"update physical object [id=0x30000000004]\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\n\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\n\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\n\n b1.close();\n b2.close();\n });\n it(\"rebase events (noFastForward:false/default)\", async () => {\n /**\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\n * In this test we will test rebase events when noFastForward is set to false. Which mean rebase is not required to merge changes.\n */\n const events = new Map<number, { args: TxnArgs, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\n\n const b1 = await ctx.openB1();\n events.set(b1.briefcaseId, []);\n b1.txns.onRebaseTxnBegin.addListener((args) => {\n\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b1.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n const b2 = await ctx.openB2();\n events.set(b2.briefcaseId, []);\n b2.txns.onRebaseTxnBegin.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b2.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n\n const e1 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e1}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\n assert.isDefined(b1.elements.getElement(e1));\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n const e2 = await insertPhysicalObject(b1);\n b1.saveChanges();\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e2));\n\n const e3 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e3}]`);\n const e4 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e4}]`);\n\n events.set(b2.briefcaseId, []);\n // fast-forward\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n\n const e5 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e5}]`);\n const e6 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e6}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e1));\n assert.isDefined(b1.elements.getElement(e2));\n assert.isDefined(b1.elements.getElement(e3)); // Not found\n assert.isDefined(b1.elements.getElement(e4));\n assert.isDefined(b1.elements.getElement(e5));\n assert.isDefined(b1.elements.getElement(e6));\n\n events.set(b2.briefcaseId, []);\n await b2.pullChanges();\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n assert.isDefined(b2.elements.getElement(e5));\n assert.isDefined(b2.elements.getElement(e6));\n\n await updatePhysicalObject(b1, e3, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e3}]`);\n await updatePhysicalObject(b1, e4, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e4}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n await updatePhysicalObject(b2, e1, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e1}]`);\n await updatePhysicalObject(b2, e2, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e2}]`);\n await updatePhysicalObject(b2, e5, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e5}]`);\n await updatePhysicalObject(b2, e6, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e6}]`);\n events.set(b2.briefcaseId, []);\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\n\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\n\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\n\n b1.close();\n b2.close();\n });\n it(\"rebase with be_props (insert conflict)\", async () => {\n const b1 = await ctx.openB1();\n const b2 = await ctx.openB2();\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\n b2.saveChanges(\"test2\");\n\n await assertThrowsAsync(\n async () => b2.pushChanges({ description: \"test2\" }),\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\n\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\n\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\n\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\n b2.abandonChanges();\n\n // set handler to resolve conflict\n b2.txns.changeMergeManager.addConflictHandler({\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\n if (args.cause === \"Conflict\") {\n if (args.tableName === \"be_Prop\") {\n if (args.opcode === \"Inserted\") {\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\n chai.expect(args.txn.type).to.be.equal(\"Data\");\n const localChangedVal = args.getValueText(5, \"New\");\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\n return DbConflictResolution.Skip; // skip incomming value and continue\n }\n }\n }\n return undefined;\n }\n });\n\n // resume rebase see if it resolve the conflict\n b2.txns.changeMergeManager.resume();\n\n // use changeset api to read txn directly\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\n chai.expect(reader.step()).to.be.true;\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\n // note the operation changed from insert to update\n chai.expect(reader.op).to.be.equal(\"Updated\");\n // note this old value is from master branch after changeset was recomputed\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\n // note this new value is from local branch after merger.\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\n reader.close();\n\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n\n\n\n await b2.pushChanges({ description: \"test2\" });\n await b1.pullChanges();\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n\n b1.close();\n b2.close();\n });\n\n it(\"rebase with be_props (data conflict) \", async () => {\n const b1 = await ctx.openB1();\n const b2 = await ctx.openB2();\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n await b2.pullChanges();\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\n b2.saveChanges(\"test2\");\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n // set handler to resolve conflict\n b2.txns.changeMergeManager.addConflictHandler({\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\n if (args.cause === \"Data\") {\n if (args.tableName === \"be_Prop\") {\n if (args.opcode === \"Updated\") {\n const localChangedVal = args.getValueText(5, \"New\");\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\n return DbConflictResolution.Skip; // skip incomming value and continue\n }\n }\n }\n return undefined;\n }\n });\n\n await b2.pushChanges({ description: \"test\" });\n await b2.pullChanges();\n await b1.pullChanges();\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\n\n b1.close();\n b2.close();\n });\n});\n\n"]}
|
|
1
|
+
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\nimport {\n IModel,\n SubCategoryAppearance\n} from \"@itwin/core-common\";\nimport * as chai from \"chai\";\nimport { assert } from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { HubWrappers, KnownTestLocations } from \"..\";\nimport {\n BriefcaseDb,\n ChannelControl,\n DictionaryModel,\n IModelHost,\n SpatialCategory,\n SqliteChangesetReader\n} from \"../../core-backend\";\nimport { HubMock } from \"../../HubMock\";\nimport { RebaseChangesetConflictArgs, TxnArgs } from \"../../internal/ChangesetConflictArgs\";\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\nchai.use(chaiAsPromised);\n\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\n try {\n await test();\n } catch (e) {\n if (e instanceof Error && msg) {\n assert.equal(e.message, msg);\n }\n return;\n }\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\n}\n\n\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\n await b.locks.acquireLocks({ exclusive: el1 });\n const props = b.elements.getElement(el1);\n props.federationGuid = federationGuid;\n b.elements.updateElement(props.toJSON());\n}\n\ndescribe(\"Change merge method\", () => {\n const ctx = {\n accessTokens: {\n user1: \"\",\n user2: \"\",\n user3: \"\",\n },\n iModelId: \"\",\n iTwinId: \"\",\n modelId: \"\",\n spatialCategoryId: \"\",\n iModelName: \"TestIModel\",\n rootSubject: \"TestSubject\",\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n return b;\n },\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\n }\n\n async function insertPhysicalObject(b: BriefcaseDb,) {\n await b.locks.acquireLocks({ shared: ctx.modelId });\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\n }\n\n before(async () => {\n await IModelHost.startup();\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\n });\n\n after(async () => {\n HubMock.shutdown()\n //await IModelHost.shutdown();\n });\n\n beforeEach(async () => {\n ctx.iTwinId = HubMock.iTwinId;\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\n assert.isNotEmpty(ctx.iModelId);\n const b1 = await ctx.openB1();\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\n b1,\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\n true);\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n ctx.spatialCategoryId = SpatialCategory.insert(\n dictionary.iModel,\n dictionary.id,\n newCategoryCode.value,\n new SubCategoryAppearance({ color: 0xff0000 }),\n );\n b1.saveChanges();\n await b1.pushChanges({ description: \"\" });\n b1.close();\n });\n\n it(\"rebase events (noFastForward:true)\", async () => {\n /**\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\n */\n const events = new Map<number, { args: TxnArgs, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\n\n const b1 = await ctx.openB1();\n events.set(b1.briefcaseId, []);\n b1.txns.onRebaseTxnBegin.addListener((args) => {\n\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b1.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n const b2 = await ctx.openB2();\n events.set(b2.briefcaseId, []);\n b2.txns.onRebaseTxnBegin.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b2.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n\n const e1 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e1}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\n assert.isDefined(b1.elements.getElement(e1));\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n const e2 = await insertPhysicalObject(b1);\n b1.saveChanges();\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e2));\n\n const e3 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e3}]`);\n const e4 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e4}]`);\n\n events.set(b2.briefcaseId, []);\n // fast-forward\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.descr, \"inserted physical object [id=0x40000000001]\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.descr, \"inserted physical object [id=0x40000000002]\");\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\n\n\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n\n const e5 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e5}]`);\n const e6 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e6}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.descr, \"inserted physical object [id=0x30000000003]\");\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.descr, \"inserted physical object [id=0x30000000004]\");\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\n\n\n assert.isDefined(b1.elements.getElement(e1));\n assert.isDefined(b1.elements.getElement(e2));\n assert.isDefined(b1.elements.getElement(e3)); // Not found\n assert.isDefined(b1.elements.getElement(e4));\n assert.isDefined(b1.elements.getElement(e5));\n assert.isDefined(b1.elements.getElement(e6));\n\n events.set(b2.briefcaseId, []);\n await b2.pullChanges();\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n assert.isDefined(b2.elements.getElement(e5));\n assert.isDefined(b2.elements.getElement(e6));\n\n await updatePhysicalObject(b1, e3, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e3}]`);\n await updatePhysicalObject(b1, e4, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e4}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n await updatePhysicalObject(b2, e1, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e1}]`);\n await updatePhysicalObject(b2, e2, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e2}]`);\n await updatePhysicalObject(b2, e5, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e5}]`);\n await updatePhysicalObject(b2, e6, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e6}]`);\n events.set(b2.briefcaseId, []);\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.descr, \"update physical object [id=0x30000000001]\");\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.descr, \"update physical object [id=0x30000000002]\");\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.descr, \"update physical object [id=0x30000000003]\");\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\n\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.descr, \"update physical object [id=0x30000000004]\");\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\n\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\n\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\n\n b1.close();\n b2.close();\n });\n it(\"rebase events (noFastForward:false/default)\", async () => {\n /**\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\n * In this test we will test rebase events when noFastForward is set to false. Which mean rebase is not required to merge changes.\n */\n const events = new Map<number, { args: TxnArgs, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\n\n const b1 = await ctx.openB1();\n events.set(b1.briefcaseId, []);\n b1.txns.onRebaseTxnBegin.addListener((args) => {\n\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b1.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n const b2 = await ctx.openB2();\n events.set(b2.briefcaseId, []);\n b2.txns.onRebaseTxnBegin.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\n });\n b2.txns.onRebaseTxnEnd.addListener((args) => {\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\n });\n\n\n const e1 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e1}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\n assert.isDefined(b1.elements.getElement(e1));\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n const e2 = await insertPhysicalObject(b1);\n b1.saveChanges();\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e2));\n\n const e3 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e3}]`);\n const e4 = await insertPhysicalObject(b2);\n b2.saveChanges(`inserted physical object [id=${e4}]`);\n\n events.set(b2.briefcaseId, []);\n // fast-forward\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n\n const e5 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e5}]`);\n const e6 = await insertPhysicalObject(b1);\n b1.saveChanges(`inserted physical object [id=${e6}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n assert.isDefined(b1.elements.getElement(e1));\n assert.isDefined(b1.elements.getElement(e2));\n assert.isDefined(b1.elements.getElement(e3)); // Not found\n assert.isDefined(b1.elements.getElement(e4));\n assert.isDefined(b1.elements.getElement(e5));\n assert.isDefined(b1.elements.getElement(e6));\n\n events.set(b2.briefcaseId, []);\n await b2.pullChanges();\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\n assert.isDefined(b2.elements.getElement(e1));\n assert.isDefined(b2.elements.getElement(e2));\n assert.isDefined(b2.elements.getElement(e3));\n assert.isDefined(b2.elements.getElement(e4));\n assert.isDefined(b2.elements.getElement(e5));\n assert.isDefined(b2.elements.getElement(e6));\n\n await updatePhysicalObject(b1, e3, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e3}]`);\n await updatePhysicalObject(b1, e4, Guid.createValue());\n b1.saveChanges(`update physical object [id=${e4}]`);\n events.set(b1.briefcaseId, []);\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\n\n await updatePhysicalObject(b2, e1, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e1}]`);\n await updatePhysicalObject(b2, e2, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e2}]`);\n await updatePhysicalObject(b2, e5, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e5}]`);\n await updatePhysicalObject(b2, e6, Guid.createValue());\n b2.saveChanges(`update physical object [id=${e6}]`);\n events.set(b2.briefcaseId, []);\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\n\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\n\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\n\n b1.close();\n b2.close();\n });\n it(\"rebase with be_props (insert conflict)\", async () => {\n const b1 = await ctx.openB1();\n const b2 = await ctx.openB2();\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\n b2.saveChanges(\"test2\");\n\n await assertThrowsAsync(\n async () => b2.pushChanges({ description: \"test2\" }),\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\n\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\n\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\n\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\n b2.abandonChanges();\n\n // set handler to resolve conflict\n b2.txns.changeMergeManager.addConflictHandler({\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\n if (args.cause === \"Conflict\") {\n if (args.tableName === \"be_Prop\") {\n if (args.opcode === \"Inserted\") {\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\n chai.expect(args.txn.type).to.be.equal(\"Data\");\n const localChangedVal = args.getValueText(5, \"New\");\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\n return DbConflictResolution.Skip; // skip incomming value and continue\n }\n }\n }\n return undefined;\n }\n });\n\n // resume rebase see if it resolve the conflict\n b2.txns.changeMergeManager.resume();\n\n // use changeset api to read txn directly\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\n chai.expect(reader.step()).to.be.true;\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\n // note the operation changed from insert to update\n chai.expect(reader.op).to.be.equal(\"Updated\");\n // note this old value is from master branch after changeset was recomputed\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\n // note this new value is from local branch after merger.\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\n reader.close();\n\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n\n\n\n await b2.pushChanges({ description: \"test2\" });\n await b1.pullChanges();\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\n\n b1.close();\n b2.close();\n });\n\n it(\"rebase with be_props (data conflict) \", async () => {\n const b1 = await ctx.openB1();\n const b2 = await ctx.openB2();\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n await b2.pullChanges();\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\n b2.saveChanges(\"test2\");\n\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\n b1.saveChanges(\"test\");\n await b1.pushChanges({ description: \"test\" });\n\n // set handler to resolve conflict\n b2.txns.changeMergeManager.addConflictHandler({\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\n if (args.cause === \"Data\") {\n if (args.tableName === \"be_Prop\") {\n if (args.opcode === \"Updated\") {\n const localChangedVal = args.getValueText(5, \"New\");\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\n return DbConflictResolution.Skip; // skip incomming value and continue\n }\n }\n }\n return undefined;\n }\n });\n\n await b2.pushChanges({ description: \"test\" });\n await b2.pullChanges();\n await b1.pullChanges();\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\n\n b1.close();\n b2.close();\n });\n});\n\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawing.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/Drawing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { expect } from "chai";
|
|
6
|
+
import { Guid } from "@itwin/core-bentley";
|
|
7
|
+
import { Drawing } from "../../Element";
|
|
8
|
+
import { DocumentListModel } from "../../Model";
|
|
9
|
+
import { SnapshotDb } from "../../IModelDb";
|
|
10
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
11
|
+
describe("Drawing", () => {
|
|
12
|
+
let imodel;
|
|
13
|
+
let documentListModelId;
|
|
14
|
+
before(() => {
|
|
15
|
+
const iModelPath = IModelTestUtils.prepareOutputFile("Drawing", "Drawing.bim");
|
|
16
|
+
imodel = SnapshotDb.createEmpty(iModelPath, { rootSubject: { name: "DrawingTest" } });
|
|
17
|
+
documentListModelId = DocumentListModel.insert(imodel, SnapshotDb.rootSubjectId, "DocumentList");
|
|
18
|
+
});
|
|
19
|
+
after(() => {
|
|
20
|
+
imodel.close();
|
|
21
|
+
});
|
|
22
|
+
class TestDrawing extends Drawing {
|
|
23
|
+
constructor(props) {
|
|
24
|
+
super(props, imodel);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
describe("scaleFactor", () => {
|
|
28
|
+
function makeDrawingProps(scaleFactor) {
|
|
29
|
+
const props = {
|
|
30
|
+
classFullName: Drawing.classFullName,
|
|
31
|
+
model: documentListModelId,
|
|
32
|
+
code: Drawing.createCode(imodel, documentListModelId, Guid.createValue()),
|
|
33
|
+
};
|
|
34
|
+
if (undefined !== scaleFactor) {
|
|
35
|
+
props.scaleFactor = scaleFactor;
|
|
36
|
+
}
|
|
37
|
+
return props;
|
|
38
|
+
}
|
|
39
|
+
function makeDrawing(scaleFactor) {
|
|
40
|
+
return new TestDrawing(makeDrawingProps(scaleFactor));
|
|
41
|
+
}
|
|
42
|
+
function expectScaleFactor(scaleFactor, expected) {
|
|
43
|
+
const drawing = makeDrawing(scaleFactor);
|
|
44
|
+
expect(drawing.scaleFactor).to.equal(expected);
|
|
45
|
+
}
|
|
46
|
+
it("defaults to 1", () => {
|
|
47
|
+
expectScaleFactor(undefined, 1);
|
|
48
|
+
expectScaleFactor(null, 1);
|
|
49
|
+
expectScaleFactor(0, 1);
|
|
50
|
+
expectScaleFactor(-123, 1);
|
|
51
|
+
expectScaleFactor(false, 1);
|
|
52
|
+
expectScaleFactor(true, 1);
|
|
53
|
+
expectScaleFactor("", 1);
|
|
54
|
+
expectScaleFactor("abcdef", 1);
|
|
55
|
+
});
|
|
56
|
+
it("throws when attempting to set to zero or negative value", () => {
|
|
57
|
+
const drawing = makeDrawing(undefined);
|
|
58
|
+
expect(drawing.scaleFactor).to.equal(1);
|
|
59
|
+
expect(() => drawing.scaleFactor = 0).to.throw("Drawing.scaleFactor must be greater than zero");
|
|
60
|
+
expect(drawing.scaleFactor).to.equal(1);
|
|
61
|
+
expect(() => drawing.scaleFactor = -123).to.throw("Drawing.scaleFactor must be greater than zero");
|
|
62
|
+
expect(drawing.scaleFactor).to.equal(1);
|
|
63
|
+
});
|
|
64
|
+
it("is included in JSON IFF not equal to 1", () => {
|
|
65
|
+
function expectFactor(scaleFactor, expected) {
|
|
66
|
+
const drawing = makeDrawing(scaleFactor);
|
|
67
|
+
expect(drawing.scaleFactor === 1).to.equal(expected === undefined);
|
|
68
|
+
const props = drawing.toJSON();
|
|
69
|
+
expect(props.scaleFactor).to.equal(expected);
|
|
70
|
+
}
|
|
71
|
+
expectFactor(undefined, undefined);
|
|
72
|
+
expectFactor(null, undefined);
|
|
73
|
+
expectFactor(0, undefined);
|
|
74
|
+
expectFactor(1, undefined);
|
|
75
|
+
expectFactor(-123, undefined);
|
|
76
|
+
expectFactor(false, undefined);
|
|
77
|
+
expectFactor(true, undefined);
|
|
78
|
+
expectFactor("", undefined);
|
|
79
|
+
expectFactor("abcdef", undefined);
|
|
80
|
+
expectFactor(2, 2);
|
|
81
|
+
expectFactor(123, 123);
|
|
82
|
+
expectFactor(0.05, 0.05);
|
|
83
|
+
});
|
|
84
|
+
it("is preserved when round-tripped through persistence layer", () => {
|
|
85
|
+
function test(scaleFactor) {
|
|
86
|
+
const insertProps = makeDrawingProps(scaleFactor);
|
|
87
|
+
expect(insertProps.scaleFactor).to.equal(scaleFactor);
|
|
88
|
+
const elemId = imodel.elements.insertElement(insertProps);
|
|
89
|
+
const readProps = imodel.elements.getElementProps(elemId);
|
|
90
|
+
expect(readProps.scaleFactor).to.equal(scaleFactor);
|
|
91
|
+
}
|
|
92
|
+
test(undefined);
|
|
93
|
+
test(1);
|
|
94
|
+
test(2);
|
|
95
|
+
test(123);
|
|
96
|
+
test(0.05);
|
|
97
|
+
test(0);
|
|
98
|
+
test(-123);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("insert", () => {
|
|
102
|
+
function insertDrawing(scaleFactor) {
|
|
103
|
+
const drawingId = Drawing.insert(imodel, documentListModelId, Guid.createValue(), scaleFactor);
|
|
104
|
+
return imodel.elements.getElement(drawingId);
|
|
105
|
+
}
|
|
106
|
+
it("throws if scaleFactor is not positive", () => {
|
|
107
|
+
expect(() => insertDrawing(0)).to.throw("Drawing.scaleFactor must be greater than zero");
|
|
108
|
+
expect(() => insertDrawing(-123)).to.throw("Drawing.scaleFactor must be greater than zero");
|
|
109
|
+
});
|
|
110
|
+
it("defaults scaleFactor to 1", () => {
|
|
111
|
+
expect(insertDrawing(undefined).scaleFactor).to.equal(1);
|
|
112
|
+
});
|
|
113
|
+
it("preserves scaleFactor", () => {
|
|
114
|
+
expect(insertDrawing(2).scaleFactor).to.equal(2);
|
|
115
|
+
expect(insertDrawing(123).scaleFactor).to.equal(123);
|
|
116
|
+
expect(insertDrawing(0.05).scaleFactor).to.equal(0.05);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=Drawing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawing.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Drawing.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport { DrawingProps } from \"@itwin/core-common\";\nimport { Drawing } from \"../../Element\";\nimport { DocumentListModel } from \"../../Model\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"Drawing\", () => {\n let imodel: SnapshotDb;\n let documentListModelId: string;\n\n before(() => {\n const iModelPath = IModelTestUtils.prepareOutputFile(\"Drawing\", \"Drawing.bim\");\n imodel = SnapshotDb.createEmpty(iModelPath, { rootSubject: { name: \"DrawingTest\" } });\n documentListModelId = DocumentListModel.insert(imodel, SnapshotDb.rootSubjectId, \"DocumentList\");\n });\n\n after(() => {\n imodel.close();\n });\n \n class TestDrawing extends Drawing {\n public constructor(props: DrawingProps) {\n super(props, imodel);\n }\n }\n\n describe(\"scaleFactor\", () => {\n function makeDrawingProps(scaleFactor: any): DrawingProps {\n const props: DrawingProps = {\n classFullName: Drawing.classFullName,\n model: documentListModelId,\n code: Drawing.createCode(imodel, documentListModelId, Guid.createValue()),\n };\n\n if (undefined !== scaleFactor) {\n props.scaleFactor = scaleFactor;\n }\n \n return props;\n }\n\n function makeDrawing(scaleFactor: any): Drawing {\n return new TestDrawing(makeDrawingProps(scaleFactor));\n }\n\n function expectScaleFactor(scaleFactor: any, expected: number): void {\n const drawing = makeDrawing(scaleFactor);\n expect(drawing.scaleFactor).to.equal(expected);\n }\n\n it(\"defaults to 1\", () => {\n expectScaleFactor(undefined, 1);\n expectScaleFactor(null, 1);\n expectScaleFactor(0, 1);\n expectScaleFactor(-123, 1);\n expectScaleFactor(false, 1);\n expectScaleFactor(true, 1);\n expectScaleFactor(\"\", 1);\n expectScaleFactor(\"abcdef\", 1);\n });\n\n it(\"throws when attempting to set to zero or negative value\", () => {\n const drawing = makeDrawing(undefined);\n expect(drawing.scaleFactor).to.equal(1);\n expect(() => drawing.scaleFactor = 0).to.throw(\"Drawing.scaleFactor must be greater than zero\");\n expect(drawing.scaleFactor).to.equal(1);\n expect(() => drawing.scaleFactor = -123).to.throw(\"Drawing.scaleFactor must be greater than zero\");\n expect(drawing.scaleFactor).to.equal(1);\n });\n\n it(\"is included in JSON IFF not equal to 1\", () => {\n function expectFactor(scaleFactor: any, expected: number | undefined): void {\n const drawing = makeDrawing(scaleFactor);\n expect(drawing.scaleFactor === 1).to.equal(expected === undefined);\n const props = drawing.toJSON();\n expect(props.scaleFactor).to.equal(expected);\n }\n\n expectFactor(undefined, undefined);\n expectFactor(null, undefined);\n expectFactor(0, undefined);\n expectFactor(1, undefined);\n expectFactor(-123, undefined);\n expectFactor(false, undefined);\n expectFactor(true, undefined);\n expectFactor(\"\", undefined);\n expectFactor(\"abcdef\", undefined);\n\n expectFactor(2, 2);\n expectFactor(123, 123);\n expectFactor(0.05, 0.05);\n });\n\n it(\"is preserved when round-tripped through persistence layer\", () => {\n function test(scaleFactor: number | undefined): void {\n const insertProps = makeDrawingProps(scaleFactor);\n expect(insertProps.scaleFactor).to.equal(scaleFactor);\n const elemId = imodel.elements.insertElement(insertProps);\n const readProps = imodel.elements.getElementProps<DrawingProps>(elemId);\n expect(readProps.scaleFactor).to.equal(scaleFactor);\n }\n\n test(undefined);\n test(1);\n test(2);\n test(123);\n test(0.05);\n test(0);\n test(-123);\n });\n });\n\n describe(\"insert\", () => {\n function insertDrawing(scaleFactor: number | undefined): Drawing {\n const drawingId = Drawing.insert(imodel, documentListModelId, Guid.createValue(), scaleFactor);\n return imodel.elements.getElement<Drawing>(drawingId);\n }\n\n it(\"throws if scaleFactor is not positive\", () => {\n expect(() => insertDrawing(0)).to.throw(\"Drawing.scaleFactor must be greater than zero\");\n expect(() => insertDrawing(-123)).to.throw(\"Drawing.scaleFactor must be greater than zero\");\n });\n\n it(\"defaults scaleFactor to 1\", () => {\n expect(insertDrawing(undefined).scaleFactor).to.equal(1);\n });\n\n it(\"preserves scaleFactor\", () => {\n expect(insertDrawing(2).scaleFactor).to.equal(2);\n expect(insertDrawing(123).scaleFactor).to.equal(123);\n expect(insertDrawing(0.05).scaleFactor).to.equal(0.05);\n });\n });\n});\n"]}
|
|
@@ -86,7 +86,7 @@ describe("IModelWriteTest", () => {
|
|
|
86
86
|
fsWatcher.callback = fn;
|
|
87
87
|
return fsWatcher;
|
|
88
88
|
};
|
|
89
|
-
sinon.stub(fs, "watch").callsFake(watchStub);
|
|
89
|
+
const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
|
|
90
90
|
const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
|
|
91
91
|
bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
92
92
|
const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
|
|
@@ -103,7 +103,10 @@ describe("IModelWriteTest", () => {
|
|
|
103
103
|
roBC.close();
|
|
104
104
|
expect(nClosed).equal(1);
|
|
105
105
|
bc.close();
|
|
106
|
-
|
|
106
|
+
// NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
|
|
107
|
+
// call sinon.restore() here. This is because sinon.restore() will restore the stubs for
|
|
108
|
+
// CloudSqlite that HubMock.startup() put in place.
|
|
109
|
+
watchStubResult.restore();
|
|
107
110
|
});
|
|
108
111
|
function expectEqualChangesets(a, b) {
|
|
109
112
|
expect(a.id).to.equal(b.id);
|
|
@@ -126,7 +129,7 @@ describe("IModelWriteTest", () => {
|
|
|
126
129
|
fsWatcher.callback = fn;
|
|
127
130
|
return fsWatcher;
|
|
128
131
|
};
|
|
129
|
-
sinon.stub(fs, "watch").callsFake(watchStub);
|
|
132
|
+
const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
|
|
130
133
|
const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
|
|
131
134
|
bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
132
135
|
const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
|
|
@@ -159,7 +162,10 @@ describe("IModelWriteTest", () => {
|
|
|
159
162
|
roBC.close();
|
|
160
163
|
expect(nClosed).equal(1);
|
|
161
164
|
bc.close();
|
|
162
|
-
|
|
165
|
+
// NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
|
|
166
|
+
// call sinon.restore() here. This is because sinon.restore() will restore the stubs for
|
|
167
|
+
// CloudSqlite that HubMock.startup() put in place.
|
|
168
|
+
watchStubResult.restore();
|
|
163
169
|
});
|
|
164
170
|
it("WatchForChanges - pull", async () => {
|
|
165
171
|
const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);
|
|
@@ -192,7 +198,7 @@ describe("IModelWriteTest", () => {
|
|
|
192
198
|
fsWatcher.callback = fn;
|
|
193
199
|
return fsWatcher;
|
|
194
200
|
};
|
|
195
|
-
sinon.stub(fs, "watch").callsFake(watchStub);
|
|
201
|
+
const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
|
|
196
202
|
const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
|
|
197
203
|
bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
198
204
|
const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
|
|
@@ -214,7 +220,10 @@ describe("IModelWriteTest", () => {
|
|
|
214
220
|
roBC.close();
|
|
215
221
|
expect(nClosed).equal(1);
|
|
216
222
|
bc.close();
|
|
217
|
-
|
|
223
|
+
// NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
|
|
224
|
+
// call sinon.restore() here. This is because sinon.restore() will restore the stubs for
|
|
225
|
+
// CloudSqlite that HubMock.startup() put in place.
|
|
226
|
+
watchStubResult.restore();
|
|
218
227
|
});
|
|
219
228
|
it("should handle undo/redo", async () => {
|
|
220
229
|
const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);
|