import { describe, expect, test } from "bun:test"; import { evaluateCaptchaRisk, shouldRequireCaptcha, validCaptchaGrant } from "../src/policy.ts"; describe("adaptive CAPTCHA policy", () => { test("raises risk from automation signals", () => { const result = evaluateCaptchaRisk({ failedAttempts: 3, completionMs: 200, suspiciousHeaders: true, }); expect(result.challenge).toBe(true); expect(result.reasons).toContain("too-fast"); }); test("honours explicit policy actions", () => { expect(shouldRequireCaptcha("signup", { alwaysForActions: ["signup"] }).challenge).toBe(true); expect(shouldRequireCaptcha("health", { neverForActions: ["health"] }).challenge).toBe(false); }); test("accepts an unexpired route grant", () => { const grant = validCaptchaGrant( [{ action: "page", routeGroup: "/reports", provider: "self-hosted", expiresAt: 200 }], "page", 100, "/reports", ); expect(grant?.provider).toBe("self-hosted"); }); });