@itwin/core-backend 5.11.0-dev.9 → 5.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -1
- package/lib/cjs/BackendHubAccess.d.ts +1 -1
- package/lib/cjs/BackendHubAccess.js +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BlobContainerService.d.ts +14 -1
- package/lib/cjs/BlobContainerService.d.ts.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +3 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +3 -3
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.d.ts +1 -1
- package/lib/cjs/ClassRegistry.js +1 -1
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +1 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +4 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +4 -8
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +4 -4
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +4 -4
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +6 -6
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +4 -4
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +56 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +138 -0
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +1 -1
- package/lib/cjs/Element.js +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +1 -1
- package/lib/cjs/ElementAspect.js +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/Entity.d.ts +1 -1
- package/lib/cjs/Entity.js +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.d.ts +6 -0
- package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +6 -0
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +54 -14
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +32 -14
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +7 -5
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +2 -2
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/NativeHost.js +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +1 -1
- package/lib/cjs/SQLiteDb.js +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/SqliteStatement.d.ts +1 -1
- package/lib/cjs/SqliteStatement.d.ts.map +1 -1
- package/lib/cjs/SqliteStatement.js +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +8 -7
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +4 -9
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +31 -15
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.d.ts +28 -2
- package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +1 -1
- package/lib/esm/BackendHubAccess.js +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BlobContainerService.d.ts +14 -1
- package/lib/esm/BlobContainerService.d.ts.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +3 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +3 -3
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ClassRegistry.d.ts +1 -1
- package/lib/esm/ClassRegistry.js +1 -1
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +1 -1
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js +4 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +4 -8
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.d.ts +4 -4
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +4 -4
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts +6 -6
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +4 -4
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +56 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +140 -2
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +1 -1
- package/lib/esm/Element.js +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +1 -1
- package/lib/esm/ElementAspect.js +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/Entity.d.ts +1 -1
- package/lib/esm/Entity.js +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/GeoCoordConfig.d.ts +6 -0
- package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
- package/lib/esm/GeoCoordConfig.js +6 -0
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +54 -14
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +32 -14
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/esm/IModelElementCloneContext.js +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +7 -5
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +2 -2
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/NativeHost.js +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/SQLiteDb.d.ts +1 -1
- package/lib/esm/SQLiteDb.js +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/SqliteStatement.d.ts +1 -1
- package/lib/esm/SqliteStatement.d.ts.map +1 -1
- package/lib/esm/SqliteStatement.js +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js +8 -7
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/TestUtils.d.ts +18 -3
- package/lib/esm/test/TestUtils.d.ts.map +1 -1
- package/lib/esm/test/TestUtils.js +22 -3
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +81 -16
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +4 -2
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +8 -2
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CodeSwap.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/CodeSwap.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/CodeSwap.test.js +431 -0
- package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -0
- package/lib/esm/test/imodel/IModel.test.js +10 -2
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeElementParentModel.test.d.ts +2 -0
- package/lib/esm/test/standalone/ChangeElementParentModel.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ChangeElementParentModel.test.js +460 -0
- package/lib/esm/test/standalone/ChangeElementParentModel.test.js.map +1 -0
- package/lib/esm/test/standalone/ChangesetReader.test.js +3 -0
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CloudSqlite.test.d.ts +2 -0
- package/lib/esm/test/standalone/CloudSqlite.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/CloudSqlite.test.js +43 -0
- package/lib/esm/test/standalone/CloudSqlite.test.js.map +1 -0
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +2 -33
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.js +118 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js +6 -0
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +2 -2
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.d.ts +4 -9
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +31 -15
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.d.ts +28 -2
- package/lib/esm/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/package.json +15 -15
- package/lib/esm/test/misc/GeoServices.test.d.ts +0 -2
- package/lib/esm/test/misc/GeoServices.test.d.ts.map +0 -1
- package/lib/esm/test/misc/GeoServices.test.js +0 -918
- package/lib/esm/test/misc/GeoServices.test.js.map +0 -1
|
@@ -47,7 +47,7 @@ describe("ITwin Workspace", () => {
|
|
|
47
47
|
delete: async () => { },
|
|
48
48
|
queryScope: async () => ({ iTwinId }),
|
|
49
49
|
queryMetadata: async () => ({ containerType: "settings", label: "settings" }),
|
|
50
|
-
queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: "settings", label: containerId })),
|
|
50
|
+
queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: "settings", label: containerId, iTwinId })),
|
|
51
51
|
updateJson: async () => { },
|
|
52
52
|
requestToken: async ({ containerId }) => ({
|
|
53
53
|
token: "",
|
|
@@ -59,6 +59,42 @@ describe("ITwin Workspace", () => {
|
|
|
59
59
|
}),
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
+
/** Creates a mock service that returns containers from both the child iTwin and its account iTwin. */
|
|
63
|
+
function createAccountSettingsContainerService(childITwinId, accountITwinId, childContainerIds, accountContainerIds) {
|
|
64
|
+
return {
|
|
65
|
+
create: async () => ({ baseUri: "", containerId: childContainerIds[0], provider: "azure" }),
|
|
66
|
+
delete: async () => { },
|
|
67
|
+
queryScope: async () => ({ iTwinId: childITwinId }),
|
|
68
|
+
queryMetadata: async () => ({ containerType: "settings", label: "settings" }),
|
|
69
|
+
queryContainersMetadata: async (_userToken, args) => {
|
|
70
|
+
expect(args.includeParentITwins).to.deep.equal({ filter: "accountOnly" });
|
|
71
|
+
const results = childContainerIds.map((containerId) => ({
|
|
72
|
+
containerId,
|
|
73
|
+
containerType: "settings",
|
|
74
|
+
label: containerId,
|
|
75
|
+
iTwinId: childITwinId,
|
|
76
|
+
accountITwinId,
|
|
77
|
+
}));
|
|
78
|
+
results.push(...accountContainerIds.map((containerId) => ({
|
|
79
|
+
containerId,
|
|
80
|
+
containerType: "settings",
|
|
81
|
+
label: containerId,
|
|
82
|
+
iTwinId: accountITwinId,
|
|
83
|
+
accountITwinId,
|
|
84
|
+
})));
|
|
85
|
+
return results;
|
|
86
|
+
},
|
|
87
|
+
updateJson: async () => { },
|
|
88
|
+
requestToken: async ({ containerId }) => ({
|
|
89
|
+
token: "",
|
|
90
|
+
scope: { iTwinId: childITwinId },
|
|
91
|
+
provider: "azure",
|
|
92
|
+
expiration: new Date(Date.now() + 3600000),
|
|
93
|
+
metadata: { containerType: "settings", label: containerId },
|
|
94
|
+
baseUri: "",
|
|
95
|
+
}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
62
98
|
beforeEach(async () => {
|
|
63
99
|
await TestUtils.shutdownBackend();
|
|
64
100
|
savedBlobContainerService = BlobContainer.service;
|
|
@@ -232,5 +268,86 @@ describe("ITwin Workspace", () => {
|
|
|
232
268
|
await expect(IModelHost.deleteSettingDictionary(iTwinId, "x")).to.be.rejectedWith("delete failed");
|
|
233
269
|
expect(close.calledOnce).to.be.true;
|
|
234
270
|
});
|
|
271
|
+
it("loads account iTwin settings at organization priority", async () => {
|
|
272
|
+
const childITwinId = Guid.createValue();
|
|
273
|
+
const accountITwinId = Guid.createValue();
|
|
274
|
+
createLocalSettingsDb("child-settings", {
|
|
275
|
+
"app/childOnly": "from-child",
|
|
276
|
+
"app/shared": "child-wins",
|
|
277
|
+
});
|
|
278
|
+
createLocalSettingsDb("account-settings", {
|
|
279
|
+
"app/accountOnly": "from-account",
|
|
280
|
+
"app/shared": "account-loses",
|
|
281
|
+
});
|
|
282
|
+
BlobContainer.service = createAccountSettingsContainerService(childITwinId, accountITwinId, ["child-settings"], ["account-settings"]);
|
|
283
|
+
await IModelHost.startup(opts);
|
|
284
|
+
const workspace = await IModelHost.getITwinWorkspace(childITwinId);
|
|
285
|
+
// Child iTwin setting is present.
|
|
286
|
+
expect(workspace.settings.getString("app/childOnly")).to.equal("from-child");
|
|
287
|
+
// Account iTwin setting is present (loaded at organization priority).
|
|
288
|
+
expect(workspace.settings.getString("app/accountOnly")).to.equal("from-account");
|
|
289
|
+
// Child iTwin setting overrides account iTwin setting for the same key.
|
|
290
|
+
expect(workspace.settings.getString("app/shared")).to.equal("child-wins");
|
|
291
|
+
workspace.close();
|
|
292
|
+
});
|
|
293
|
+
it("when the iTwin is its own account iTwin, its container loads at organization priority", async () => {
|
|
294
|
+
// Edge case: the requested iTwin IS the account iTwin (e.g. a root/tenant iTwin with no parent).
|
|
295
|
+
// The service returns one container where iTwinId === accountITwinId === requestedITwinId.
|
|
296
|
+
// getITwinSettingsSources should succeed and assign SettingsPriority.organization because
|
|
297
|
+
// `container.accountITwinId === ownerITwinId` is true.
|
|
298
|
+
const iTwinId = Guid.createValue();
|
|
299
|
+
createLocalSettingsDb("self-account-settings", {
|
|
300
|
+
"app/rootSetting": "root-value",
|
|
301
|
+
});
|
|
302
|
+
// Pass the same id for both child and account — the service returns a single container
|
|
303
|
+
// with iTwinId === accountITwinId === iTwinId.
|
|
304
|
+
BlobContainer.service = createAccountSettingsContainerService(iTwinId, iTwinId, ["self-account-settings"], []);
|
|
305
|
+
await IModelHost.startup(opts);
|
|
306
|
+
const workspace = await IModelHost.getITwinWorkspace(iTwinId);
|
|
307
|
+
try {
|
|
308
|
+
expect(workspace.settings.getString("app/rootSetting")).to.equal("root-value");
|
|
309
|
+
// The container's accountITwinId equals its ownerITwinId, so it loads at organization priority.
|
|
310
|
+
expect(workspace.settings.dictionaries).to.have.lengthOf(1);
|
|
311
|
+
expect(workspace.settings.dictionaries[0].props.priority).to.equal(SettingsPriority.organization);
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
workspace.close();
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
it("fails if multiple settings containers exist for the same account iTwin", async () => {
|
|
318
|
+
const childITwinId = Guid.createValue();
|
|
319
|
+
const accountITwinId = Guid.createValue();
|
|
320
|
+
BlobContainer.service = createAccountSettingsContainerService(childITwinId, accountITwinId, ["child-settings"], ["account-a", "account-b"]);
|
|
321
|
+
await IModelHost.startup(opts);
|
|
322
|
+
await expect(IModelHost.getITwinWorkspace(childITwinId)).to.be.rejectedWith("Multiple iTwin settings containers were found");
|
|
323
|
+
});
|
|
324
|
+
it("throws missing-container-itwinid if the service returns a container without an iTwinId", async () => {
|
|
325
|
+
// Simulates an older BlobContainer service version that does not populate iTwinId
|
|
326
|
+
// in queryContainersMetadata results. getITwinSettingsSources requires iTwinId to
|
|
327
|
+
// decide which SettingsPriority to assign each container, so it must throw.
|
|
328
|
+
const iTwinId = Guid.createValue();
|
|
329
|
+
const service = {
|
|
330
|
+
create: async () => ({ baseUri: "", containerId: "no-itwinid-container", provider: "azure" }),
|
|
331
|
+
delete: async () => { },
|
|
332
|
+
queryScope: async () => ({ iTwinId }),
|
|
333
|
+
queryMetadata: async () => ({ containerType: "settings", label: "settings" }),
|
|
334
|
+
queryContainersMetadata: async () => [
|
|
335
|
+
// iTwinId intentionally omitted — simulates a service that predates the iTwinId field
|
|
336
|
+
{ containerId: "no-itwinid-container", containerType: "settings", label: "no-itwinid-container" },
|
|
337
|
+
],
|
|
338
|
+
updateJson: async () => { },
|
|
339
|
+
requestToken: async ({ containerId }) => ({
|
|
340
|
+
token: "",
|
|
341
|
+
scope: { iTwinId },
|
|
342
|
+
provider: "azure",
|
|
343
|
+
expiration: new Date(Date.now() + 3600000),
|
|
344
|
+
metadata: { containerType: "settings", label: containerId },
|
|
345
|
+
baseUri: "",
|
|
346
|
+
}),
|
|
347
|
+
};
|
|
348
|
+
BlobContainer.service = service;
|
|
349
|
+
await IModelHost.startup(opts);
|
|
350
|
+
await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith("has no iTwinId");
|
|
351
|
+
});
|
|
235
352
|
});
|
|
236
353
|
//# sourceMappingURL=ITwinWorkspace.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITwinWorkspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ITwinWorkspace.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 { expect } from \"chai\";\nimport * as fs from \"fs-extra\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { NativeLibrary } from \"@bentley/imodeljs-native\";\nimport { DbResult, Guid, OpenMode } from \"@itwin/core-bentley\";\nimport { BlobContainer } from \"../../BlobContainerService\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { setOnlineStatus } from \"../../internal/OnlineStatus\";\nimport { WorkspaceSqliteDb } from \"../../internal/workspace/WorkspaceSqliteDb\";\nimport { SettingsPriority } from \"../../workspace/Settings\";\nimport { settingsWorkspaceDbName } from \"../../workspace/SettingsDb\";\nimport { SettingsEditor, settingsResourceName } from \"../../workspace/SettingsEditor\";\nimport { TestUtils } from \"../TestUtils\";\n\ndescribe(\"ITwin Workspace\", () => {\n const opts = { cacheDir: TestUtils.getCacheDir() };\n let savedBlobContainerService: BlobContainer.ContainerService | undefined;\n\n function getITwinWorkspaceDir(containerId: string): string {\n return path.join(opts.cacheDir ?? NativeLibrary.defaultCacheDir, \"Workspace\", containerId);\n }\n\n function writeSettingsDb(dbFileName: string, settings: Record<string, unknown>, workspaceName: string): void {\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName } });\n\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, settingsResourceName);\n stmt.bindString(2, JSON.stringify(settings));\n const rc = stmt.step();\n expect(rc).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n }\n\n function createLocalSettingsDb(containerId: string, settings: Record<string, unknown>): void {\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n writeSettingsDb(dbFileName, settings, `${containerId} settings`);\n }\n\n function createSettingsContainerService(iTwinId: string, containerIds: string[]): BlobContainer.ContainerService {\n return {\n create: async () => ({ baseUri: \"\", containerId: containerIds[0], provider: \"azure\" as const }),\n delete: async () => { },\n queryScope: async () => ({ iTwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"settings\" }),\n queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: \"settings\", label: containerId })),\n updateJson: async () => { },\n requestToken: async ({ containerId }) => ({\n token: \"\",\n scope: { iTwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n }),\n };\n }\n\n beforeEach(async () => {\n await TestUtils.shutdownBackend();\n savedBlobContainerService = BlobContainer.service;\n setOnlineStatus(true);\n });\n\n afterEach(() => {\n BlobContainer.service = savedBlobContainerService;\n setOnlineStatus(true);\n sinon.restore();\n });\n\n after(async () => {\n await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost\n });\n\n it(\"loads iTwin workspaces from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n createLocalSettingsDb(\"itwin-settings-a\", {\n \"app/testA\": \"value-a\",\n \"app/testB\": \"value-b\",\n });\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\"]);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"returns an empty iTwin workspace if no root settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, []);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.dictionaries.length).to.equal(0);\n expect(workspace.settings.getString(\"app/testA\")).to.be.undefined;\n workspace.close();\n });\n\n it(\"fails if multiple iTwin settings containers exist for the same iTwin\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\", \"itwin-settings-b\"]);\n\n await IModelHost.startup(opts);\n\n await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith(\"Multiple iTwin settings containers were found\");\n });\n\n it(\"loads iTwin workspace from container props without network calls\", async () => {\n const containerId = \"itwin-settings-offline\";\n createLocalSettingsDb(containerId, { \"app/testA\": \"value-a\" });\n\n const unexpectedNetworkCall = sinon.stub().rejects(new Error(\"unexpected network call\"));\n const queryContainersMetadata = sinon.stub().resolves([]);\n const requestToken = sinon.stub().resolves({\n token: \"\",\n scope: { iTwinId: Guid.createValue() },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n });\n\n const networkService: BlobContainer.ContainerService = {\n create: unexpectedNetworkCall,\n delete: unexpectedNetworkCall,\n queryScope: unexpectedNetworkCall,\n queryMetadata: unexpectedNetworkCall,\n queryContainersMetadata,\n updateJson: unexpectedNetworkCall,\n requestToken,\n };\n BlobContainer.service = networkService;\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace({\n baseUri: \"\",\n containerId,\n storageType: \"azure\",\n priority: SettingsPriority.iTwin,\n dbName: settingsWorkspaceDbName,\n includePrerelease: true,\n });\n\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(queryContainersMetadata.called).to.be.false;\n expect(requestToken.called).to.be.false;\n workspace.close();\n });\n\n it(\"getITwinWorkspace loads all named dictionaries from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n const containerId = \"itwin-settings-multi\";\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n\n // Create a local SettingsDb with two named dictionary resources\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName: \"multi-dict settings\" } });\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-a\");\n stmt.bindString(2, JSON.stringify({ \"app/testA\": \"value-a\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-b\");\n stmt.bindString(2, JSON.stringify({ \"app/testB\": \"value-b\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n\n BlobContainer.service = createSettingsContainerService(iTwinId, [containerId]);\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"saveSettingDictionary saves a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const updateSettingsResource = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ updateSettingsResource });\n });\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.saveSettingDictionary(iTwinId, \"myDict\", { \"app/value\": 1, \"app/name\": \"test\" });\n\n expect(constructStub.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(updateSettingsResource.calledOnce).to.be.true;\n expect(updateSettingsResource.firstCall.args[0]).to.deep.equal({ \"app/value\": 1, \"app/name\": \"test\" });\n expect(updateSettingsResource.firstCall.args[1]).to.equal(\"myDict\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary is a no-op when no iTwin settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves(undefined);\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\");\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(constructStub.called).to.be.false;\n });\n\n it(\"deleteSettingDictionary removes a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const removeString = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ removeString });\n });\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(removeString.calledOnceWithExactly(\"myDict\")).to.be.true;\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"saveSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"write failed\")) } as any,\n });\n\n await expect(IModelHost.saveSettingDictionary(iTwinId, \"x\", {})).to.be.rejectedWith(\"write failed\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"delete failed\")) } as any,\n });\n\n await expect(IModelHost.deleteSettingDictionary(iTwinId, \"x\")).to.be.rejectedWith(\"delete failed\");\n expect(close.calledOnce).to.be.true;\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ITwinWorkspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ITwinWorkspace.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 { expect } from \"chai\";\nimport * as fs from \"fs-extra\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { NativeLibrary } from \"@bentley/imodeljs-native\";\nimport { DbResult, Guid, OpenMode } from \"@itwin/core-bentley\";\nimport { BlobContainer } from \"../../BlobContainerService\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { setOnlineStatus } from \"../../internal/OnlineStatus\";\nimport { WorkspaceSqliteDb } from \"../../internal/workspace/WorkspaceSqliteDb\";\nimport { SettingsPriority } from \"../../workspace/Settings\";\nimport { settingsWorkspaceDbName } from \"../../workspace/SettingsDb\";\nimport { SettingsEditor, settingsResourceName } from \"../../workspace/SettingsEditor\";\nimport { TestUtils } from \"../TestUtils\";\n\ndescribe(\"ITwin Workspace\", () => {\n const opts = { cacheDir: TestUtils.getCacheDir() };\n let savedBlobContainerService: BlobContainer.ContainerService | undefined;\n\n function getITwinWorkspaceDir(containerId: string): string {\n return path.join(opts.cacheDir ?? NativeLibrary.defaultCacheDir, \"Workspace\", containerId);\n }\n\n function writeSettingsDb(dbFileName: string, settings: Record<string, unknown>, workspaceName: string): void {\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName } });\n\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, settingsResourceName);\n stmt.bindString(2, JSON.stringify(settings));\n const rc = stmt.step();\n expect(rc).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n }\n\n function createLocalSettingsDb(containerId: string, settings: Record<string, unknown>): void {\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n writeSettingsDb(dbFileName, settings, `${containerId} settings`);\n }\n\n function createSettingsContainerService(iTwinId: string, containerIds: string[]): BlobContainer.ContainerService {\n return {\n create: async () => ({ baseUri: \"\", containerId: containerIds[0], provider: \"azure\" as const }),\n delete: async () => { },\n queryScope: async () => ({ iTwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"settings\" }),\n queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: \"settings\", label: containerId, iTwinId })),\n updateJson: async () => { },\n requestToken: async ({ containerId }) => ({\n token: \"\",\n scope: { iTwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n }),\n };\n }\n\n /** Creates a mock service that returns containers from both the child iTwin and its account iTwin. */\n function createAccountSettingsContainerService(\n childITwinId: string,\n accountITwinId: string,\n childContainerIds: string[],\n accountContainerIds: string[],\n ): BlobContainer.ContainerService {\n return {\n create: async () => ({ baseUri: \"\", containerId: childContainerIds[0], provider: \"azure\" as const }),\n delete: async () => { },\n queryScope: async () => ({ iTwinId: childITwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"settings\" }),\n queryContainersMetadata: async (_userToken, args): Promise<BlobContainer.MetadataResponse[]> => {\n expect(args.includeParentITwins).to.deep.equal({ filter: \"accountOnly\" });\n const results: BlobContainer.MetadataResponse[] = childContainerIds.map((containerId) => ({\n containerId,\n containerType: \"settings\",\n label: containerId,\n iTwinId: childITwinId,\n accountITwinId,\n }));\n results.push(...accountContainerIds.map((containerId) => ({\n containerId,\n containerType: \"settings\",\n label: containerId,\n iTwinId: accountITwinId,\n accountITwinId,\n })));\n return results;\n },\n updateJson: async () => { },\n requestToken: async ({ containerId }) => ({\n token: \"\",\n scope: { iTwinId: childITwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n }),\n };\n }\n\n beforeEach(async () => {\n await TestUtils.shutdownBackend();\n savedBlobContainerService = BlobContainer.service;\n setOnlineStatus(true);\n });\n\n afterEach(() => {\n BlobContainer.service = savedBlobContainerService;\n setOnlineStatus(true);\n sinon.restore();\n });\n\n after(async () => {\n await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost\n });\n\n it(\"loads iTwin workspaces from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n createLocalSettingsDb(\"itwin-settings-a\", {\n \"app/testA\": \"value-a\",\n \"app/testB\": \"value-b\",\n });\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\"]);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"returns an empty iTwin workspace if no root settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, []);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.dictionaries.length).to.equal(0);\n expect(workspace.settings.getString(\"app/testA\")).to.be.undefined;\n workspace.close();\n });\n\n it(\"fails if multiple iTwin settings containers exist for the same iTwin\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\", \"itwin-settings-b\"]);\n\n await IModelHost.startup(opts);\n\n await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith(\"Multiple iTwin settings containers were found\");\n });\n\n it(\"loads iTwin workspace from container props without network calls\", async () => {\n const containerId = \"itwin-settings-offline\";\n createLocalSettingsDb(containerId, { \"app/testA\": \"value-a\" });\n\n const unexpectedNetworkCall = sinon.stub().rejects(new Error(\"unexpected network call\"));\n const queryContainersMetadata = sinon.stub().resolves([]);\n const requestToken = sinon.stub().resolves({\n token: \"\",\n scope: { iTwinId: Guid.createValue() },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n });\n\n const networkService: BlobContainer.ContainerService = {\n create: unexpectedNetworkCall,\n delete: unexpectedNetworkCall,\n queryScope: unexpectedNetworkCall,\n queryMetadata: unexpectedNetworkCall,\n queryContainersMetadata,\n updateJson: unexpectedNetworkCall,\n requestToken,\n };\n BlobContainer.service = networkService;\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace({\n baseUri: \"\",\n containerId,\n storageType: \"azure\",\n priority: SettingsPriority.iTwin,\n dbName: settingsWorkspaceDbName,\n includePrerelease: true,\n });\n\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(queryContainersMetadata.called).to.be.false;\n expect(requestToken.called).to.be.false;\n workspace.close();\n });\n\n it(\"getITwinWorkspace loads all named dictionaries from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n const containerId = \"itwin-settings-multi\";\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n\n // Create a local SettingsDb with two named dictionary resources\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName: \"multi-dict settings\" } });\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-a\");\n stmt.bindString(2, JSON.stringify({ \"app/testA\": \"value-a\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-b\");\n stmt.bindString(2, JSON.stringify({ \"app/testB\": \"value-b\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n\n BlobContainer.service = createSettingsContainerService(iTwinId, [containerId]);\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"saveSettingDictionary saves a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const updateSettingsResource = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ updateSettingsResource });\n });\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.saveSettingDictionary(iTwinId, \"myDict\", { \"app/value\": 1, \"app/name\": \"test\" });\n\n expect(constructStub.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(updateSettingsResource.calledOnce).to.be.true;\n expect(updateSettingsResource.firstCall.args[0]).to.deep.equal({ \"app/value\": 1, \"app/name\": \"test\" });\n expect(updateSettingsResource.firstCall.args[1]).to.equal(\"myDict\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary is a no-op when no iTwin settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves(undefined);\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\");\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(constructStub.called).to.be.false;\n });\n\n it(\"deleteSettingDictionary removes a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const removeString = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ removeString });\n });\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(removeString.calledOnceWithExactly(\"myDict\")).to.be.true;\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"saveSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"write failed\")) } as any,\n });\n\n await expect(IModelHost.saveSettingDictionary(iTwinId, \"x\", {})).to.be.rejectedWith(\"write failed\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"delete failed\")) } as any,\n });\n\n await expect(IModelHost.deleteSettingDictionary(iTwinId, \"x\")).to.be.rejectedWith(\"delete failed\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"loads account iTwin settings at organization priority\", async () => {\n const childITwinId = Guid.createValue();\n const accountITwinId = Guid.createValue();\n\n createLocalSettingsDb(\"child-settings\", {\n \"app/childOnly\": \"from-child\",\n \"app/shared\": \"child-wins\",\n });\n createLocalSettingsDb(\"account-settings\", {\n \"app/accountOnly\": \"from-account\",\n \"app/shared\": \"account-loses\",\n });\n\n BlobContainer.service = createAccountSettingsContainerService(childITwinId, accountITwinId, [\"child-settings\"], [\"account-settings\"]);\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(childITwinId);\n // Child iTwin setting is present.\n expect(workspace.settings.getString(\"app/childOnly\")).to.equal(\"from-child\");\n // Account iTwin setting is present (loaded at organization priority).\n expect(workspace.settings.getString(\"app/accountOnly\")).to.equal(\"from-account\");\n // Child iTwin setting overrides account iTwin setting for the same key.\n expect(workspace.settings.getString(\"app/shared\")).to.equal(\"child-wins\");\n workspace.close();\n });\n\n it(\"when the iTwin is its own account iTwin, its container loads at organization priority\", async () => {\n // Edge case: the requested iTwin IS the account iTwin (e.g. a root/tenant iTwin with no parent).\n // The service returns one container where iTwinId === accountITwinId === requestedITwinId.\n // getITwinSettingsSources should succeed and assign SettingsPriority.organization because\n // `container.accountITwinId === ownerITwinId` is true.\n const iTwinId = Guid.createValue();\n\n createLocalSettingsDb(\"self-account-settings\", {\n \"app/rootSetting\": \"root-value\",\n });\n\n // Pass the same id for both child and account — the service returns a single container\n // with iTwinId === accountITwinId === iTwinId.\n BlobContainer.service = createAccountSettingsContainerService(iTwinId, iTwinId, [\"self-account-settings\"], []);\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n try {\n expect(workspace.settings.getString(\"app/rootSetting\")).to.equal(\"root-value\");\n // The container's accountITwinId equals its ownerITwinId, so it loads at organization priority.\n expect(workspace.settings.dictionaries).to.have.lengthOf(1);\n expect(workspace.settings.dictionaries[0].props.priority).to.equal(SettingsPriority.organization);\n } finally {\n workspace.close();\n }\n });\n\n it(\"fails if multiple settings containers exist for the same account iTwin\", async () => {\n const childITwinId = Guid.createValue();\n const accountITwinId = Guid.createValue();\n\n BlobContainer.service = createAccountSettingsContainerService(childITwinId, accountITwinId, [\"child-settings\"], [\"account-a\", \"account-b\"]);\n await IModelHost.startup(opts);\n\n await expect(IModelHost.getITwinWorkspace(childITwinId)).to.be.rejectedWith(\"Multiple iTwin settings containers were found\");\n });\n\n it(\"throws missing-container-itwinid if the service returns a container without an iTwinId\", async () => {\n // Simulates an older BlobContainer service version that does not populate iTwinId\n // in queryContainersMetadata results. getITwinSettingsSources requires iTwinId to\n // decide which SettingsPriority to assign each container, so it must throw.\n const iTwinId = Guid.createValue();\n\n const service: BlobContainer.ContainerService = {\n create: async () => ({ baseUri: \"\", containerId: \"no-itwinid-container\", provider: \"azure\" as const }),\n delete: async () => { },\n queryScope: async () => ({ iTwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"settings\" }),\n queryContainersMetadata: async () => [\n // iTwinId intentionally omitted — simulates a service that predates the iTwinId field\n { containerId: \"no-itwinid-container\", containerType: \"settings\", label: \"no-itwinid-container\" },\n ],\n updateJson: async () => { },\n requestToken: async ({ containerId }) => ({\n token: \"\",\n scope: { iTwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n }),\n };\n\n BlobContainer.service = service;\n await IModelHost.startup(opts);\n\n await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith(\"has no iTwinId\");\n });\n});\n"]}
|
|
@@ -101,6 +101,12 @@ describe("SettingsSchemas", () => {
|
|
|
101
101
|
expect(nested).to.not.have.property("extends");
|
|
102
102
|
expect(nested?.required).to.have.members(["nestedReq"]);
|
|
103
103
|
expect(nested?.properties).to.include.keys("nestedReq", "nestedBaseOnly", "nestedChildOnly");
|
|
104
|
+
const resolvedPreservingExtends = schemas.getResolvedSettingDef(`${prefix}/thing`, { preserveExtends: true });
|
|
105
|
+
expect(resolvedPreservingExtends.extends).to.equal(`${prefix}/baseThing`);
|
|
106
|
+
expect(resolvedPreservingExtends.properties?.overridden.type).to.equal("number");
|
|
107
|
+
const nestedPreservingExtends = resolvedPreservingExtends.properties?.nested;
|
|
108
|
+
expect(nestedPreservingExtends?.extends).to.equal(`${prefix}/nestedBase`);
|
|
109
|
+
expect(nestedPreservingExtends?.properties).to.include.keys("nestedReq", "nestedBaseOnly", "nestedChildOnly");
|
|
104
110
|
}
|
|
105
111
|
finally {
|
|
106
112
|
schemas.removeGroup(prefix);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SettingsSchemas.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAE/B,2FAA2F;IAC3F,kIAAkI;IAClI,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAS,CAAC,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAEjF,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,YAAY;YAC1B,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,iCAAiC;YAC9C,WAAW,EAAE;gBACX,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7E,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;QACjG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,uBAAuB,CAAC;QACvC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,UAAU,EAAE;wBACV,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC9B,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACnC;iBACF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,SAAS,CAAC;oBACrB,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC5B,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,GAAG,MAAM,aAAa;4BAC/B,UAAU,EAAE;gCACV,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;6BACrC;yBACF;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,YAAY;oBAC9B,QAAQ,EAAE,CAAC,YAAY,CAAC;oBACxB,UAAU,EAAE;wBACV,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC/B;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YACzG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YAC3C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,uCAAuC,CAAC;QACvD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,iDAAiD;YAC9D,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACjC,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBACtC;iBACF;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,YAAY;oBAC9B,UAAU,EAAE;wBACV,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAChC;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;YAC/F,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAChD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;oBAClC,UAAU,EAAE;wBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAChC;iBACF;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,YAAY;oBAC9B,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;oBACrC,UAAU,EAAE;wBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAChC;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAClF,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,CAAC;oBACX,WAAW,EAAE,oBAAoB;oBACjC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,MAAM,aAAa;iBAChC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAChD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,CAAC;oBACX,WAAW,EAAE,oBAAoB;oBACjC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,MAAM,aAAa;oBAC/B,YAAY,EAAE,KAAK;oBACnB,QAAQ,EAAE,CAAC;oBACX,WAAW,EAAE,sBAAsB;iBACpC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,iCAAiC,CAAC;QACjD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,2DAA2D;YACxE,QAAQ,EAAE;gBACR,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,IAAI;oBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,MAAM,IAAI;iBACvB;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,MAAM,IAAI;iBACvB;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAE,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACxC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,IAAI;oBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,MAAM,aAAa;iBAChC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;YACrC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,yCAAyC,CAAC,CAAC;QAC1F,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QACrC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACnI,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,iDAAiD;YAC9D,QAAQ,EAAE;gBACR,CAAC,EAAE;oBACD,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,IAAI;oBACtB,UAAU,EAAE;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;gBACD,CAAC,EAAE;oBACD,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,IAAI;oBACtB,UAAU,EAAE;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,IAAI;iBACvB;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACjH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,6BAA6B,CAAC;QAC7C,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,yDAAyD;YACtE,QAAQ,EAAE;gBACR,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,GAAG,MAAM,OAAO;yBAC1B;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,OAAO;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAChH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAChD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,gDAAgD;YAC7D,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG,MAAM,cAAc;iBACjC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,MAAM,6BAA6B,CAAC,CAAC;QAC1H,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","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 { expect } from \"chai\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { TestUtils } from \"../TestUtils\";\n\ndescribe(\"SettingsSchemas\", () => {\n\n // SettingsSchema tests change the state of the IModelHost object. They should always clear\n // the current state before and after they run so they're not affected by, nor influence, other tests running in the same process.\n const restartSession = async () => {\n await IModelHost.shutdown();\n await TestUtils.startBackend();\n };\n before(async () => {\n await restartSession();\n });\n after(async () => {\n await restartSession();\n });\n\n it(\"add groups\", async () => {\n const schemas = IModelHost.settingsSchemas;\n // can't add a group with no name\n expect(() => schemas.addGroup({} as any)).throws(`has no \"schemaPrefix\" member`);\n\n schemas.addGroup({\n schemaPrefix: \"title-test\",\n title: \"Title Test\",\n description: \"schema with a user-facing title\",\n settingDefs: {\n setting: {\n type: \"string\",\n },\n },\n });\n expect(schemas.groups.get(\"title-test\")?.title).equals(\"Title Test\");\n expect(schemas.groups.get(\"title-test\")?.description).equals(\"schema with a user-facing title\");\n expect(schemas.settingDefs.get(\"title-test/setting\")!.type).equals(\"string\");\n\n schemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\n expect(schemas.groups.get(\"testApp\")?.title).equals(\"Test App\");\n expect(schemas.groups.get(\"testApp\")?.description).equals(\"the settings for test application 1\");\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.type).equals(\"string\");\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.default).equals(\"singleClick\");\n expect(schemas.settingDefs.get(\"testApp/tree/blah\")!.default).equals(true);\n });\n\n it(\"resolveSchema resolves object extends chains recursively\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test object resolution\",\n typeDefs: {\n nestedBase: {\n type: \"object\",\n required: [\"nestedReq\"],\n properties: {\n nestedReq: { type: \"integer\" },\n nestedBaseOnly: { type: \"string\" },\n },\n },\n baseThing: {\n type: \"object\",\n required: [\"baseReq\"],\n properties: {\n baseReq: { type: \"string\" },\n overridden: { type: \"string\" },\n baseOnly: { type: \"number\" },\n nested: {\n type: \"object\",\n extends: `${prefix}/nestedBase`,\n properties: {\n nestedChildOnly: { type: \"boolean\" },\n },\n },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n required: [\"derivedReq\"],\n properties: {\n derivedReq: { type: \"boolean\" },\n overridden: { type: \"number\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.type).to.equal(\"object\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved.required).to.have.members([\"baseReq\", \"derivedReq\"]);\n expect(resolved.properties).to.include.keys(\"baseReq\", \"baseOnly\", \"derivedReq\", \"overridden\", \"nested\");\n expect(resolved.properties?.overridden.type).to.equal(\"number\");\n expect(resolved.properties?.baseOnly.type).to.equal(\"number\");\n\n const nested = resolved.properties?.nested;\n expect(nested?.type).to.equal(\"object\");\n expect(nested).to.not.have.property(\"extends\");\n expect(nested?.required).to.have.members([\"nestedReq\"]);\n expect(nested?.properties).to.include.keys(\"nestedReq\", \"nestedBaseOnly\", \"nestedChildOnly\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema includes inherited properties from object typedefs\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object-inherited-props\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test inherited object properties\",\n typeDefs: {\n baseThing: {\n type: \"object\",\n properties: {\n inheritedName: { type: \"string\" },\n inheritedEnabled: { type: \"boolean\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n properties: {\n localCount: { type: \"integer\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.properties).to.include.keys(\"inheritedName\", \"inheritedEnabled\", \"localCount\");\n expect(resolved.properties?.inheritedName.type).to.equal(\"string\");\n expect(resolved.properties?.inheritedEnabled.type).to.equal(\"boolean\");\n expect(resolved.properties?.localCount.type).to.equal(\"integer\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema deduplicates required properties inherited from object typedefs\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object-required\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test required property deduplication\",\n typeDefs: {\n baseThing: {\n type: \"object\",\n required: [\"sharedReq\", \"baseReq\"],\n properties: {\n sharedReq: { type: \"string\" },\n baseReq: { type: \"boolean\" },\n derivedReq: { type: \"integer\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n required: [\"sharedReq\", \"derivedReq\"],\n properties: {\n sharedReq: { type: \"string\" },\n derivedReq: { type: \"integer\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.required).to.have.members([\"sharedReq\", \"baseReq\", \"derivedReq\"]);\n expect(resolved.required?.filter((name) => name === \"sharedReq\")).to.have.lengthOf(1);\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema resolves array items through extends\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test array resolution\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n minItems: 1,\n description: \"base array typedef\",\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.type).to.equal(\"array\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved.combineArray).to.equal(true);\n expect(resolved.minItems).to.equal(1);\n expect(resolved.description).to.equal(\"base array typedef\");\n expect(resolved.items?.type).to.equal(\"string\");\n expect(resolved.items).to.not.have.property(\"extends\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema lets derived array schema properties override inherited typedef properties\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array-overrides\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test array override precedence\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n minItems: 1,\n description: \"base array typedef\",\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n combineArray: false,\n minItems: 3,\n description: \"derived array schema\",\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.combineArray).to.equal(false);\n expect(resolved.minItems).to.equal(3);\n expect(resolved.description).to.equal(\"derived array schema\");\n expect(resolved.items?.type).to.equal(\"string\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema resolves array items through multi-level typedef inheritance\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array-multilevel\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test multi-level array typedef inheritance\",\n typeDefs: {\n c: {\n type: \"array\",\n combineArray: true,\n items: { type: \"string\" },\n },\n b: {\n type: \"array\",\n extends: `${prefix}/c`,\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/b`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.combineArray).to.equal(true);\n expect(resolved.items?.type).to.equal(\"string\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef returns a resolved setting schema by name\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-setting-schema\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test resolved setting schema lookup\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`);\n expect(resolved).to.not.be.undefined;\n expect(resolved?.type).to.equal(\"array\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved?.combineArray).to.equal(true);\n expect(resolved?.items?.type).to.equal(\"string\");\n expect(schemas.getResolvedSettingDef(`${prefix}/missing`)).to.be.undefined;\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef resolves built-in workspace settings schemas\", () => {\n const schemas = IModelHost.settingsSchemas;\n\n const resolved = schemas.getResolvedSettingDef(\"itwin/core/workspace/settingsWorkspaces\");\n expect(resolved).to.not.be.undefined;\n expect(resolved?.type).to.equal(\"array\");\n expect(resolved?.items?.type).to.equal(\"object\");\n expect(resolved?.items).to.not.have.property(\"extends\");\n expect(resolved?.items?.required).to.have.members([\"containerId\", \"baseUri\"]);\n expect(resolved?.items?.properties).to.include.keys(\"dbName\", \"baseUri\", \"containerId\", \"storageType\", \"resourceName\", \"priority\");\n expect(resolved?.items?.properties?.storageType.default).to.equal(\"azure\");\n });\n\n it(\"getResolvedSettingDef throws on circular typedef references\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-cycle\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test circular typedef resolution\",\n typeDefs: {\n a: {\n type: \"object\",\n extends: `${prefix}/b`,\n properties: {\n aOnly: { type: \"string\" },\n },\n },\n b: {\n type: \"object\",\n extends: `${prefix}/a`,\n properties: {\n bOnly: { type: \"string\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/a`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/thing`)).to.throw(\"circular typeDef reference detected\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef throws on nested recursive typedef references\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-nested-cycle\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test nested recursive typedef resolution\",\n typeDefs: {\n node: {\n type: \"object\",\n properties: {\n child: {\n type: \"object\",\n extends: `${prefix}/node`,\n },\n },\n },\n },\n settingDefs: {\n root: {\n type: \"object\",\n extends: `${prefix}/node`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/root`)).to.throw(\"circular typeDef reference detected\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef throws when an extends target cannot be found\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-missing-typedef\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test missing typedef resolution\",\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/missingType`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/thing`)).to.throw(`typeDef ${prefix}/missingType does not exist`);\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n});\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SettingsSchemas.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 { expect } from \"chai\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { TestUtils } from \"../TestUtils\";\n\ndescribe(\"SettingsSchemas\", () => {\n\n // SettingsSchema tests change the state of the IModelHost object. They should always clear\n // the current state before and after they run so they're not affected by, nor influence, other tests running in the same process.\n const restartSession = async () => {\n await IModelHost.shutdown();\n await TestUtils.startBackend();\n };\n before(async () => {\n await restartSession();\n });\n after(async () => {\n await restartSession();\n });\n\n it(\"add groups\", async () => {\n const schemas = IModelHost.settingsSchemas;\n // can't add a group with no name\n expect(() => schemas.addGroup({} as any)).throws(`has no \"schemaPrefix\" member`);\n\n schemas.addGroup({\n schemaPrefix: \"title-test\",\n title: \"Title Test\",\n description: \"schema with a user-facing title\",\n settingDefs: {\n setting: {\n type: \"string\",\n },\n },\n });\n expect(schemas.groups.get(\"title-test\")?.title).equals(\"Title Test\");\n expect(schemas.groups.get(\"title-test\")?.description).equals(\"schema with a user-facing title\");\n expect(schemas.settingDefs.get(\"title-test/setting\")!.type).equals(\"string\");\n\n schemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\n expect(schemas.groups.get(\"testApp\")?.title).equals(\"Test App\");\n expect(schemas.groups.get(\"testApp\")?.description).equals(\"the settings for test application 1\");\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.type).equals(\"string\");\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.default).equals(\"singleClick\");\n expect(schemas.settingDefs.get(\"testApp/tree/blah\")!.default).equals(true);\n });\n\n it(\"resolveSchema resolves object extends chains recursively\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test object resolution\",\n typeDefs: {\n nestedBase: {\n type: \"object\",\n required: [\"nestedReq\"],\n properties: {\n nestedReq: { type: \"integer\" },\n nestedBaseOnly: { type: \"string\" },\n },\n },\n baseThing: {\n type: \"object\",\n required: [\"baseReq\"],\n properties: {\n baseReq: { type: \"string\" },\n overridden: { type: \"string\" },\n baseOnly: { type: \"number\" },\n nested: {\n type: \"object\",\n extends: `${prefix}/nestedBase`,\n properties: {\n nestedChildOnly: { type: \"boolean\" },\n },\n },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n required: [\"derivedReq\"],\n properties: {\n derivedReq: { type: \"boolean\" },\n overridden: { type: \"number\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.type).to.equal(\"object\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved.required).to.have.members([\"baseReq\", \"derivedReq\"]);\n expect(resolved.properties).to.include.keys(\"baseReq\", \"baseOnly\", \"derivedReq\", \"overridden\", \"nested\");\n expect(resolved.properties?.overridden.type).to.equal(\"number\");\n expect(resolved.properties?.baseOnly.type).to.equal(\"number\");\n\n const nested = resolved.properties?.nested;\n expect(nested?.type).to.equal(\"object\");\n expect(nested).to.not.have.property(\"extends\");\n expect(nested?.required).to.have.members([\"nestedReq\"]);\n expect(nested?.properties).to.include.keys(\"nestedReq\", \"nestedBaseOnly\", \"nestedChildOnly\");\n\n const resolvedPreservingExtends = schemas.getResolvedSettingDef(`${prefix}/thing`, { preserveExtends: true })!;\n expect(resolvedPreservingExtends.extends).to.equal(`${prefix}/baseThing`);\n expect(resolvedPreservingExtends.properties?.overridden.type).to.equal(\"number\");\n\n const nestedPreservingExtends = resolvedPreservingExtends.properties?.nested;\n expect(nestedPreservingExtends?.extends).to.equal(`${prefix}/nestedBase`);\n expect(nestedPreservingExtends?.properties).to.include.keys(\"nestedReq\", \"nestedBaseOnly\", \"nestedChildOnly\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema includes inherited properties from object typedefs\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object-inherited-props\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test inherited object properties\",\n typeDefs: {\n baseThing: {\n type: \"object\",\n properties: {\n inheritedName: { type: \"string\" },\n inheritedEnabled: { type: \"boolean\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n properties: {\n localCount: { type: \"integer\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.properties).to.include.keys(\"inheritedName\", \"inheritedEnabled\", \"localCount\");\n expect(resolved.properties?.inheritedName.type).to.equal(\"string\");\n expect(resolved.properties?.inheritedEnabled.type).to.equal(\"boolean\");\n expect(resolved.properties?.localCount.type).to.equal(\"integer\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema deduplicates required properties inherited from object typedefs\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-object-required\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test required property deduplication\",\n typeDefs: {\n baseThing: {\n type: \"object\",\n required: [\"sharedReq\", \"baseReq\"],\n properties: {\n sharedReq: { type: \"string\" },\n baseReq: { type: \"boolean\" },\n derivedReq: { type: \"integer\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/baseThing`,\n required: [\"sharedReq\", \"derivedReq\"],\n properties: {\n sharedReq: { type: \"string\" },\n derivedReq: { type: \"integer\" },\n },\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/thing`)!;\n expect(resolved.required).to.have.members([\"sharedReq\", \"baseReq\", \"derivedReq\"]);\n expect(resolved.required?.filter((name) => name === \"sharedReq\")).to.have.lengthOf(1);\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema resolves array items through extends\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test array resolution\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n minItems: 1,\n description: \"base array typedef\",\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.type).to.equal(\"array\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved.combineArray).to.equal(true);\n expect(resolved.minItems).to.equal(1);\n expect(resolved.description).to.equal(\"base array typedef\");\n expect(resolved.items?.type).to.equal(\"string\");\n expect(resolved.items).to.not.have.property(\"extends\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema lets derived array schema properties override inherited typedef properties\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array-overrides\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test array override precedence\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n minItems: 1,\n description: \"base array typedef\",\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n combineArray: false,\n minItems: 3,\n description: \"derived array schema\",\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.combineArray).to.equal(false);\n expect(resolved.minItems).to.equal(3);\n expect(resolved.description).to.equal(\"derived array schema\");\n expect(resolved.items?.type).to.equal(\"string\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"resolveSchema resolves array items through multi-level typedef inheritance\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-array-multilevel\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test multi-level array typedef inheritance\",\n typeDefs: {\n c: {\n type: \"array\",\n combineArray: true,\n items: { type: \"string\" },\n },\n b: {\n type: \"array\",\n extends: `${prefix}/c`,\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/b`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`)!;\n expect(resolved.combineArray).to.equal(true);\n expect(resolved.items?.type).to.equal(\"string\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef returns a resolved setting schema by name\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-setting-schema\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test resolved setting schema lookup\",\n typeDefs: {\n stringList: {\n type: \"array\",\n combineArray: true,\n items: { type: \"string\" },\n },\n },\n settingDefs: {\n names: {\n type: \"array\",\n extends: `${prefix}/stringList`,\n },\n },\n });\n\n try {\n const resolved = schemas.getResolvedSettingDef(`${prefix}/names`);\n expect(resolved).to.not.be.undefined;\n expect(resolved?.type).to.equal(\"array\");\n expect(resolved).to.not.have.property(\"extends\");\n expect(resolved?.combineArray).to.equal(true);\n expect(resolved?.items?.type).to.equal(\"string\");\n expect(schemas.getResolvedSettingDef(`${prefix}/missing`)).to.be.undefined;\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef resolves built-in workspace settings schemas\", () => {\n const schemas = IModelHost.settingsSchemas;\n\n const resolved = schemas.getResolvedSettingDef(\"itwin/core/workspace/settingsWorkspaces\");\n expect(resolved).to.not.be.undefined;\n expect(resolved?.type).to.equal(\"array\");\n expect(resolved?.items?.type).to.equal(\"object\");\n expect(resolved?.items).to.not.have.property(\"extends\");\n expect(resolved?.items?.required).to.have.members([\"containerId\", \"baseUri\"]);\n expect(resolved?.items?.properties).to.include.keys(\"dbName\", \"baseUri\", \"containerId\", \"storageType\", \"resourceName\", \"priority\");\n expect(resolved?.items?.properties?.storageType.default).to.equal(\"azure\");\n });\n\n it(\"getResolvedSettingDef throws on circular typedef references\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-cycle\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test circular typedef resolution\",\n typeDefs: {\n a: {\n type: \"object\",\n extends: `${prefix}/b`,\n properties: {\n aOnly: { type: \"string\" },\n },\n },\n b: {\n type: \"object\",\n extends: `${prefix}/a`,\n properties: {\n bOnly: { type: \"string\" },\n },\n },\n },\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/a`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/thing`)).to.throw(\"circular typeDef reference detected\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef throws on nested recursive typedef references\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-nested-cycle\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test nested recursive typedef resolution\",\n typeDefs: {\n node: {\n type: \"object\",\n properties: {\n child: {\n type: \"object\",\n extends: `${prefix}/node`,\n },\n },\n },\n },\n settingDefs: {\n root: {\n type: \"object\",\n extends: `${prefix}/node`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/root`)).to.throw(\"circular typeDef reference detected\");\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n it(\"getResolvedSettingDef throws when an extends target cannot be found\", () => {\n const schemas = IModelHost.settingsSchemas;\n const prefix = \"resolve-schema-missing-typedef\";\n schemas.removeGroup(prefix);\n schemas.addGroup({\n schemaPrefix: prefix,\n description: \"schema used to test missing typedef resolution\",\n settingDefs: {\n thing: {\n type: \"object\",\n extends: `${prefix}/missingType`,\n },\n },\n });\n\n try {\n expect(() => schemas.getResolvedSettingDef(`${prefix}/thing`)).to.throw(`typeDef ${prefix}/missingType does not exist`);\n } finally {\n schemas.removeGroup(prefix);\n }\n });\n\n});\n"]}
|
|
@@ -424,7 +424,7 @@ describe("WorkspaceFile", () => {
|
|
|
424
424
|
});
|
|
425
425
|
it("finds containers by iTwinId", async () => {
|
|
426
426
|
BlobContainer.service = createMockService([
|
|
427
|
-
{ containerId: testContainerId, containerType: "workspace", label: "Test Workspace" },
|
|
427
|
+
{ containerId: testContainerId, containerType: "workspace", label: "Test Workspace", iTwinId: testITwinId },
|
|
428
428
|
]);
|
|
429
429
|
const containers = await editor.findContainers({ iTwinId: testITwinId });
|
|
430
430
|
expect(containers).to.have.length(1);
|
|
@@ -432,7 +432,7 @@ describe("WorkspaceFile", () => {
|
|
|
432
432
|
});
|
|
433
433
|
it("finds a container by iTwinId and iModelId", async () => {
|
|
434
434
|
BlobContainer.service = createMockService([
|
|
435
|
-
{ containerId: "imodel-scoped-container", containerType: "workspace", label: "iModel Workspace" },
|
|
435
|
+
{ containerId: "imodel-scoped-container", containerType: "workspace", label: "iModel Workspace", iTwinId: testITwinId },
|
|
436
436
|
]);
|
|
437
437
|
const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });
|
|
438
438
|
expect(containers).to.have.length(1);
|