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); }); });