29 lines · 1.2 KB
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);
  });
});