Skip to content

Commit a5b266f

Browse files
test: refactor test setup
1 parent 0da92fe commit a5b266f

File tree

2 files changed

+100
-72
lines changed

2 files changed

+100
-72
lines changed

test/index.ts

Lines changed: 14 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,23 @@
1-
import { createServer } from "http";
2-
import { Server, Socket as ServerSocket } from "socket.io";
3-
import { io as ioc, Socket as ClientSocket } from "socket.io-client";
4-
import expect = require("expect.js");
5-
import { createAdapter } from "../lib";
6-
import type { AddressInfo } from "net";
7-
import { times, sleep, shouldNotHappen } from "./util";
8-
import { Pool } from "pg";
9-
10-
const NODES_COUNT = 3;
1+
import { type Server, type Socket as ServerSocket } from "socket.io";
2+
import { type Socket as ClientSocket } from "socket.io-client";
3+
import expect from "expect.js";
4+
import { setup, times, sleep, shouldNotHappen } from "./util";
115

126
describe("@socket.io/postgres-adapter", () => {
137
let servers: Server[],
148
serverSockets: ServerSocket[],
159
clientSockets: ClientSocket[],
16-
pool: Pool;
17-
18-
beforeEach((done) => {
19-
servers = [];
20-
serverSockets = [];
21-
clientSockets = [];
22-
pool = new Pool({
23-
user: "postgres",
24-
host: "localhost",
25-
database: "postgres",
26-
password: "changeit",
27-
port: 5432,
28-
});
29-
30-
pool.query(
31-
`
32-
CREATE TABLE IF NOT EXISTS events (
33-
id bigserial UNIQUE,
34-
created_at timestamptz DEFAULT NOW(),
35-
payload bytea
36-
);
37-
`,
38-
() => {}
39-
);
40-
41-
for (let i = 1; i <= NODES_COUNT; i++) {
42-
const httpServer = createServer();
43-
const io = new Server(httpServer);
44-
io.adapter(
45-
createAdapter(pool, {
46-
tableName: "events",
47-
})
48-
);
49-
httpServer.listen(() => {
50-
const port = (httpServer.address() as AddressInfo).port;
51-
const clientSocket = ioc(`http://localhost:${port}`);
52-
53-
io.on("connection", async (socket) => {
54-
clientSockets.push(clientSocket);
55-
serverSockets.push(socket);
56-
servers.push(io);
57-
if (servers.length === NODES_COUNT) {
58-
await sleep(200);
59-
60-
// ensure all nodes know each other
61-
servers[0].emit("ping");
62-
servers[1].emit("ping");
63-
servers[2].emit("ping");
64-
65-
await sleep(200);
66-
67-
done();
68-
}
69-
});
70-
});
71-
}
10+
cleanup: () => void;
11+
12+
beforeEach(async () => {
13+
const testContext = await setup();
14+
servers = testContext.servers;
15+
serverSockets = testContext.serverSockets;
16+
clientSockets = testContext.clientSockets;
17+
cleanup = testContext.cleanup;
7218
});
7319

74-
afterEach((done) => {
75-
servers.forEach((server) => server.close());
76-
clientSockets.forEach((socket) => socket.disconnect());
77-
pool.end(done);
78-
});
20+
afterEach(() => cleanup());
7921

8022
describe("broadcast", function () {
8123
it("broadcasts to all clients", (done) => {
@@ -320,7 +262,7 @@ describe("@socket.io/postgres-adapter", () => {
320262
servers[0].disconnectSockets();
321263
});
322264

323-
it.skip("sends a packet before all socket instances disconnect", (done) => {
265+
it("sends a packet before all socket instances disconnect", (done) => {
324266
const partialDone = times(3, done);
325267

326268
clientSockets.forEach((clientSocket) => {

test/util.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import { createServer } from "http";
2+
import { AddressInfo } from "net";
3+
import { Server, type Socket as ServerSocket } from "socket.io";
4+
import { io as ioc, type Socket as ClientSocket } from "socket.io-client";
5+
import { Pool } from "pg";
6+
import { createAdapter } from "../lib";
7+
18
export function times(count: number, done: (err?: Error) => void) {
29
let i = 0;
310
return () => {
@@ -17,3 +24,82 @@ export function sleep(duration: number) {
1724
export function shouldNotHappen(done: (err?: Error) => void) {
1825
return () => done(new Error("should not happen"));
1926
}
27+
28+
function createServerAndClient(pool: Pool) {
29+
const httpServer = createServer();
30+
const io = new Server(httpServer, {
31+
adapter: createAdapter(pool, {
32+
tableName: "events",
33+
}),
34+
});
35+
36+
return new Promise<{
37+
io: Server;
38+
socket: ServerSocket;
39+
clientSocket: ClientSocket;
40+
}>((resolve) => {
41+
httpServer.listen(() => {
42+
const port = (httpServer.address() as AddressInfo).port;
43+
const clientSocket = ioc(`http://localhost:${port}`);
44+
45+
io.on("connection", (socket) => {
46+
resolve({
47+
io,
48+
socket,
49+
clientSocket,
50+
});
51+
});
52+
});
53+
});
54+
}
55+
56+
function isInitComplete(servers: Server[]) {
57+
return servers.every((server) => {
58+
return server.of("/").adapter.nodesMap.size === servers.length - 1;
59+
});
60+
}
61+
62+
export async function setup() {
63+
const pool = new Pool({
64+
user: "postgres",
65+
password: "changeit",
66+
});
67+
68+
await pool.query(
69+
`
70+
CREATE TABLE IF NOT EXISTS events (
71+
id bigserial UNIQUE,
72+
created_at timestamptz DEFAULT NOW(),
73+
payload bytea
74+
);
75+
`,
76+
() => {}
77+
);
78+
79+
const results = await Promise.all([
80+
createServerAndClient(pool),
81+
createServerAndClient(pool),
82+
createServerAndClient(pool),
83+
]);
84+
85+
const servers = results.map(({ io }) => io);
86+
const serverSockets = results.map(({ socket }) => socket);
87+
const clientSockets = results.map(({ clientSocket }) => clientSocket);
88+
89+
servers.forEach((server) => server.of("/").adapter.init());
90+
91+
while (!isInitComplete(servers)) {
92+
await sleep(20);
93+
}
94+
95+
return {
96+
servers,
97+
serverSockets,
98+
clientSockets,
99+
cleanup: () => {
100+
servers.forEach((server) => server.close());
101+
clientSockets.forEach((socket) => socket.disconnect());
102+
pool.end();
103+
},
104+
};
105+
}

0 commit comments

Comments
 (0)