Skip to content

Commit 87cfaa5

Browse files
test: refactor test setup
1 parent 0da92fe commit 87cfaa5

File tree

2 files changed

+90
-71
lines changed

2 files changed

+90
-71
lines changed

test/index.ts

Lines changed: 13 additions & 71 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) => {

test/util.ts

Lines changed: 77 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,73 @@ export function sleep(duration: number) {
1724
export function shouldNotHappen(done: (err?: Error) => void) {
1825
return () => done(new Error("should not happen"));
1926
}
27+
28+
interface TestContext {
29+
servers: Server[];
30+
serverSockets: ServerSocket[];
31+
clientSockets: ClientSocket[];
32+
cleanup: () => void;
33+
}
34+
35+
const NODES_COUNT = 3;
36+
37+
export function setup() {
38+
const servers: Server[] = [];
39+
const serverSockets: ServerSocket[] = [];
40+
const clientSockets: ClientSocket[] = [];
41+
42+
const pool = new Pool({
43+
user: "postgres",
44+
password: "changeit",
45+
});
46+
47+
return new Promise<TestContext>(async (resolve) => {
48+
await pool.query(
49+
`
50+
CREATE TABLE IF NOT EXISTS events (
51+
id bigserial UNIQUE,
52+
created_at timestamptz DEFAULT NOW(),
53+
payload bytea
54+
);
55+
`,
56+
() => {}
57+
);
58+
59+
for (let i = 1; i <= NODES_COUNT; i++) {
60+
const httpServer = createServer();
61+
const io = new Server(httpServer, {
62+
adapter: createAdapter(pool, {
63+
tableName: "events",
64+
}),
65+
});
66+
67+
io.of("/").adapter.init();
68+
69+
httpServer.listen(() => {
70+
const port = (httpServer.address() as AddressInfo).port;
71+
const clientSocket = ioc(`http://localhost:${port}`);
72+
73+
io.on("connection", async (socket) => {
74+
clientSockets.push(clientSocket);
75+
serverSockets.push(socket);
76+
servers.push(io);
77+
78+
if (servers.length === NODES_COUNT) {
79+
await sleep(100);
80+
81+
resolve({
82+
servers,
83+
serverSockets,
84+
clientSockets,
85+
cleanup: () => {
86+
servers.forEach((server) => server.close());
87+
clientSockets.forEach((socket) => socket.disconnect());
88+
pool.end();
89+
},
90+
});
91+
}
92+
});
93+
});
94+
}
95+
});
96+
}

0 commit comments

Comments
 (0)