test(browser): report redirect status cases independently
This commit is contained in:
1 parent
96b2b245fd
commit
5a61562dc2
1 file changed
+64
-66
@@ -6,43 +6,50 @@ import { expect, it } from "vitest";
|
||||
import { fetchWebSourceMaps } from "../../../src/browser/WebSourceMapFetcher.js";
|
||||
import { analyzeWebBundleInputSchema } from "../../../src/domain/webBundleAnalysis.js";
|
||||
|
||||
it("follows only HTTP redirect statuses when a source-map response carries Location", async () => {
|
||||
const calls: string[] = [];
|
||||
const server = createServer((request, response) => {
|
||||
const path = request.url ?? "";
|
||||
calls.push(path);
|
||||
if (path === "/delivered.map") {
|
||||
response.writeHead(200, { "content-type": "application/json" }).end(
|
||||
JSON.stringify({
|
||||
version: 3,
|
||||
names: [],
|
||||
sources: ["original.js"],
|
||||
mappings: "AAAA",
|
||||
}),
|
||||
);
|
||||
return;
|
||||
}
|
||||
response
|
||||
.writeHead(Number(path.slice(1)), { location: "/delivered.map" })
|
||||
.end();
|
||||
});
|
||||
try {
|
||||
const listening = once(server, "listening");
|
||||
server.listen(0, "127.0.0.1");
|
||||
await listening;
|
||||
const address = server.address();
|
||||
if (address === null || typeof address === "string")
|
||||
throw new TypeError("Expected TCP listener");
|
||||
const origin = `http://127.0.0.1:${String(address.port)}`;
|
||||
const input = analyzeWebBundleInputSchema.parse({
|
||||
cdp_endpoint: "http://127.0.0.1:9222",
|
||||
target_id: "selected-page",
|
||||
allowed_origins: [origin],
|
||||
fetch_source_maps: true,
|
||||
it.each([
|
||||
{ status: 300, followsRedirect: false },
|
||||
{ status: 304, followsRedirect: false },
|
||||
{ status: 305, followsRedirect: false },
|
||||
{ status: 306, followsRedirect: false },
|
||||
{ status: 301, followsRedirect: true },
|
||||
{ status: 302, followsRedirect: true },
|
||||
{ status: 303, followsRedirect: true },
|
||||
{ status: 307, followsRedirect: true },
|
||||
{ status: 308, followsRedirect: true },
|
||||
])(
|
||||
"follows HTTP $status with Location only when it is a redirect status",
|
||||
async ({ status, followsRedirect }) => {
|
||||
const calls: string[] = [];
|
||||
const server = createServer((request, response) => {
|
||||
const path = request.url ?? "";
|
||||
calls.push(path);
|
||||
if (path === "/delivered.map") {
|
||||
response.writeHead(200, { "content-type": "application/json" }).end(
|
||||
JSON.stringify({
|
||||
version: 3,
|
||||
names: [],
|
||||
sources: ["original.js"],
|
||||
mappings: "AAAA",
|
||||
}),
|
||||
);
|
||||
return;
|
||||
}
|
||||
response.writeHead(status, { location: "/delivered.map" }).end();
|
||||
});
|
||||
const failures: unknown[] = [];
|
||||
for (const status of [300, 304, 305, 306, 301, 302, 303, 307, 308]) {
|
||||
calls.length = 0;
|
||||
try {
|
||||
const listening = once(server, "listening");
|
||||
server.listen(0, "127.0.0.1");
|
||||
await listening;
|
||||
const address = server.address();
|
||||
if (address === null || typeof address === "string")
|
||||
throw new TypeError("Expected TCP listener");
|
||||
const origin = `http://127.0.0.1:${String(address.port)}`;
|
||||
const input = analyzeWebBundleInputSchema.parse({
|
||||
cdp_endpoint: "http://127.0.0.1:9222",
|
||||
target_id: "selected-page",
|
||||
allowed_origins: [origin],
|
||||
fetch_source_maps: true,
|
||||
});
|
||||
const url = `${origin}/${String(status)}`;
|
||||
const result = await fetchWebSourceMaps(
|
||||
[
|
||||
@@ -54,36 +61,27 @@ it("follows only HTTP redirect statuses when a source-map response carries Locat
|
||||
],
|
||||
input,
|
||||
);
|
||||
const redirect = [301, 302, 303, 307, 308].includes(status);
|
||||
try {
|
||||
expect([...calls]).toEqual(
|
||||
redirect
|
||||
? [`/${String(status)}`, "/delivered.map"]
|
||||
: [`/${String(status)}`],
|
||||
|
||||
expect(calls).toEqual(
|
||||
followsRedirect
|
||||
? [`/${String(status)}`, "/delivered.map"]
|
||||
: [`/${String(status)}`],
|
||||
);
|
||||
expect(result.items[0]?.status).toBe(
|
||||
followsRedirect ? "included" : "fetch_failed",
|
||||
);
|
||||
if (!followsRedirect)
|
||||
expect(result.items[0]?.limitation).toBe(
|
||||
`Source-map server returned HTTP ${String(status)}.`,
|
||||
);
|
||||
expect(result.items[0]?.status).toBe(
|
||||
redirect ? "included" : "fetch_failed",
|
||||
} finally {
|
||||
server.closeAllConnections();
|
||||
if (server.listening)
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((error) =>
|
||||
error === undefined ? resolve() : reject(error),
|
||||
),
|
||||
);
|
||||
if (!redirect)
|
||||
expect(result.items[0]?.limitation).toBe(
|
||||
`Source-map server returned HTTP ${String(status)}.`,
|
||||
);
|
||||
} catch (cause) {
|
||||
failures.push(cause);
|
||||
}
|
||||
}
|
||||
if (failures.length > 0)
|
||||
throw new AggregateError(
|
||||
failures,
|
||||
"Nonredirect source-map responses were followed",
|
||||
);
|
||||
} finally {
|
||||
server.closeAllConnections();
|
||||
if (server.listening)
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((error) =>
|
||||
error === undefined ? resolve() : reject(error),
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
Reference in new issue
Block a user