import { describe, expect, mock, test } from "bun:test";
mock.module("cloudflare:workers", () => ({ env: {}, waitUntil: () => undefined }));
const { ensureSecurityHeaders, hardenScratchResponse, isUpgrade } = await import("./harden");
/** Bun's Response refuses status 101 like workerd's constructor does, so fake the upgrade response's shape. */
function upgrade(): Response {
const response = new Response(null, { headers: { "content-type": "text/html" } });
Object.defineProperty(response, "status", { value: 101 });
Object.defineProperty(response, "webSocket", { value: { accept: () => undefined } });
return response;
}
describe("WebSocket upgrades", () => {
test("pass through scratch hardening and claimed-site headers untouched, webSocket included", () => {
const response = upgrade();
expect(isUpgrade(response)).toBe(true);
expect(hardenScratchResponse(response)).toBe(response);
expect(ensureSecurityHeaders(response)).toBe(response);
});
test("a response carrying only webSocket counts as an upgrade", () => {
const response = new Response(null);
Object.defineProperty(response, "webSocket", { value: {} });
expect(isUpgrade(response)).toBe(true);
expect(isUpgrade(new Response("ok"))).toBe(false);
});
});