39 lines · 1.4 KB
import { describe, expect, mock, test } from "bun:test";

mock.module("cloudflare:workers", () => ({ env: {} }));
mock.module("./db", () => ({ run: async () => ({ meta: { changes: 0 } }) }));

const { securityTxt } = await import("./legal");

const base = {
  forgeName: "gitfor",
  publicUrl: "https://gitfor.dev/",
  entity: null,
  contactEmail: "legal@gitfor.dev",
  address: null,
  jurisdiction: null,
  dmcaEmail: null,
  securityEmail: null,
  supportEmail: null,
  draft: true,
};

describe("securityTxt", () => {
  test("emits RFC 9116 fields with Expires one year out", () => {
    const now = Date.UTC(2026, 9, 12);
    const body = securityTxt({ ...base, securityEmail: "security@gitfor.dev" }, now);
    expect(body).toContain("Contact: mailto:security@gitfor.dev\n");
    expect(body).toContain("Expires: 2027-10-11T00:00:00Z\n");
    expect(body).toContain("Policy: https://gitfor.dev/security\n");
    expect(body).toContain("Canonical: https://gitfor.dev/.well-known/security.txt\n");
    expect(body).toContain("Preferred-Languages: en\n");
  });

  test("falls back to the legal contact, and publishes nothing without any contact", () => {
    expect(securityTxt(base, 0)).toContain("Contact: mailto:legal@gitfor.dev");
    const bare = securityTxt({ ...base, contactEmail: null }, 0);
    expect(bare).toContain("Contact: https://gitfor.dev/security");
    expect(securityTxt({ ...base, contactEmail: null, publicUrl: "" }, 0)).toBeNull();
  });
});