Skip to content

Commit 7563eea

Browse files
authored
Merge pull request #985 from Jae-Hyuk-Jang/test/express-async-context-data
Add an async context data test for @fedify/express
2 parents 3eba4db + cd288b2 commit 7563eea

3 files changed

Lines changed: 100 additions & 2 deletions

File tree

‎packages/express/deno.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
]
2020
},
2121
"tasks": {
22-
"check": "deno fmt --check && deno lint && deno check *.ts"
22+
"check": "deno fmt --check && deno lint && deno check *.ts",
23+
"test": "deno test --allow-all"
2324
}
2425
}

‎packages/express/package.json‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
"build:self": "tsdown",
5959
"build": "pnpm --filter @fedify/express... run build:self",
6060
"prepack": "pnpm build",
61-
"prepublish": "pnpm build"
61+
"prepublish": "pnpm build",
62+
"test": "node --experimental-transform-types --test",
63+
"test:bun": "bun test src/"
6264
}
6365
}

‎packages/express/src/index.test.ts‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import type { Request as ERequest, Response as EResponse } from "express";
2+
import { strict as assert } from "node:assert";
3+
import { describe, test } from "node:test";
4+
import { integrateFederation } from "./index.ts";
5+
6+
interface MockFederation {
7+
fetch(request: Request, options: unknown): Promise<Response>;
8+
}
9+
10+
function createMockRequest(): ERequest {
11+
return {
12+
protocol: "http",
13+
host: "localhost",
14+
url: "/",
15+
method: "GET",
16+
headers: {},
17+
} as unknown as ERequest;
18+
}
19+
20+
function createMockResponse(): {
21+
response: EResponse;
22+
ended: Promise<void>;
23+
getBody(): string;
24+
} {
25+
let body = "";
26+
let resolveEnded: () => void;
27+
const ended = new Promise<void>((resolve) => {
28+
resolveEnded = resolve;
29+
});
30+
const response = {
31+
statusCode: 200,
32+
status(code: number) {
33+
response.statusCode = code;
34+
return response;
35+
},
36+
setHeader() {
37+
return response;
38+
},
39+
write(chunk: Buffer | string) {
40+
body += chunk.toString();
41+
return true;
42+
},
43+
end() {
44+
resolveEnded();
45+
return response;
46+
},
47+
};
48+
return {
49+
response: response as unknown as EResponse,
50+
ended,
51+
getBody: () => body,
52+
};
53+
}
54+
55+
describe("integrateFederation()", () => {
56+
test("waits for an async contextDataFactory and passes the resolved value to federation.fetch()", async () => {
57+
let resolveContextData!: (value: string) => void;
58+
let fetchCalled = false;
59+
60+
const mockFederation: MockFederation = {
61+
fetch(_request, options) {
62+
fetchCalled = true;
63+
const { contextData } = options as { contextData: unknown };
64+
return Promise.resolve(new Response(String(contextData)));
65+
},
66+
};
67+
68+
const contextDataFactory = () =>
69+
new Promise<string>((resolve) => {
70+
resolveContextData = resolve;
71+
});
72+
73+
const middleware = integrateFederation(
74+
mockFederation as never,
75+
contextDataFactory,
76+
);
77+
78+
const req = createMockRequest();
79+
const { response, ended, getBody } = createMockResponse();
80+
let nextCalled = false;
81+
82+
middleware(req, response, () => {
83+
nextCalled = true;
84+
});
85+
86+
await Promise.resolve();
87+
assert.strictEqual(fetchCalled, false);
88+
89+
resolveContextData("Hello World");
90+
await ended;
91+
92+
assert.strictEqual(nextCalled, false);
93+
assert.strictEqual(getBody(), "Hello World");
94+
});
95+
});

0 commit comments

Comments
 (0)