@fluid-experimental/odsp-end-to-end-tests 2.101.1 → 2.102.0

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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluid-experimental/odsp-end-to-end-tests
2
2
 
3
+ ## 2.102.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.101.0
4
8
 
5
9
  Dependency updates only.
package/eslint.config.mts CHANGED
@@ -8,6 +8,10 @@ import { recommended } from "@fluidframework/eslint-config-fluid/flat.mts";
8
8
 
9
9
  const config: Linter.Config[] = [
10
10
  ...recommended,
11
+ {
12
+ // eslint doesn't recognize renamed exports syntax (that is required for ESM config under v11 mocha)
13
+ ignores: ["src/test/.mocharc.js"],
14
+ },
11
15
  {
12
16
  rules: {
13
17
  "prefer-arrow-callback": "off",
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ *
5
+ * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
+ */
7
+ export const pkgName = "@fluid-experimental/odsp-end-to-end-tests";
8
+ export const pkgVersion = "2.102.0";
9
+ //# sourceMappingURL=packageVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,2CAA2C,CAAC;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluid-experimental/odsp-end-to-end-tests\";\nexport const pkgVersion = \"2.102.0\";\n"]}
@@ -7,6 +7,9 @@ import { AttachState } from "@fluidframework/container-definitions";
7
7
  import { ConnectionState } from "@fluidframework/container-loader";
8
8
  import { SharedMap } from "@fluidframework/map/internal";
9
9
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
10
+ // `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as
11
+ // `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.
12
+ import { pkgVersion as currentVersion } from "../packageVersion.js";
10
13
  import { createOdspClient, getCredentials } from "./OdspClientFactory.js";
11
14
  import { waitForMember } from "./utils.js";
12
15
  const configProvider = (settings) => ({
@@ -34,7 +37,7 @@ describe("Fluid audience", () => {
34
37
  * Expected behavior: container should have a single member upon creation.
35
38
  */
36
39
  it("can find original member", async () => {
37
- const { container, services } = await client.createContainer(schema);
40
+ const { container, services } = await client.createContainer(schema, currentVersion);
38
41
  const itemId = await container.attach();
39
42
  if (container.connectionState !== ConnectionState.Connected) {
40
43
  await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
@@ -59,7 +62,7 @@ describe("Fluid audience", () => {
59
62
  * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425
60
63
  */
61
64
  it.skip("can find partner member", async () => {
62
- const { container, services } = await client.createContainer(schema);
65
+ const { container, services } = await client.createContainer(schema, currentVersion);
63
66
  const itemId = await container.attach();
64
67
  if (container.connectionState !== ConnectionState.Connected) {
65
68
  await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
@@ -76,7 +79,7 @@ describe("Fluid audience", () => {
76
79
  const client2 = createOdspClient(client2Creds, undefined, configProvider({
77
80
  "Fluid.Container.ForceWriteConnection": true,
78
81
  }));
79
- const { services: servicesGet } = await client2.getContainer(itemId, schema);
82
+ const { services: servicesGet } = await client2.getContainer(itemId, schema, currentVersion);
80
83
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
81
84
  const partner = await waitForMember(servicesGet.audience, client2Creds.email);
82
85
  assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
@@ -93,7 +96,7 @@ describe("Fluid audience", () => {
93
96
  * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425
94
97
  */
95
98
  it.skip("can observe member leaving", async () => {
96
- const { container } = await client.createContainer(schema);
99
+ const { container } = await client.createContainer(schema, currentVersion);
97
100
  const itemId = await container.attach();
98
101
  if (container.connectionState !== ConnectionState.Connected) {
99
102
  await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
@@ -105,7 +108,7 @@ describe("Fluid audience", () => {
105
108
  const client2 = createOdspClient(client2Creds, undefined, configProvider({
106
109
  "Fluid.Container.ForceWriteConnection": true,
107
110
  }));
108
- const { services: servicesGet } = await client2.getContainer(itemId, schema);
111
+ const { services: servicesGet } = await client2.getContainer(itemId, schema, currentVersion);
109
112
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
110
113
  const partner = await waitForMember(servicesGet.audience, client2Creds.email);
111
114
  assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
@@ -1 +1 @@
1
- {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,cAAc,GAAG,CAAC,QAAqC,EAAuB,EAAE,CAAC,CAAC;IACvF,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;CAC3D,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,IAAI,MAAkB,CAAC;IACvB,IAAI,MAAuB,CAAC;IAC5B,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,cAAc,EAAE,CAAC;IAEtD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnD,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,GAAG;YACR,cAAc,EAAE;gBACf,IAAI,EAAE,SAAS;aACf;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;YAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;gBAC/E,UAAU,EAAE,gBAAgB;gBAC5B,QAAQ,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,OAAO,MAAM,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;QAEF,sGAAsG;QACtG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;QAEjF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH;;;;;;;OAOG;IACH,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;YAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;gBAC/E,UAAU,EAAE,gBAAgB;gBAC5B,QAAQ,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,OAAO,MAAM,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;QAEF,sGAAsG;QACtG,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;QAEvF,2BAA2B;QAC3B,MAAM,OAAO,GAAG,gBAAgB,CAC/B,YAAY,EACZ,SAAS,EACT,cAAc,CAAC;YACd,sCAAsC,EAAE,IAAI;SAC5C,CAAC,CACF,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7E,sGAAsG;QACtG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAEnF,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;QAEjF,MAAM,CAAC,cAAc,CACpB,OAAO,EAAE,EAAE,EACX,YAAY,EAAE,EAAE,EAChB,4CAA4C,CAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;;;;OAOG;IACH,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;YAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;gBAC/E,UAAU,EAAE,gBAAgB;gBAC5B,QAAQ,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,gBAAgB,CAC/B,YAAY,EACZ,SAAS,EACT,cAAc,CAAC;YACd,sCAAsC,EAAE,IAAI;SAC5C,CAAC,CACF,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7E,sGAAsG;QACtG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAEnF,IAAI,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;QAEjF,SAAS,CAAC,UAAU,EAAE,CAAC;QAEvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;gBAC7C,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport type { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport type { OdspClient } from \"@fluidframework/odsp-client/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\nimport { createOdspClient, getCredentials } from \"./OdspClientFactory.js\";\nimport { waitForMember } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Fluid audience\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: OdspClient;\n\tlet schema: ContainerSchema;\n\tconst [client1Creds, client2Creds] = getCredentials();\n\n\tif (client1Creds === undefined || client2Creds === undefined) {\n\t\tthrow new Error(\"Couldn't get login credentials\");\n\t}\n\n\tbeforeEach(() => {\n\t\tclient = createOdspClient(client1Creds);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Find original member/self\n\t *\n\t * Expected behavior: container should have a single member upon creation.\n\t */\n\tit(\"can find original member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst myself = await waitForMember(services.audience, client1Creds.email);\n\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\tconst members = services.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t});\n\n\t/**\n\t * Scenario: Find partner member\n\t *\n\t * Expected behavior: upon resolving container, the partner member should be able\n\t * to resolve original member.\n\t *\n\t * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425\n\t */\n\tit.skip(\"can find partner member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst originalSelf = await waitForMember(services.audience, client1Creds.email);\n\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t// pass client2 credentials\n\t\tconst client2 = createOdspClient(\n\t\t\tclient2Creds,\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(itemId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, client2Creds.email);\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tconst members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tassert.notStrictEqual(\n\t\t\tpartner?.id,\n\t\t\toriginalSelf?.id,\n\t\t\t\"Self and partner should have different IDs\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Partner should be able to observe change in audience\n\t *\n\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t * memberRemoved event and have correct partner count.\n\t *\n\t * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425\n\t */\n\tit.skip(\"can observe member leaving\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\t// pass client2 siteUrl and driveId\n\t\tconst client2 = createOdspClient(\n\t\t\tclient2Creds,\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(itemId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, client2Creds.email);\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tlet members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tcontainer.disconnect();\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tmembers = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport type { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport type { OdspClient } from \"@fluidframework/odsp-client/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\n// `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as\n// `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.\nimport { pkgVersion as currentVersion } from \"../packageVersion.js\";\n\nimport { createOdspClient, getCredentials } from \"./OdspClientFactory.js\";\nimport { waitForMember } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Fluid audience\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: OdspClient;\n\tlet schema: ContainerSchema;\n\tconst [client1Creds, client2Creds] = getCredentials();\n\n\tif (client1Creds === undefined || client2Creds === undefined) {\n\t\tthrow new Error(\"Couldn't get login credentials\");\n\t}\n\n\tbeforeEach(() => {\n\t\tclient = createOdspClient(client1Creds);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Find original member/self\n\t *\n\t * Expected behavior: container should have a single member upon creation.\n\t */\n\tit(\"can find original member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst myself = await waitForMember(services.audience, client1Creds.email);\n\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\tconst members = services.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t});\n\n\t/**\n\t * Scenario: Find partner member\n\t *\n\t * Expected behavior: upon resolving container, the partner member should be able\n\t * to resolve original member.\n\t *\n\t * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425\n\t */\n\tit.skip(\"can find partner member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst originalSelf = await waitForMember(services.audience, client1Creds.email);\n\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t// pass client2 credentials\n\t\tconst client2 = createOdspClient(\n\t\t\tclient2Creds,\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(\n\t\t\titemId,\n\t\t\tschema,\n\t\t\tcurrentVersion,\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, client2Creds.email);\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tconst members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tassert.notStrictEqual(\n\t\t\tpartner?.id,\n\t\t\toriginalSelf?.id,\n\t\t\t\"Self and partner should have different IDs\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Partner should be able to observe change in audience\n\t *\n\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t * memberRemoved event and have correct partner count.\n\t *\n\t * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425\n\t */\n\tit.skip(\"can observe member leaving\", async () => {\n\t\tconst { container } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\t// pass client2 siteUrl and driveId\n\t\tconst client2 = createOdspClient(\n\t\t\tclient2Creds,\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(\n\t\t\titemId,\n\t\t\tschema,\n\t\t\tcurrentVersion,\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, client2Creds.email);\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tlet members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tcontainer.disconnect();\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tmembers = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t});\n});\n"]}
@@ -7,6 +7,9 @@ import { AttachState } from "@fluidframework/container-definitions";
7
7
  import { ConnectionState } from "@fluidframework/container-loader";
8
8
  import { SharedMap } from "@fluidframework/map/internal";
9
9
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
10
+ // `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as
11
+ // `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.
12
+ import { pkgVersion as currentVersion } from "../packageVersion.js";
10
13
  import { createOdspClient, getCredentials } from "./OdspClientFactory.js";
11
14
  describe("Container create scenarios", () => {
12
15
  const connectTimeoutMs = 10_000;
@@ -32,7 +35,7 @@ describe("Container create scenarios", () => {
32
35
  * be returned.
33
36
  */
34
37
  it("Created container is detached", async () => {
35
- const { container } = await client.createContainer(schema);
38
+ const { container } = await client.createContainer(schema, currentVersion);
36
39
  assert.strictEqual(container.attachState, AttachState.Detached, "Container should be detached");
37
40
  // Make sure we can attach.
38
41
  const itemId = await container.attach();
@@ -45,7 +48,7 @@ describe("Container create scenarios", () => {
45
48
  * be returned.
46
49
  */
47
50
  it("can attach a container", async () => {
48
- const { container } = await client.createContainer(schema);
51
+ const { container } = await client.createContainer(schema, currentVersion);
49
52
  const itemId = await container.attach();
50
53
  if (container.connectionState !== ConnectionState.Connected) {
51
54
  await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
@@ -63,7 +66,7 @@ describe("Container create scenarios", () => {
63
66
  * be returned.
64
67
  */
65
68
  it("cannot attach a container twice", async () => {
66
- const { container } = await client.createContainer(schema);
69
+ const { container } = await client.createContainer(schema, currentVersion);
67
70
  const itemId = await container.attach();
68
71
  if (container.connectionState !== ConnectionState.Connected) {
69
72
  await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
@@ -82,7 +85,7 @@ describe("Container create scenarios", () => {
82
85
  * be returned.
83
86
  */
84
87
  it("can retrieve existing ODSP container successfully", async () => {
85
- const { container: newContainer } = await client.createContainer(schema);
88
+ const { container: newContainer } = await client.createContainer(schema, currentVersion);
86
89
  const itemId = await newContainer.attach();
87
90
  if (newContainer.connectionState !== ConnectionState.Connected) {
88
91
  await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
@@ -90,7 +93,7 @@ describe("Container create scenarios", () => {
90
93
  errorMsg: "container connect() timeout",
91
94
  });
92
95
  }
93
- const resources = client.getContainer(itemId, schema);
96
+ const resources = client.getContainer(itemId, schema, currentVersion);
94
97
  await assert.doesNotReject(resources, () => true, "container cannot be retrieved from ODSP");
95
98
  });
96
99
  /**
@@ -99,7 +102,7 @@ describe("Container create scenarios", () => {
99
102
  * Expected behavior: an error should be thrown when trying to get a non-existent container.
100
103
  */
101
104
  it("cannot load improperly created container (cannot load a non-existent container)", async () => {
102
- const containerAndServicesP = client.getContainer("containerConfig", schema);
105
+ const containerAndServicesP = client.getContainer("containerConfig", schema, currentVersion);
103
106
  const errorFn = (error) => {
104
107
  assert.notStrictEqual(error.message, undefined, "Odsp Client error is undefined");
105
108
  assert.strict(error.message.startsWith("ODSP fetch error [400]"), `Unexpected error: ${error.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport type { OdspClient } from \"@fluidframework/odsp-client/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\nimport { createOdspClient, getCredentials } from \"./OdspClientFactory.js\";\n\ndescribe(\"Container create scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: OdspClient;\n\tlet schema: ContainerSchema;\n\n\tconst [clientCreds] = getCredentials();\n\n\tif (clientCreds === undefined) {\n\t\tthrow new Error(\"Couldn't get login credentials\");\n\t}\n\n\tbeforeEach(() => {\n\t\tclient = createOdspClient(clientCreds);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Odsp Client container is created,\n\t * it is initially detached.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"Created container is detached\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Detached,\n\t\t\t\"Container should be detached\",\n\t\t);\n\n\t\t// Make sure we can attach.\n\t\tconst itemId = await container.attach();\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t});\n\n\t/**\n\t * Scenario: Test attaching a container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can attach a container\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Test if attaching a container twice fails.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"cannot attach a container twice\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is attached after attach is called\",\n\t\t);\n\t\tawait assert.rejects(container.attach(), () => true, \"Container should not attach twice\");\n\t});\n\n\t/**\n\t * Scenario: test if Odsp Client can get an existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can retrieve existing ODSP container successfully\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema);\n\t\tconst itemId = await newContainer.attach();\n\n\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst resources = client.getContainer(itemId, schema);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from ODSP\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Odsp Client can get a non-exiting container.\n\t *\n\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t */\n\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema);\n\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Odsp Client error is undefined\");\n\t\t\tassert.strict(\n\t\t\t\terror.message.startsWith(\"ODSP fetch error [400]\"),\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tcontainerAndServicesP,\n\t\t\terrorFn,\n\t\t\t\"Odsp Client can load a non-existent container\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport type { OdspClient } from \"@fluidframework/odsp-client/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\n// `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as\n// `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.\nimport { pkgVersion as currentVersion } from \"../packageVersion.js\";\n\nimport { createOdspClient, getCredentials } from \"./OdspClientFactory.js\";\n\ndescribe(\"Container create scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: OdspClient;\n\tlet schema: ContainerSchema;\n\n\tconst [clientCreds] = getCredentials();\n\n\tif (clientCreds === undefined) {\n\t\tthrow new Error(\"Couldn't get login credentials\");\n\t}\n\n\tbeforeEach(() => {\n\t\tclient = createOdspClient(clientCreds);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Odsp Client container is created,\n\t * it is initially detached.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"Created container is detached\", async () => {\n\t\tconst { container } = await client.createContainer(schema, currentVersion);\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Detached,\n\t\t\t\"Container should be detached\",\n\t\t);\n\n\t\t// Make sure we can attach.\n\t\tconst itemId = await container.attach();\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t});\n\n\t/**\n\t * Scenario: Test attaching a container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can attach a container\", async () => {\n\t\tconst { container } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Test if attaching a container twice fails.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"cannot attach a container twice\", async () => {\n\t\tconst { container } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof itemId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is attached after attach is called\",\n\t\t);\n\t\tawait assert.rejects(container.attach(), () => true, \"Container should not attach twice\");\n\t});\n\n\t/**\n\t * Scenario: test if Odsp Client can get an existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can retrieve existing ODSP container successfully\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema, currentVersion);\n\t\tconst itemId = await newContainer.attach();\n\n\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst resources = client.getContainer(itemId, schema, currentVersion);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from ODSP\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Odsp Client can get a non-exiting container.\n\t *\n\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t */\n\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\tconst containerAndServicesP = client.getContainer(\n\t\t\t\"containerConfig\",\n\t\t\tschema,\n\t\t\tcurrentVersion,\n\t\t);\n\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Odsp Client error is undefined\");\n\t\t\tassert.strict(\n\t\t\t\terror.message.startsWith(\"ODSP fetch error [400]\"),\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tcontainerAndServicesP,\n\t\t\terrorFn,\n\t\t\t\"Odsp Client can load a non-existent container\",\n\t\t);\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-experimental/odsp-end-to-end-tests",
3
- "version": "2.101.1",
3
+ "version": "2.102.0",
4
4
  "description": "Odsp client end to end tests",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -33,22 +33,22 @@
33
33
  "temp-directory": "nyc/.nyc_output"
34
34
  },
35
35
  "dependencies": {
36
- "@fluid-internal/mocha-test-setup": "~2.101.1",
37
- "@fluid-private/test-version-utils": "~2.101.1",
38
- "@fluidframework/aqueduct": "~2.101.1",
39
- "@fluidframework/container-definitions": "~2.101.1",
40
- "@fluidframework/container-loader": "~2.101.1",
41
- "@fluidframework/core-interfaces": "~2.101.1",
42
- "@fluidframework/counter": "~2.101.1",
43
- "@fluidframework/fluid-static": "~2.101.1",
44
- "@fluidframework/map": "~2.101.1",
45
- "@fluidframework/matrix": "~2.101.1",
46
- "@fluidframework/odsp-client": "~2.101.1",
47
- "@fluidframework/odsp-doclib-utils": "~2.101.1",
48
- "@fluidframework/odsp-driver-definitions": "~2.101.1",
49
- "@fluidframework/sequence": "~2.101.1",
50
- "@fluidframework/telemetry-utils": "~2.101.1",
51
- "@fluidframework/test-utils": "~2.101.1",
36
+ "@fluid-internal/mocha-test-setup": "~2.102.0",
37
+ "@fluid-private/test-version-utils": "~2.102.0",
38
+ "@fluidframework/aqueduct": "~2.102.0",
39
+ "@fluidframework/container-definitions": "~2.102.0",
40
+ "@fluidframework/container-loader": "~2.102.0",
41
+ "@fluidframework/core-interfaces": "~2.102.0",
42
+ "@fluidframework/counter": "~2.102.0",
43
+ "@fluidframework/fluid-static": "~2.102.0",
44
+ "@fluidframework/map": "~2.102.0",
45
+ "@fluidframework/matrix": "~2.102.0",
46
+ "@fluidframework/odsp-client": "~2.102.0",
47
+ "@fluidframework/odsp-doclib-utils": "~2.102.0",
48
+ "@fluidframework/odsp-driver-definitions": "~2.102.0",
49
+ "@fluidframework/sequence": "~2.102.0",
50
+ "@fluidframework/telemetry-utils": "~2.102.0",
51
+ "@fluidframework/test-utils": "~2.102.0",
52
52
  "mocha": "^11.7.5",
53
53
  "mocha-multi-reporters": "^1.5.1",
54
54
  "sinon": "^18.0.1",
@@ -73,10 +73,10 @@
73
73
  },
74
74
  "fluidBuild": {
75
75
  "tasks": {
76
- "build:test": [
76
+ "build:test:esm": [
77
77
  "^api-extractor:esnext",
78
78
  "^build:esnext",
79
- "^tsc"
79
+ "build:genver"
80
80
  ]
81
81
  }
82
82
  },
@@ -86,7 +86,9 @@
86
86
  "scripts": {
87
87
  "build": "fluid-build . --task build",
88
88
  "build:compile": "fluid-build . --task compile",
89
- "build:test": "tsc --project ./src/test/tsconfig.json",
89
+ "build:genver": "gen-version",
90
+ "build:test": "npm run build:test:esm",
91
+ "build:test:esm": "tsc --project ./src/test/tsconfig.json",
90
92
  "check:biome": "biome check .",
91
93
  "check:format": "npm run check:biome",
92
94
  "clean": "rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" nyc",
@@ -99,7 +101,7 @@
99
101
  "test": "npm run test:realsvc:odsp",
100
102
  "test:coverage": "c8 npm test",
101
103
  "test:realsvc:odsp": "npm run test:realsvc:odsp:run -- --driver=odsp --odspEndpointName=odsp",
102
- "test:realsvc:odsp:run": "mocha --exit --timeout 20000 --config src/test/.mocharc.cjs",
104
+ "test:realsvc:odsp:run": "mocha --exit --timeout 20000 --config src/test/.mocharc.js",
103
105
  "test:realsvc:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:realsvc:odsp"
104
106
  }
105
107
  }
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ *
5
+ * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
+ */
7
+
8
+ export const pkgName = "@fluid-experimental/odsp-end-to-end-tests";
9
+ export const pkgVersion = "2.102.0";
@@ -0,0 +1,15 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import path from "node:path";
7
+
8
+ import { getFluidTestMochaConfigWithCompat } from "@fluid-private/test-version-utils/mocharc-common";
9
+
10
+ const packageDir = path.resolve(import.meta.dirname, "../..");
11
+ const config = getFluidTestMochaConfigWithCompat(packageDir);
12
+ // mocha v12+ supports ESM config when default export is given via `export default config;`.
13
+ // Prior to that synchronous ESM can be loaded with specifically configured
14
+ // module.exports export containing the config.
15
+ export { config as "module.exports" };
@@ -13,6 +13,10 @@ import { SharedMap } from "@fluidframework/map/internal";
13
13
  import type { OdspClient } from "@fluidframework/odsp-client/internal";
14
14
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
15
15
 
16
+ // `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as
17
+ // `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.
18
+ import { pkgVersion as currentVersion } from "../packageVersion.js";
19
+
16
20
  import { createOdspClient, getCredentials } from "./OdspClientFactory.js";
17
21
  import { waitForMember } from "./utils.js";
18
22
 
@@ -45,7 +49,7 @@ describe("Fluid audience", () => {
45
49
  * Expected behavior: container should have a single member upon creation.
46
50
  */
47
51
  it("can find original member", async () => {
48
- const { container, services } = await client.createContainer(schema);
52
+ const { container, services } = await client.createContainer(schema, currentVersion);
49
53
  const itemId = await container.attach();
50
54
 
51
55
  if (container.connectionState !== ConnectionState.Connected) {
@@ -79,7 +83,7 @@ describe("Fluid audience", () => {
79
83
  * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425
80
84
  */
81
85
  it.skip("can find partner member", async () => {
82
- const { container, services } = await client.createContainer(schema);
86
+ const { container, services } = await client.createContainer(schema, currentVersion);
83
87
  const itemId = await container.attach();
84
88
 
85
89
  if (container.connectionState !== ConnectionState.Connected) {
@@ -108,7 +112,11 @@ describe("Fluid audience", () => {
108
112
  "Fluid.Container.ForceWriteConnection": true,
109
113
  }),
110
114
  );
111
- const { services: servicesGet } = await client2.getContainer(itemId, schema);
115
+ const { services: servicesGet } = await client2.getContainer(
116
+ itemId,
117
+ schema,
118
+ currentVersion,
119
+ );
112
120
 
113
121
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
114
122
  const partner = await waitForMember(servicesGet.audience, client2Creds.email);
@@ -133,7 +141,7 @@ describe("Fluid audience", () => {
133
141
  * Note: This test is currently skipped because the web app examples indicate the audience is functioning properly. AB#6425
134
142
  */
135
143
  it.skip("can observe member leaving", async () => {
136
- const { container } = await client.createContainer(schema);
144
+ const { container } = await client.createContainer(schema, currentVersion);
137
145
  const itemId = await container.attach();
138
146
 
139
147
  if (container.connectionState !== ConnectionState.Connected) {
@@ -151,7 +159,11 @@ describe("Fluid audience", () => {
151
159
  "Fluid.Container.ForceWriteConnection": true,
152
160
  }),
153
161
  );
154
- const { services: servicesGet } = await client2.getContainer(itemId, schema);
162
+ const { services: servicesGet } = await client2.getContainer(
163
+ itemId,
164
+ schema,
165
+ currentVersion,
166
+ );
155
167
 
156
168
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
157
169
  const partner = await waitForMember(servicesGet.audience, client2Creds.email);
@@ -12,6 +12,10 @@ import { SharedMap } from "@fluidframework/map/internal";
12
12
  import type { OdspClient } from "@fluidframework/odsp-client/internal";
13
13
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
14
14
 
15
+ // `pkgVersion` is this package's own version, which tracks the Fluid Framework release group; we use it as
16
+ // `minVersionForCollab` in tests so they exercise the latest defaults rather than a hardcoded version.
17
+ import { pkgVersion as currentVersion } from "../packageVersion.js";
18
+
15
19
  import { createOdspClient, getCredentials } from "./OdspClientFactory.js";
16
20
 
17
21
  describe("Container create scenarios", () => {
@@ -42,7 +46,7 @@ describe("Container create scenarios", () => {
42
46
  * be returned.
43
47
  */
44
48
  it("Created container is detached", async () => {
45
- const { container } = await client.createContainer(schema);
49
+ const { container } = await client.createContainer(schema, currentVersion);
46
50
  assert.strictEqual(
47
51
  container.attachState,
48
52
  AttachState.Detached,
@@ -61,7 +65,7 @@ describe("Container create scenarios", () => {
61
65
  * be returned.
62
66
  */
63
67
  it("can attach a container", async () => {
64
- const { container } = await client.createContainer(schema);
68
+ const { container } = await client.createContainer(schema, currentVersion);
65
69
  const itemId = await container.attach();
66
70
 
67
71
  if (container.connectionState !== ConnectionState.Connected) {
@@ -86,7 +90,7 @@ describe("Container create scenarios", () => {
86
90
  * be returned.
87
91
  */
88
92
  it("cannot attach a container twice", async () => {
89
- const { container } = await client.createContainer(schema);
93
+ const { container } = await client.createContainer(schema, currentVersion);
90
94
  const itemId = await container.attach();
91
95
 
92
96
  if (container.connectionState !== ConnectionState.Connected) {
@@ -112,7 +116,7 @@ describe("Container create scenarios", () => {
112
116
  * be returned.
113
117
  */
114
118
  it("can retrieve existing ODSP container successfully", async () => {
115
- const { container: newContainer } = await client.createContainer(schema);
119
+ const { container: newContainer } = await client.createContainer(schema, currentVersion);
116
120
  const itemId = await newContainer.attach();
117
121
 
118
122
  if (newContainer.connectionState !== ConnectionState.Connected) {
@@ -122,7 +126,7 @@ describe("Container create scenarios", () => {
122
126
  });
123
127
  }
124
128
 
125
- const resources = client.getContainer(itemId, schema);
129
+ const resources = client.getContainer(itemId, schema, currentVersion);
126
130
  await assert.doesNotReject(
127
131
  resources,
128
132
  () => true,
@@ -136,7 +140,11 @@ describe("Container create scenarios", () => {
136
140
  * Expected behavior: an error should be thrown when trying to get a non-existent container.
137
141
  */
138
142
  it("cannot load improperly created container (cannot load a non-existent container)", async () => {
139
- const containerAndServicesP = client.getContainer("containerConfig", schema);
143
+ const containerAndServicesP = client.getContainer(
144
+ "containerConfig",
145
+ schema,
146
+ currentVersion,
147
+ );
140
148
 
141
149
  const errorFn = (error: Error): boolean => {
142
150
  assert.notStrictEqual(error.message, undefined, "Odsp Client error is undefined");
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "extends": "../../../../../../common/build/build-common/tsconfig.test.node16.json",
3
+ // This deviates from the standard test tsconfig pattern to accommodate `gen-version`, which emits
4
+ // `src/packageVersion.ts` one directory above the test sources. We widen `rootDir` (and adjust
5
+ // `outDir` to match) and explicitly include the generated file so it compiles alongside the tests.
3
6
  "compilerOptions": {
4
- "rootDir": "./",
5
- "outDir": "../../lib/test",
7
+ "rootDir": "../",
8
+ "outDir": "../../lib",
6
9
  "types": ["mocha", "node"],
7
10
  "exactOptionalPropertyTypes": false,
8
11
  },
9
- "include": ["./**/*"],
12
+ "include": ["./**/*", "../packageVersion.ts"],
10
13
  }
@@ -1,12 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- "use strict";
7
-
8
- const packageDir = `${__dirname}/../..`;
9
- const getFluidTestMochaConfig = require("@fluid-private/test-version-utils/mocharc-common");
10
- const config = getFluidTestMochaConfig(packageDir);
11
-
12
- module.exports = config;