Skip to content

Commit 5948416

Browse files
test(redis-streams-emitter): migrate to Node.js test runner
We should eventually be able to replace: - mocha and nyc with Node.js built-in test runner (`node:test`) - expect.js with Node.js built-in assertion library (`node:assert`)
1 parent 84e7253 commit 5948416

File tree

3 files changed

+126
-105
lines changed

3 files changed

+126
-105
lines changed

packages/socket.io-redis-streams-emitter/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
"format:fix": "prettier --parser typescript --write 'lib/**/*.ts' 'test/**/*.ts'",
2020
"prepack": "npm run compile",
2121
"test": "npm run format:check && npm run compile && npm run test:redis-standalone && npm run test:ioredis-standalone",
22-
"test:redis-standalone": "nyc mocha --import=tsx test/**/*.ts",
23-
"test:redis-cluster": "REDIS_CLUSTER=1 mocha --import=tsx test/**/*.ts",
24-
"test:ioredis-standalone": "REDIS_LIB=ioredis mocha --import=tsx test/**/*.ts",
25-
"test:ioredis-cluster": "REDIS_LIB=ioredis REDIS_CLUSTER=1 mocha --import=tsx test/**/*.ts",
26-
"test:valkey-standalone": "VALKEY=1 mocha --import=tsx test/**/*.ts"
22+
"test:redis-standalone": "tsx --test",
23+
"test:redis-cluster": "REDIS_CLUSTER=1 npm run test:redis-standalone",
24+
"test:ioredis-standalone": "REDIS_LIB=ioredis npm run test:redis-standalone",
25+
"test:ioredis-cluster": "REDIS_LIB=ioredis REDIS_CLUSTER=1 npm run test:redis-standalone",
26+
"test:valkey-standalone": "VALKEY=1 npm run test:redis-standalone"
2727
},
2828
"dependencies": {
2929
"@msgpack/msgpack": "~2.8.0",

packages/socket.io-redis-streams-emitter/test/index.ts

Lines changed: 110 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import { describe, it, beforeEach, afterEach } from "node:test";
2+
import * as assert from "node:assert";
13
import { type Server, type Socket as ServerSocket } from "socket.io";
24
import { type Socket as ClientSocket } from "socket.io-client";
3-
import expect = require("expect.js");
45
import { times, sleep, setup, initRedisClient } from "./util";
56
import { Emitter } from "../lib";
67

78
const PROPAGATION_DELAY_IN_MS = 100;
89

910
describe("@socket.io/redis-streams-emitter", () => {
10-
let servers: Server[],
11-
serverSockets: ServerSocket[],
12-
clientSockets: ClientSocket[],
11+
let servers: [Server, Server, Server],
12+
serverSockets: [ServerSocket, ServerSocket, ServerSocket],
13+
clientSockets: [ClientSocket, ClientSocket, ClientSocket],
1314
cleanup: () => void,
1415
emitter: Emitter;
1516

@@ -30,80 +31,88 @@ describe("@socket.io/redis-streams-emitter", () => {
3031
afterEach(() => cleanup());
3132

3233
describe("broadcast", function () {
33-
it("broadcasts to all clients", (done) => {
34-
const partialDone = times(3, done);
35-
36-
clientSockets.forEach((clientSocket) => {
37-
clientSocket.on("test", (arg1, arg2, arg3) => {
38-
expect(arg1).to.eql(1);
39-
expect(arg2).to.eql("2");
40-
expect(Buffer.isBuffer(arg3)).to.be(true);
41-
partialDone();
34+
it("broadcasts to all clients", () => {
35+
return new Promise<void>((resolve) => {
36+
const partialResolve = times(3, resolve);
37+
38+
clientSockets.forEach((clientSocket) => {
39+
clientSocket.on("test", (arg1, arg2, arg3) => {
40+
assert.equal(arg1, 1);
41+
assert.equal(arg2, "2");
42+
assert.ok(Buffer.isBuffer(arg3));
43+
partialResolve();
44+
});
4245
});
43-
});
4446

45-
emitter.emit("test", 1, "2", Buffer.from([3, 4]));
47+
emitter.emit("test", 1, "2", Buffer.from([3, 4]));
48+
});
4649
});
4750

48-
it("broadcasts to all clients in a namespace", (done) => {
49-
const partialDone = times(3, () => {
50-
servers.forEach((server) => server.of("/custom").adapter.close());
51-
done();
52-
});
51+
it("broadcasts to all clients in a namespace", () => {
52+
return new Promise<void>((resolve) => {
53+
const partialResolve = times(3, () => {
54+
servers.forEach((server) => server.of("/custom").adapter.close());
55+
resolve();
56+
});
5357

54-
servers.forEach((server) => server.of("/custom"));
58+
servers.forEach((server) => server.of("/custom"));
5559

56-
const onConnect = times(3, async () => {
57-
await sleep(PROPAGATION_DELAY_IN_MS);
60+
const onConnect = times(3, async () => {
61+
await sleep(PROPAGATION_DELAY_IN_MS);
5862

59-
emitter.of("/custom").emit("test");
60-
});
63+
emitter.of("/custom").emit("test");
64+
});
6165

62-
clientSockets.forEach((clientSocket) => {
63-
const socket = clientSocket.io.socket("/custom");
64-
socket.on("connect", onConnect);
65-
socket.on("test", () => {
66-
socket.disconnect();
67-
partialDone();
66+
clientSockets.forEach((clientSocket) => {
67+
const socket = clientSocket.io.socket("/custom");
68+
socket.on("connect", onConnect);
69+
socket.on("test", () => {
70+
socket.disconnect();
71+
partialResolve();
72+
});
6873
});
6974
});
7075
});
7176

72-
it("broadcasts to all clients in a room", (done) => {
73-
serverSockets[1].join("room1");
77+
it("broadcasts to all clients in a room", () => {
78+
return new Promise<void>((resolve, reject) => {
79+
serverSockets[1].join("room1");
7480

75-
clientSockets[0].on("test", () => {
76-
done(new Error("should not happen"));
77-
});
81+
clientSockets[0].on("test", () => {
82+
reject("should not happen");
83+
});
7884

79-
clientSockets[1].on("test", () => {
80-
done();
81-
});
85+
clientSockets[1].on("test", () => {
86+
resolve();
87+
});
8288

83-
clientSockets[2].on("test", () => {
84-
done(new Error("should not happen"));
85-
});
89+
clientSockets[2].on("test", () => {
90+
reject("should not happen");
91+
});
8692

87-
emitter.to("room1").emit("test");
93+
emitter.to("room1").emit("test");
94+
});
8895
});
8996

90-
it("broadcasts to all clients except in room", (done) => {
91-
const partialDone = times(2, done);
92-
serverSockets[1].join("room1");
97+
it("broadcasts to all clients except in room", () => {
98+
return new Promise<void>((resolve, reject) => {
99+
const partialResolve = times(2, resolve);
100+
serverSockets[1].join("room1");
93101

94-
clientSockets[0].on("test", () => {
95-
partialDone();
96-
});
102+
clientSockets[0].on("test", () => {
103+
partialResolve();
104+
});
97105

98-
clientSockets[1].on("test", () => {
99-
done(new Error("should not happen"));
100-
});
106+
clientSockets[1].on("test", () => {
107+
reject("should not happen");
108+
});
101109

102-
clientSockets[2].on("test", () => {
103-
partialDone();
104-
});
110+
clientSockets[2].on("test", () => {
111+
partialResolve();
112+
});
105113

106-
emitter.of("/").except("room1").emit("test");
114+
emitter.of("/").except("room1").emit("test");
115+
});
107116
});
108117
});
109118

@@ -113,9 +122,9 @@ describe("@socket.io/redis-streams-emitter", () => {
113122

114123
await sleep(PROPAGATION_DELAY_IN_MS);
115124

116-
expect(serverSockets[0].rooms.has("room1")).to.be(true);
117-
expect(serverSockets[1].rooms.has("room1")).to.be(true);
118-
expect(serverSockets[2].rooms.has("room1")).to.be(true);
125+
assert.ok(serverSockets[0].rooms.has("room1"));
126+
assert.ok(serverSockets[1].rooms.has("room1"));
127+
assert.ok(serverSockets[2].rooms.has("room1"));
119128
});
120129

121130
it("makes the matching socket instances join the specified room", async () => {
@@ -126,19 +135,19 @@ describe("@socket.io/redis-streams-emitter", () => {
126135

127136
await sleep(PROPAGATION_DELAY_IN_MS);
128137

129-
expect(serverSockets[0].rooms.has("room2")).to.be(true);
130-
expect(serverSockets[1].rooms.has("room2")).to.be(false);
131-
expect(serverSockets[2].rooms.has("room2")).to.be(true);
138+
assert.ok(serverSockets[0].rooms.has("room2"));
139+
assert.ok(serverSockets[1].rooms.has("room2") === false);
140+
assert.ok(serverSockets[2].rooms.has("room2"));
132141
});
133142

134143
it("makes the given socket instance join the specified room", async () => {
135144
emitter.in(serverSockets[1].id).socketsJoin("room3");
136145

137146
await sleep(PROPAGATION_DELAY_IN_MS);
138147

139-
expect(serverSockets[0].rooms.has("room3")).to.be(false);
140-
expect(serverSockets[1].rooms.has("room3")).to.be(true);
141-
expect(serverSockets[2].rooms.has("room3")).to.be(false);
148+
assert.ok(serverSockets[0].rooms.has("room3") === false);
149+
assert.ok(serverSockets[1].rooms.has("room3"));
150+
assert.ok(serverSockets[2].rooms.has("room3") === false);
142151
});
143152
});
144153

@@ -151,9 +160,9 @@ describe("@socket.io/redis-streams-emitter", () => {
151160

152161
await sleep(PROPAGATION_DELAY_IN_MS);
153162

154-
expect(serverSockets[0].rooms.has("room1")).to.be(false);
155-
expect(serverSockets[1].rooms.has("room1")).to.be(false);
156-
expect(serverSockets[2].rooms.has("room1")).to.be(false);
163+
assert.ok(serverSockets[0].rooms.has("room1") === false);
164+
assert.ok(serverSockets[1].rooms.has("room1") === false);
165+
assert.ok(serverSockets[2].rooms.has("room1") === false);
157166
});
158167

159168
it("makes the matching socket instances leave the specified room", async () => {
@@ -165,9 +174,9 @@ describe("@socket.io/redis-streams-emitter", () => {
165174

166175
await sleep(PROPAGATION_DELAY_IN_MS);
167176

168-
expect(serverSockets[0].rooms.has("room2")).to.be(false);
169-
expect(serverSockets[1].rooms.has("room2")).to.be(false);
170-
expect(serverSockets[2].rooms.has("room2")).to.be(true);
177+
assert.ok(serverSockets[0].rooms.has("room2") === false);
178+
assert.ok(serverSockets[1].rooms.has("room2") === false);
179+
assert.ok(serverSockets[2].rooms.has("room2"));
171180
});
172181

173182
it("makes the given socket instance leave the specified room", async () => {
@@ -179,46 +188,50 @@ describe("@socket.io/redis-streams-emitter", () => {
179188

180189
await sleep(PROPAGATION_DELAY_IN_MS);
181190

182-
expect(serverSockets[0].rooms.has("room3")).to.be(true);
183-
expect(serverSockets[1].rooms.has("room3")).to.be(false);
184-
expect(serverSockets[2].rooms.has("room3")).to.be(true);
191+
assert.ok(serverSockets[0].rooms.has("room3"));
192+
assert.ok(serverSockets[1].rooms.has("room1") === false);
193+
assert.ok(serverSockets[2].rooms.has("room3"));
185194
});
186195
});
187196

188197
describe("disconnectSockets", () => {
189-
it("makes all socket instances disconnect", (done) => {
190-
const partialDone = times(3, done);
191-
192-
clientSockets.forEach((clientSocket) => {
193-
clientSocket.on("disconnect", (reason) => {
194-
expect(reason).to.eql("io server disconnect");
195-
partialDone();
198+
it("makes all socket instances disconnect", () => {
199+
return new Promise<void>((resolve) => {
200+
const partialResolve = times(3, resolve);
201+
202+
clientSockets.forEach((clientSocket) => {
203+
clientSocket.on("disconnect", (reason) => {
204+
assert.equal(reason, "io server disconnect");
205+
partialResolve();
206+
});
196207
});
197-
});
198208

199-
emitter.disconnectSockets();
209+
emitter.disconnectSockets();
210+
});
200211
});
201212
});
202213

203214
describe("serverSideEmit", () => {
204-
it("sends an event to other server instances", (done) => {
205-
const partialDone = times(3, done);
215+
it("sends an event to other server instances", () => {
216+
return new Promise<void>((resolve) => {
217+
const partialResolve = times(3, resolve);
206218

207-
emitter.serverSideEmit("hello", "world", 1, "2");
219+
emitter.serverSideEmit("hello", "world", 1, "2");
208220

209-
servers[0].on("hello", (arg1, arg2, arg3) => {
210-
expect(arg1).to.eql("world");
211-
expect(arg2).to.eql(1);
212-
expect(arg3).to.eql("2");
213-
partialDone();
214-
});
221+
servers[0].on("hello", (arg1, arg2, arg3) => {
222+
assert.equal(arg1, "world");
223+
assert.equal(arg2, 1);
224+
assert.equal(arg3, "2");
225+
partialResolve();
226+
});
215227

216-
servers[1].on("hello", (arg1, arg2, arg3) => {
217-
partialDone();
218-
});
228+
servers[1].on("hello", (arg1, arg2, arg3) => {
229+
partialResolve();
230+
});
219231

220-
servers[2].of("/").on("hello", () => {
221-
partialDone();
232+
servers[2].of("/").on("hello", () => {
233+
partialResolve();
234+
});
222235
});
223236
});
224237
});

packages/socket.io-redis-streams-emitter/test/util.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,17 @@ async function init() {
138138
export async function setup() {
139139
const results = await Promise.all([init(), init(), init()]);
140140

141-
const servers = results.map(({ io }) => io);
142-
const serverSockets = results.map(({ socket }) => socket);
143-
const clientSockets = results.map(({ clientSocket }) => clientSocket);
141+
const servers = results.map(({ io }) => io) as [Server, Server, Server];
142+
const serverSockets = results.map(({ socket }) => socket) as [
143+
ServerSocket,
144+
ServerSocket,
145+
ServerSocket,
146+
];
147+
const clientSockets = results.map(({ clientSocket }) => clientSocket) as [
148+
ClientSocket,
149+
ClientSocket,
150+
ClientSocket,
151+
];
144152
const cleanupMethods = results.map(({ cleanup }) => cleanup);
145153

146154
return {

0 commit comments

Comments
 (0)