import { describe, expect, it } from "vitest";
import { SECURITY_HEADERS } from "./headers";

/**
 * Security-Header (Definition of Done #8, Querschnittsstandard 1). Offline
 * lauffähig: prüft den statischen Header-Satz, der in next.config.ts
 * eingehängt wird. Die HTTP-seitige Verifikation (curl gegen Live-Server) ist
 * deferred (kein Server in der Sandbox) und in security-headers.spec.ts gegen
 * einen laufenden Server abgedeckt.
 */
describe("SECURITY_HEADERS", () => {
  it("setzt X-Frame-Options auf DENY", () => {
    expect(SECURITY_HEADERS["X-Frame-Options"]).toBe("DENY");
  });

  it("setzt X-Content-Type-Options auf nosniff", () => {
    expect(SECURITY_HEADERS["X-Content-Type-Options"]).toBe("nosniff");
  });

  it("setzt HSTS mit includeSubDomains", () => {
    const hsts = SECURITY_HEADERS["Strict-Transport-Security"];
    expect(hsts).toMatch(/max-age=\d+/);
    expect(hsts).toContain("includeSubDomains");
  });

  it("erlaubt Geolocation nur für self (Permissions-Policy)", () => {
    expect(SECURITY_HEADERS["Permissions-Policy"]).toContain(
      "geolocation=(self)",
    );
  });

  it("hat eine CSP mit default-src 'self', frame-ancestors 'none', form-action 'self'", () => {
    const csp = SECURITY_HEADERS["Content-Security-Policy"];
    expect(csp).toContain("default-src 'self'");
    expect(csp).toContain("frame-ancestors 'none'");
    expect(csp).toContain("form-action 'self'");
  });

  it("erlaubt img-src self/data/blob und worker-src self/blob (für Karten/Web-Worker)", () => {
    const csp = SECURITY_HEADERS["Content-Security-Policy"];
    expect(csp).toContain("img-src 'self' data: blob:");
    expect(csp).toContain("worker-src 'self' blob:");
  });

  it("setzt eine Referrer-Policy", () => {
    expect(SECURITY_HEADERS["Referrer-Policy"]).toBeTruthy();
  });
});
