From 209614c3e85b4b85a12608d0435d5cebbfeb6867 Mon Sep 17 00:00:00 2001 From: nvms Date: Tue, 22 Apr 2025 10:53:25 -0400 Subject: [PATCH] additional client tests --- packages/mesh/src/tests/client.test.ts | 94 +++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/packages/mesh/src/tests/client.test.ts b/packages/mesh/src/tests/client.test.ts index d4c7cbb..e2c2888 100644 --- a/packages/mesh/src/tests/client.test.ts +++ b/packages/mesh/src/tests/client.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect, beforeEach, afterEach } from "vitest"; +import { describe, test, expect, beforeEach, afterEach, vi } from "vitest"; import Redis from "ioredis"; import { MeshServer } from "../server"; import { MeshClient, Status } from "../client"; @@ -158,7 +158,10 @@ describe("MeshClient", () => { }); await server.ready(); - const client = new MeshClient(`ws://localhost:8130`, { pingTimeout: 10, maxMissedPings: 10 }); + const client = new MeshClient(`ws://localhost:8130`, { + pingTimeout: 10, + maxMissedPings: 10, + }); await client.connect(); return new Promise((resolve) => { @@ -171,4 +174,91 @@ describe("MeshClient", () => { }); }); }); + + test("client receives 'latency' messages", async () => { + const server = new MeshServer({ + port: 8131, + pingInterval: 10, + latencyInterval: 10, + maxMissedPongs: 10, + redisOptions: { host: REDIS_HOST, port: REDIS_PORT }, + }); + + await server.ready(); + const client = new MeshClient(`ws://localhost:8131`, { + pingTimeout: 10, + maxMissedPings: 10, + }); + await client.connect(); + + return new Promise((resolve) => { + client.on("latency", (data) => { + expect(data).toBeDefined(); + resolve(); + }); + client.on("close", () => { + expect(client.status).toBe(Status.OFFLINE); + }); + }); + }); + + test("client can get room metadata", async () => { + const roomName = "test-room"; + const metadata = { key: "value", nested: { data: true } }; + + await client.connect(); + await client.joinRoom(roomName); + + await server.roomManager.setMetadata(roomName, metadata); + + const retrievedMetadata = await client.getRoomMetadata(roomName); + expect(retrievedMetadata).toEqual(metadata); + }); + + test("client can get connection metadata", async () => { + await client.connect(); + const clientConnection = server.connectionManager.getLocalConnections()[0]!; + + const metadata = { user: "test-user", permissions: ["read", "write"] }; + await server.connectionManager.setMetadata(clientConnection, metadata); + + const retrievedMetadata = await client.getConnectionMetadata( + clientConnection.id + ); + expect(retrievedMetadata).toEqual(metadata); + }); + + test("client can get their own connection metadata", async () => { + await client.connect(); + const clientConnection = server.connectionManager.getLocalConnections()[0]!; + const metadata = { user: "test-user", permissions: ["read", "write"] }; + await server.connectionManager.setMetadata(clientConnection, metadata); + const retrievedMetadata = await client.getConnectionMetadata(); + expect(retrievedMetadata).toEqual(metadata); + }); + + test("helper methods register event listeners correctly", async () => { + const connectSpy = vi.fn(); + const disconnectSpy = vi.fn(); + const reconnectSpy = vi.fn(); + const reconnectFailedSpy = vi.fn(); + + client + .onConnect(connectSpy) + .onDisconnect(disconnectSpy) + .onReconnect(reconnectSpy) + .onReconnectFailed(reconnectFailedSpy); + + await client.connect(); + expect(connectSpy).toHaveBeenCalled(); + + client.emit("disconnect"); + expect(disconnectSpy).toHaveBeenCalled(); + + client.emit("reconnect"); + expect(reconnectSpy).toHaveBeenCalled(); + + client.emit("reconnectfailed"); + expect(reconnectFailedSpy).toHaveBeenCalled(); + }); });