|
1 | | -import { beforeEach, describe, expect, it, vi } from "vitest"; |
| 1 | +import { describe, expect, it } from "vitest"; |
| 2 | +import { |
| 3 | + resolveRealtimeStreamsVersion, |
| 4 | + type RealtimeStreamsVersionConfig, |
| 5 | +} from "~/services/realtime/v1StreamsGlobal.server"; |
2 | 6 |
|
3 | | -const envMock = vi.hoisted(() => ({ |
4 | | - REALTIME_STREAMS_DEFAULT_VERSION: "v1" as "v1" | "v2", |
5 | | - REALTIME_STREAMS_S2_BASIN: undefined as string | undefined, |
6 | | - REALTIME_STREAMS_S2_ACCESS_TOKEN: undefined as string | undefined, |
7 | | - REALTIME_STREAMS_S2_SKIP_ACCESS_TOKENS: "false", |
8 | | -})); |
| 7 | +const NO_S2: RealtimeStreamsVersionConfig = { |
| 8 | + defaultVersion: "v1", |
| 9 | + basin: undefined, |
| 10 | + accessToken: undefined, |
| 11 | + skipAccessTokens: false, |
| 12 | + perOrgBasinsEnabled: false, |
| 13 | +}; |
9 | 14 |
|
10 | | -vi.mock("~/env.server", () => ({ env: envMock })); |
| 15 | +const GLOBAL_BASIN: RealtimeStreamsVersionConfig = { |
| 16 | + ...NO_S2, |
| 17 | + basin: "a-basin", |
| 18 | + accessToken: "a-token", |
| 19 | +}; |
11 | 20 |
|
12 | | -import { determineRealtimeStreamsVersion } from "~/services/realtime/v1StreamsGlobal.server"; |
| 21 | +const PER_ORG_BASINS: RealtimeStreamsVersionConfig = { |
| 22 | + ...NO_S2, |
| 23 | + accessToken: "a-token", |
| 24 | + perOrgBasinsEnabled: true, |
| 25 | +}; |
13 | 26 |
|
14 | | -function configureS2() { |
15 | | - envMock.REALTIME_STREAMS_S2_BASIN = "a-basin"; |
16 | | - envMock.REALTIME_STREAMS_S2_ACCESS_TOKEN = "a-token"; |
17 | | -} |
18 | | - |
19 | | -beforeEach(() => { |
20 | | - envMock.REALTIME_STREAMS_DEFAULT_VERSION = "v1"; |
21 | | - envMock.REALTIME_STREAMS_S2_BASIN = undefined; |
22 | | - envMock.REALTIME_STREAMS_S2_ACCESS_TOKEN = undefined; |
23 | | - envMock.REALTIME_STREAMS_S2_SKIP_ACCESS_TOKENS = "false"; |
24 | | -}); |
| 27 | +describe("resolveRealtimeStreamsVersion", () => { |
| 28 | + it("honours an explicit v2 when a global basin is configured", () => { |
| 29 | + expect(resolveRealtimeStreamsVersion("v2", GLOBAL_BASIN)).toBe("v2"); |
| 30 | + }); |
25 | 31 |
|
26 | | -describe("determineRealtimeStreamsVersion", () => { |
27 | | - it("honours an explicit v2 when S2 is configured", () => { |
28 | | - configureS2(); |
29 | | - expect(determineRealtimeStreamsVersion("v2")).toBe("v2"); |
| 32 | + it("honours an explicit v2 when only per-org basins are configured", () => { |
| 33 | + expect(resolveRealtimeStreamsVersion("v2", PER_ORG_BASINS)).toBe("v2"); |
30 | 34 | }); |
31 | 35 |
|
32 | | - it("accepts a skip-tokens deployment as configured", () => { |
33 | | - envMock.REALTIME_STREAMS_S2_BASIN = "a-basin"; |
34 | | - envMock.REALTIME_STREAMS_S2_SKIP_ACCESS_TOKENS = "true"; |
35 | | - expect(determineRealtimeStreamsVersion("v2")).toBe("v2"); |
| 36 | + it("accepts a skip-tokens deployment as credentialed", () => { |
| 37 | + expect( |
| 38 | + resolveRealtimeStreamsVersion("v2", { |
| 39 | + ...NO_S2, |
| 40 | + basin: "a-basin", |
| 41 | + skipAccessTokens: true, |
| 42 | + }) |
| 43 | + ).toBe("v2"); |
36 | 44 | }); |
37 | 45 |
|
38 | 46 | it("degrades an explicit v2 to v1 when S2 is not configured", () => { |
39 | | - expect(determineRealtimeStreamsVersion("v2")).toBe("v1"); |
| 47 | + expect(resolveRealtimeStreamsVersion("v2", NO_S2)).toBe("v1"); |
40 | 48 | }); |
41 | 49 |
|
42 | 50 | it("falls back to the default version when the caller expresses no preference", () => { |
43 | | - configureS2(); |
44 | | - envMock.REALTIME_STREAMS_DEFAULT_VERSION = "v2"; |
45 | | - expect(determineRealtimeStreamsVersion()).toBe("v2"); |
| 51 | + expect( |
| 52 | + resolveRealtimeStreamsVersion(undefined, { ...GLOBAL_BASIN, defaultVersion: "v2" }) |
| 53 | + ).toBe("v2"); |
46 | 54 | }); |
47 | 55 |
|
48 | 56 | it("degrades a v2 default to v1 when S2 is not configured", () => { |
49 | | - envMock.REALTIME_STREAMS_DEFAULT_VERSION = "v2"; |
50 | | - expect(determineRealtimeStreamsVersion()).toBe("v1"); |
| 57 | + expect(resolveRealtimeStreamsVersion(undefined, { ...NO_S2, defaultVersion: "v2" })).toBe("v1"); |
| 58 | + }); |
| 59 | + |
| 60 | + it("keeps a v2 default on v2 when only per-org basins are configured", () => { |
| 61 | + expect( |
| 62 | + resolveRealtimeStreamsVersion(undefined, { ...PER_ORG_BASINS, defaultVersion: "v2" }) |
| 63 | + ).toBe("v2"); |
| 64 | + }); |
| 65 | + |
| 66 | + it("requires credentials, not just a basin", () => { |
| 67 | + const basinOnly = { ...NO_S2, basin: "a-basin", defaultVersion: "v2" as const }; |
| 68 | + expect(resolveRealtimeStreamsVersion(undefined, basinOnly)).toBe("v1"); |
| 69 | + expect(resolveRealtimeStreamsVersion("v2", basinOnly)).toBe("v1"); |
51 | 70 | }); |
52 | 71 |
|
53 | | - it("requires a basin, not just a token", () => { |
54 | | - envMock.REALTIME_STREAMS_S2_ACCESS_TOKEN = "a-token"; |
55 | | - envMock.REALTIME_STREAMS_DEFAULT_VERSION = "v2"; |
56 | | - expect(determineRealtimeStreamsVersion()).toBe("v1"); |
57 | | - expect(determineRealtimeStreamsVersion("v2")).toBe("v1"); |
| 72 | + it("requires a basin, not just credentials", () => { |
| 73 | + const tokenOnly = { ...NO_S2, accessToken: "a-token", defaultVersion: "v2" as const }; |
| 74 | + expect(resolveRealtimeStreamsVersion(undefined, tokenOnly)).toBe("v1"); |
| 75 | + expect(resolveRealtimeStreamsVersion("v2", tokenOnly)).toBe("v1"); |
58 | 76 | }); |
59 | 77 |
|
60 | 78 | it("keeps an explicit v1 on v1 even where S2 is available", () => { |
61 | | - configureS2(); |
62 | | - envMock.REALTIME_STREAMS_DEFAULT_VERSION = "v2"; |
63 | | - expect(determineRealtimeStreamsVersion("v1")).toBe("v1"); |
| 79 | + expect(resolveRealtimeStreamsVersion("v1", { ...GLOBAL_BASIN, defaultVersion: "v2" })).toBe( |
| 80 | + "v1" |
| 81 | + ); |
64 | 82 | }); |
65 | 83 |
|
66 | 84 | it("treats an unrecognised version as v1", () => { |
67 | | - configureS2(); |
68 | | - expect(determineRealtimeStreamsVersion("v3")).toBe("v1"); |
| 85 | + expect(resolveRealtimeStreamsVersion("v3", GLOBAL_BASIN)).toBe("v1"); |
69 | 86 | }); |
70 | 87 | }); |
0 commit comments