From 154e6fa751de77d7ff9c907a75f3f7359bbb5b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 21 May 2026 22:43:00 +0200 Subject: [PATCH] test(auth): mock checkAuthSurfaceRateLimit in login + register tests W6's auth-route tests mocked checkRateLimit. W13's M-4 wrapped the auth surfaces with checkAuthSurfaceRateLimit so the un-mocked wrapper resolved as undefined at runtime and the routes 500'd instead of returning 401/422. Adding the wrapper to the mock factories + arming it in beforeEach restores green. --- src/app/api/auth/login/__tests__/route.test.ts | 18 +++++++++++++++++- .../api/auth/register/__tests__/route.test.ts | 7 ++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/app/api/auth/login/__tests__/route.test.ts b/src/app/api/auth/login/__tests__/route.test.ts index 785b30601..8d926404e 100644 --- a/src/app/api/auth/login/__tests__/route.test.ts +++ b/src/app/api/auth/login/__tests__/route.test.ts @@ -33,6 +33,12 @@ vi.mock("@/lib/rate-limit", () => ({ checkRateLimit: vi .fn() .mockResolvedValue({ allowed: true, remaining: 5, reset: 0 }), + checkAuthSurfaceRateLimit: vi.fn().mockResolvedValue({ + allowed: true, + remaining: 5, + reset: 0, + ip: "1.2.3.4", + }), rateLimitHeaders: vi.fn(() => ({})), })); @@ -61,7 +67,11 @@ import { POST } from "../route"; import { prisma } from "@/lib/db"; import { verifyPassword } from "@/lib/auth/password"; import { auditLog } from "@/lib/auth/audit"; -import { checkRateLimit, rateLimitHeaders } from "@/lib/rate-limit"; +import { + checkRateLimit, + checkAuthSurfaceRateLimit, + rateLimitHeaders, +} from "@/lib/rate-limit"; import { ensureDbCompatibility } from "@/lib/db-compat"; const TYPED_EMAIL = "leaked-identifier@example.com"; @@ -84,6 +94,12 @@ beforeEach(() => { remaining: 5, reset: 0, } as never); + vi.mocked(checkAuthSurfaceRateLimit).mockResolvedValue({ + allowed: true, + remaining: 5, + reset: 0, + ip: "1.2.3.4", + } as never); vi.mocked(rateLimitHeaders).mockReturnValue({} as never); vi.mocked(ensureDbCompatibility).mockResolvedValue(undefined); }); diff --git a/src/app/api/auth/register/__tests__/route.test.ts b/src/app/api/auth/register/__tests__/route.test.ts index 47c2aac30..5e1f3bfcd 100644 --- a/src/app/api/auth/register/__tests__/route.test.ts +++ b/src/app/api/auth/register/__tests__/route.test.ts @@ -32,6 +32,7 @@ vi.mock("@/lib/auth/audit", () => ({ vi.mock("@/lib/rate-limit", () => ({ checkRateLimit: vi.fn(), + checkAuthSurfaceRateLimit: vi.fn(), rateLimitHeaders: () => ({}), })); @@ -58,7 +59,7 @@ vi.mock("next/headers", () => ({ })); import { POST } from "../route"; -import { checkRateLimit } from "@/lib/rate-limit"; +import { checkRateLimit, checkAuthSurfaceRateLimit } from "@/lib/rate-limit"; function postReq(body: unknown): NextRequest { return new NextRequest("http://localhost/api/auth/register", { @@ -71,6 +72,10 @@ function postReq(body: unknown): NextRequest { beforeEach(() => { vi.resetAllMocks(); vi.mocked(checkRateLimit).mockResolvedValue({ allowed: true } as never); + vi.mocked(checkAuthSurfaceRateLimit).mockResolvedValue({ + allowed: true, + ip: "1.2.3.4", + } as never); }); describe("POST /api/auth/register — 422 multi-issue (v1.4.43 W6)", () => {