import { describe, it, expect } from "vitest"; import { beforeSend, beforeSendTransaction, } from "@repo/core-shared/instrumentation/sentry/scrub"; describe("R38 — apps/web-next PII scrubber", () => { it("strips email/password/cookie/auth/IP from event payload", () => { const event = { extra: { userEmail: "alice@example.com", password: "p4$$w0rd", ipAddress: "192.168.1.10", note: "request from 10.0.0.1", }, request: { headers: { Authorization: "Bearer secret", "Set-Cookie": "session=abc", "User-Agent": "Mozilla", }, }, } as Parameters[0]; const result = beforeSend(event, {}) as { extra: Record; request: { headers: Record }; }; expect(result.extra["userEmail"]).toBe("[redacted]"); expect(result.extra["password"]).toBe("[redacted]"); expect(result.extra["ipAddress"]).toBe("[redacted]"); expect(result.extra["note"]).toContain("[redacted-ip]"); expect(result.request.headers["Authorization"]).toBe("[redacted]"); expect(result.request.headers["Set-Cookie"]).toBe("[redacted]"); expect(result.request.headers["User-Agent"]).toBe("Mozilla"); }); it("strips ?token / ?email / ?password / ?secret / ?signature from URLs", () => { const event = { request: { url: "https://app/api/x?token=abc&email=a@b.c&password=p&secret=z&signature=s&safe=1", }, transaction: "/foo?accessToken=t", } as Parameters[0]; const result = beforeSendTransaction(event, {}) as { request: { url: string }; transaction: string; }; const url = decodeURIComponent(result.request.url); const txn = decodeURIComponent(result.transaction); for (const key of ["token", "email", "password", "secret", "signature"]) { expect(url).toContain(`${key}=[redacted]`); } expect(url).toContain("safe=1"); expect(txn).toContain("accessToken=[redacted]"); }); });