Skip to content

Commit 81b04aa

Browse files
author
Antigravity Assistant
committed
abstract express test server initialization into a reusable utility function
1 parent 68051a2 commit 81b04aa

4 files changed

Lines changed: 47 additions & 80 deletions

File tree

server/test/integration/socket-admin-override.test.ts

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { describe, it, expect, beforeAll, afterAll, beforeEach, vi } from 'vitest';
22
import { Server as HTTPServer } from 'http';
33
import { Server } from 'socket.io';
4-
import express from 'express';
54
import { createServer } from 'http';
65
import { CONFIG } from '../../src/config.js';
76
import { LobbyController } from '../../src/controllers/lobby.controller.js';
@@ -16,9 +15,9 @@ import {
1615
adminUser,
1716
teardownTestServer,
1817
setupTestMocks,
19-
setupTestLobby
18+
setupTestLobby,
19+
createExpressTestServer
2020
} from './utils/socket-test-utils.js';
21-
import { setupSocket } from '../../src/sockets/index.js';
2221

2322
vi.mock('../../src/models/Lobby.js', () => ({
2423
Lobby: {
@@ -37,31 +36,13 @@ describe('Admin Override Authority Integration', () => {
3736
beforeAll(async () => {
3837
setupTestMocks();
3938

40-
const app = express();
41-
app.use(express.json());
42-
43-
httpServer = createServer(app);
44-
io = new Server(httpServer);
45-
setupSocket(io);
46-
47-
app.use((req, res, next) => {
48-
(req as any).io = io;
49-
(req as any).user = adminUser;
50-
next();
51-
});
39+
const setup = await createExpressTestServer(adminUser);
40+
io = setup.io;
41+
httpServer = setup.httpServer;
42+
port = setup.port;
43+
const app = setup.app;
5244

5345
app.post('/api/lobbies/:id/kick', requireLobbyOwner, LobbyController.kickUser);
54-
55-
await new Promise<void>((resolve, reject) => {
56-
httpServer.listen(() => {
57-
const address = httpServer.address();
58-
if (!address || typeof address === 'string') {
59-
return reject(new Error('Failed to gracefully acquire a port number for the test server.'));
60-
}
61-
port = address.port;
62-
resolve();
63-
});
64-
});
6546
});
6647

6748
beforeEach(() => {

server/test/integration/socket-ban.test.ts

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { describe, it, expect, beforeAll, afterAll, beforeEach, vi } from 'vitest';
22
import { Server as HTTPServer } from 'http';
33
import { Server } from 'socket.io';
4-
import express from 'express';
54
import { createServer } from 'http';
65
import { CONFIG } from '../../src/config.js';
76
import { LobbyController } from '../../src/controllers/lobby.controller.js';
@@ -17,9 +16,9 @@ import {
1716
userA,
1817
teardownTestServer,
1918
setupTestMocks,
20-
setupTestLobby
19+
setupTestLobby,
20+
createExpressTestServer
2121
} from './utils/socket-test-utils.js';
22-
import { setupSocket } from '../../src/sockets/index.js';
2322

2423
// 1. Mock the specific MongoDB call in User model using `vi.mock`
2524
vi.mock('../../src/models/User.js', () => ({
@@ -71,32 +70,13 @@ describe('Ban User Flow & Persistence Integration', () => {
7170
}
7271
});
7372

74-
const app = express();
75-
app.use(express.json());
76-
77-
httpServer = createServer(app);
78-
io = new Server(httpServer);
79-
setupSocket(io);
80-
81-
// Attach IO and pretend we are UserA (Owner)
82-
app.use((req, res, next) => {
83-
(req as any).io = io;
84-
(req as any).user = userA;
85-
next();
86-
});
73+
const setup = await createExpressTestServer(userA);
74+
io = setup.io;
75+
httpServer = setup.httpServer;
76+
port = setup.port;
77+
const app = setup.app;
8778

8879
app.post('/api/lobbies/:id/ban', LobbyController.banUser);
89-
90-
await new Promise<void>((resolve, reject) => {
91-
httpServer.listen(() => {
92-
const address = httpServer.address();
93-
if (!address || typeof address === 'string') {
94-
return reject(new Error('Failed to gracefully acquire a port number for the test server.'));
95-
}
96-
port = address.port;
97-
resolve();
98-
});
99-
});
10080
});
10181

10282
beforeEach(() => {

server/test/integration/socket-kick.test.ts

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
22
import { Server as HTTPServer } from 'http';
33
import { Server } from 'socket.io';
4-
import express from 'express';
54
import { createServer } from 'http';
65
import { CONFIG } from '../../src/config.js';
76
import { LobbyController } from '../../src/controllers/lobby.controller.js';
@@ -15,9 +14,9 @@ import {
1514
userA,
1615
teardownTestServer,
1716
setupTestMocks,
18-
setupTestLobby
17+
setupTestLobby,
18+
createExpressTestServer
1919
} from './utils/socket-test-utils.js';
20-
import { setupSocket } from '../../src/sockets/index.js';
2120

2221
describe('Kick User Flow Integration', () => {
2322
let io: Server;
@@ -27,32 +26,13 @@ describe('Kick User Flow Integration', () => {
2726
beforeAll(async () => {
2827
setupTestMocks();
2928

30-
const app = express();
31-
app.use(express.json());
32-
33-
httpServer = createServer(app);
34-
io = new Server(httpServer);
35-
setupSocket(io);
36-
37-
// Attach IO and mock owner auth so that we bypass requireLobbyOwner and authenticateToken issues
38-
app.use((req, res, next) => {
39-
(req as any).io = io;
40-
(req as any).user = userA; // owner
41-
next();
42-
});
29+
const setup = await createExpressTestServer(userA); // owner
30+
io = setup.io;
31+
httpServer = setup.httpServer;
32+
port = setup.port;
33+
const app = setup.app;
4334

4435
app.post('/api/lobbies/:id/kick', LobbyController.kickUser);
45-
46-
await new Promise<void>((resolve, reject) => {
47-
httpServer.listen(() => {
48-
const address = httpServer.address();
49-
if (!address || typeof address === 'string') {
50-
return reject(new Error('Failed to gracefully acquire a port number for the test server.'));
51-
}
52-
port = address.port;
53-
resolve();
54-
});
55-
});
5636
});
5737

5838
beforeEach(() => {

server/test/integration/utils/socket-test-utils.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import express from 'express';
12
import { createServer, Server as HTTPServer } from 'http';
23
import { Server } from 'socket.io';
34
import { io as Client, Socket as ClientSocket } from 'socket.io-client';
@@ -72,6 +73,31 @@ export const createTestServer = (): Promise<{ io: Server; httpServer: HTTPServer
7273
});
7374
};
7475

76+
export const createExpressTestServer = (mockUser: any): Promise<{ io: Server; httpServer: HTTPServer; port: number; app: express.Express }> => {
77+
const app = express();
78+
app.use(express.json());
79+
80+
const httpServer = createServer(app);
81+
const io = new Server(httpServer);
82+
setupSocket(io);
83+
84+
app.use((req, res, next) => {
85+
(req as any).io = io;
86+
(req as any).user = mockUser;
87+
next();
88+
});
89+
90+
return new Promise((resolve, reject) => {
91+
httpServer.listen(() => {
92+
const address = httpServer.address();
93+
if (!address || typeof address === 'string') {
94+
return reject(new Error('Failed to gracefully acquire a port number for the test server.'));
95+
}
96+
resolve({ io, httpServer, port: address.port, app });
97+
});
98+
});
99+
};
100+
75101
export const bootstrapTestServer = async (withMocks = true) => {
76102
if (withMocks) setupTestMocks();
77103
return await createTestServer();

0 commit comments

Comments
 (0)