Skip to content

Commit b371467

Browse files
committed
[scramjet/runway] add link header tests
1 parent d562dc2 commit b371467

File tree

4 files changed

+62
-7
lines changed

4 files changed

+62
-7
lines changed

packages/scramjet/packages/runway/src/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,18 @@ async function runTest(
148148
}
149149
}
150150

151+
let serverResultResolve: (result: TestResult) => void;
152+
let serverResult: Promise<TestResult> = new Promise((resolve) => {
153+
serverResultResolve = resolve;
154+
});
155+
151156
// Handle basic tests (tests that serve a page and call pass/fail)
152-
await test.start();
157+
await test.start({
158+
pass: async (message?: string, details?: any) =>
159+
serverResultResolve({ status: "pass", message, details }),
160+
fail: async (message?: string, details?: any) =>
161+
serverResultResolve({ status: "fail", message, details }),
162+
});
153163

154164
try {
155165
const testUrl = `http://localhost:${test.port}/`;
@@ -158,7 +168,7 @@ async function runTest(
158168
(window as any).__runwayNavigate(url);
159169
}, testUrl);
160170

161-
return await waitForResult(timeout);
171+
return await Promise.race([waitForResult(timeout), serverResult]);
162172
} finally {
163173
await test.stop();
164174
}

packages/scramjet/packages/runway/src/inspect.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,16 @@ async function main() {
6363
// Start all matching tests (only basicTests need servers)
6464
for (const test of tests) {
6565
if (!test.playwrightFn) {
66-
await test.start();
66+
await test.start({
67+
pass: async (message?: string, details?: any) => {
68+
console.log(`\n✅ Test passed${message ? `: ${message}` : ""}`);
69+
if (details) console.log(" Details:", details);
70+
},
71+
fail: async (message?: string, details?: any) => {
72+
console.log(`\n❌ Test failed${message ? `: ${message}` : ""}`);
73+
if (details) console.log(" Details:", details);
74+
},
75+
});
6776
console.log(
6877
`🌐 Test "${test.name}" running at http://localhost:${test.port}/`
6978
);

packages/scramjet/packages/runway/src/testcommon.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ export type TestContext = {
1313
export type Test = {
1414
name: string;
1515
port: number;
16-
start: () => Promise<void>;
16+
start: (ctx: {
17+
pass: (message?: string, details?: any) => Promise<void>;
18+
fail: (message?: string, details?: any) => Promise<void>;
19+
}) => Promise<void>;
1720
stop: () => Promise<void>;
1821
/** If defined, this is a playwright test that controls the browser directly */
1922
playwrightFn?: (ctx: TestContext) => Promise<void>;
@@ -195,7 +198,14 @@ export function playwrightTest(props: {
195198
// same as basicTest but gives us a handle to the server
196199
export function serverTest(props: {
197200
name: string;
198-
start: (server: http.Server, port: number) => Promise<void>;
201+
start: (
202+
server: http.Server,
203+
port: number,
204+
ctx: {
205+
pass: (message?: string, details?: any) => Promise<void>;
206+
fail: (message?: string, details?: any) => Promise<void>;
207+
}
208+
) => Promise<void>;
199209
autoPass?: boolean;
200210
js?: string;
201211
}) {
@@ -205,7 +215,7 @@ export function serverTest(props: {
205215
return {
206216
name: props.name,
207217
port,
208-
async start() {
218+
async start({ pass, fail }) {
209219
server = http.createServer(
210220
{
211221
// Only accept websocket upgrades, reject others (like h2c) so they fall back to normal HTTP
@@ -240,7 +250,7 @@ export function serverTest(props: {
240250
}
241251
}
242252
);
243-
await props.start(server, port);
253+
await props.start(server, port, { pass, fail });
244254
return new Promise<void>((resolve) => {
245255
server.listen(port, () => resolve());
246256
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { serverTest } from "../testcommon.ts";
2+
3+
export default [
4+
serverTest({
5+
name: "linkheader-preload",
6+
start: async (server, port, { pass, fail }) => {
7+
server.on("request", (req, res) => {
8+
if (req.url === "/") {
9+
res.writeHead(200, {
10+
"Content-Type": "text/html",
11+
Link: `<http://localhost:${port}/script.js>; rel="preload"; as="script"`,
12+
});
13+
res.end();
14+
} else if (req.url === "/script.js") {
15+
console.log("script.js loaded");
16+
pass("script.js loaded");
17+
} else {
18+
console.log("unexpected url request", req.url);
19+
res.writeHead(404);
20+
res.end("Not found");
21+
fail("unexpected url request");
22+
}
23+
});
24+
},
25+
}),
26+
];

0 commit comments

Comments
 (0)