import { expect, test } from "bun:test"; import { evaluateAuthRisk } from "../src/risk.ts"; test("risk scoring escalates CAPTCHA, MFA, and blocking", () => { expect(evaluateAuthRisk({ failedAttempts: 2 })).toMatchObject({ level: "low", requireCaptcha: false, }); expect(evaluateAuthRisk({ failedAttempts: 3, unfamiliarDevice: true })).toMatchObject({ requireCaptcha: true, }); expect( evaluateAuthRisk({ unusualIp: true, impossibleTravel: true, unfamiliarDevice: true }), ).toMatchObject({ requireMfa: true }); expect(evaluateAuthRisk({ accountLocked: true })).toMatchObject({ block: true, level: "critical", }); }); test("risk scoring remains finite for malformed numeric signals and policy", () => { const result = evaluateAuthRisk( { customScore: Number.NaN, failedAttempts: Number.POSITIVE_INFINITY }, { captchaThreshold: Number.NaN, mfaThreshold: Number.POSITIVE_INFINITY, blockThreshold: -10, }, ); expect(result.score).toBe(0); expect(result.level).toBe("low"); expect(result.requireCaptcha).toBe(false); expect(result.requireMfa).toBe(false); expect(result.block).toBe(true); });