Path: blob/master/src/packages/backend/conat/test/sync/cluster.test.ts
1712 views
/*12pnpm test `pwd`/cluster.test.ts34*/56import {7after,8before,9server,10addNodeToDefaultCluster,11wait,12client,13waitForConsistentState,14} from "../setup";1516beforeAll(before);1718jest.setTimeout(15000);1920describe("using various sync data structures with a cluster", () => {21let dstream;22it("creates a dstream", async () => {23dstream = await client.sync.dstream({ name: "foo" });24expect(dstream.getAll()).toEqual([]);2526dstream.publish("hi");27await dstream.save();28});2930let server2, client2;31it("creates another node", async () => {32server2 = await addNodeToDefaultCluster();33expect(server2.options.port).not.toBe(server.options.port);34client2 = server2.client();35expect(server2.options.port).not.toBe(server.options.port);36expect(server2.clusterTopology()).toEqual(server.clusterTopology());37expect(new Set(server2.clusterAddresses())).toEqual(38new Set(server.clusterAddresses()),39);40});4142it("wait until both servers in the cluster have the same state", async () => {43await waitForConsistentState([server, server2], 15000);44});4546let dstream2;47it("second client connected to the same dstream, and observe it works", async () => {48dstream2 = await client2.sync.dstream({ name: "foo" });49expect(dstream === dstream2).toBe(false);50expect(dstream.opts.client.id).not.toEqual(dstream2.opts.client.id);51expect(dstream2.getAll()).toEqual(["hi"]);5253dstream2.publish("world");54expect(dstream2.getAll()).toEqual(["hi", "world"]);55// not instant56expect(dstream.getAll()).toEqual(["hi"]);57await wait({ until: () => dstream.length == 2 });5859dstream.publish("!");60expect(dstream.getAll()).toEqual(["hi", "world", "!"]);61expect(dstream2.getAll()).toEqual(["hi", "world"]);62await wait({ until: () => dstream2.length == 3 });63expect(dstream2.getAll()).toEqual(["hi", "world", "!"]);64});6566const count = 3;67it(`create ${count} dstreams`, async () => {68const v: any[] = [];69for (let i = 0; i < count; i++) {70const d = await client2.sync.dstream({ name: `foo-${i}` });71d.push(i);72await d.save();73v.push(d);74}75for (let i = 0; i < count; i++) {76v[i].close();77}78for (let i = 0; i < count; i++) {79const d = await client.sync.dstream({ name: `foo-${i}` });80expect(d.getAll()).toEqual([i]);81d.close();82}83});8485it("test making dkv (key value store)", async () => {86await client2.sync.dkv({ name: "unrelated" });87});8889let dkv, dkv2;90it("test using a dkv (key value store)", async () => {91dkv2 = await client2.sync.dkv({ name: "cc" });92dkv = await client.sync.dkv({ name: "cc" });93expect(dkv.getAll()).toEqual({});94expect(dkv2.getAll()).toEqual({});95expect(dkv === dkv2).toBe(false);96expect(dkv.opts.client.id).not.toEqual(dkv2.opts.client.id);97});98});99100afterAll(after);101102103