Skip to content

Commit 419f708

Browse files
committed
refactor: extract shared test helpers and improve test isolation
Extract createMockReq/createMockRes/createDefaults into shared helpers/mock-res.ts to eliminate duplication between bedrock and converse test suites. Convert reasoning-all-providers from beforeAll/afterAll to beforeEach/afterEach for proper per-test server isolation.
1 parent 4f22b56 commit 419f708

2 files changed

Lines changed: 72 additions & 8 deletions

File tree

src/__tests__/helpers/mock-res.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import * as http from "node:http";
2+
import type { HandlerDefaults } from "../../types.js";
3+
import { Logger } from "../../logger.js";
4+
5+
export function createMockReq(overrides: Partial<http.IncomingMessage> = {}): http.IncomingMessage {
6+
return {
7+
method: undefined,
8+
url: undefined,
9+
headers: {},
10+
...overrides,
11+
} as unknown as http.IncomingMessage;
12+
}
13+
14+
export function createMockRes(): http.ServerResponse & {
15+
_written: string;
16+
_status: number;
17+
_headers: Record<string, string>;
18+
} {
19+
const res = {
20+
_written: "",
21+
_status: 0,
22+
_headers: {} as Record<string, string>,
23+
writableEnded: false,
24+
statusCode: 0,
25+
writeHead(status: number, headers?: Record<string, string>) {
26+
res._status = status;
27+
res.statusCode = status;
28+
if (headers) Object.assign(res._headers, headers);
29+
},
30+
setHeader(name: string, value: string) {
31+
res._headers[name] = value;
32+
},
33+
write(data: string) {
34+
res._written += data;
35+
return true;
36+
},
37+
end(data?: string) {
38+
if (data) res._written += data;
39+
res.writableEnded = true;
40+
},
41+
destroy() {
42+
res.writableEnded = true;
43+
},
44+
};
45+
return res as unknown as http.ServerResponse & {
46+
_written: string;
47+
_status: number;
48+
_headers: Record<string, string>;
49+
};
50+
}
51+
52+
export function createDefaults(overrides: Partial<HandlerDefaults> = {}): HandlerDefaults {
53+
return {
54+
latency: 0,
55+
chunkSize: 100,
56+
logger: new Logger("silent"),
57+
...overrides,
58+
};
59+
}

src/__tests__/reasoning-all-providers.test.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, it, expect, beforeAll, afterAll } from "vitest";
1+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
22
import * as http from "node:http";
33
import { crc32 } from "node:zlib";
44
import type { Fixture } from "../types.js";
@@ -7,7 +7,7 @@ import { buildBedrockStreamTextEvents } from "../bedrock.js";
77

88
// --- helpers ---
99

10-
let instance: ServerInstance;
10+
let instance: ServerInstance | null = null;
1111
let baseUrl: string;
1212

1313
function post(
@@ -176,15 +176,18 @@ const allFixtures: Fixture[] = [reasoningFixture, plainFixture];
176176

177177
// --- server lifecycle ---
178178

179-
beforeAll(async () => {
179+
beforeEach(async () => {
180180
instance = await createServer(allFixtures);
181181
baseUrl = instance.url;
182182
});
183183

184-
afterAll(async () => {
185-
await new Promise<void>((resolve) => {
186-
instance.server.close(() => resolve());
187-
});
184+
afterEach(async () => {
185+
if (instance) {
186+
await new Promise<void>((resolve) => {
187+
instance!.server.close(() => resolve());
188+
});
189+
instance = null;
190+
}
188191
});
189192

190193
// ─── OpenAI Chat Completions: Reasoning ─────────────────────────────────────
@@ -549,7 +552,9 @@ describe("POST /model/{id}/converse-stream (reasoning streaming)", () => {
549552
.join("");
550553
expect(fullThinking).toBe("Let me think step by step about this problem.");
551554

552-
expect(eventTypes[eventTypes.length - 1]).toBe("messageStop");
555+
// metadata event (with usage) follows messageStop in the Converse stream
556+
expect(eventTypes[eventTypes.length - 2]).toBe("messageStop");
557+
expect(eventTypes[eventTypes.length - 1]).toBe("metadata");
553558
});
554559

555560
it("no thinking block when reasoning is absent", async () => {

0 commit comments

Comments
 (0)