import { describe, it, expect } from "vitest"; import { stripPrivateData } from "../src/functions/privacy.js"; describe("stripPrivateData", () => { it("strips private tags", () => { expect(stripPrivateData("hello secret world")).toBe( "hello [REDACTED] world", ); }); it("strips private tags case-insensitive", () => { expect(stripPrivateData("data")).toBe("[REDACTED]"); }); it("strips API keys", () => { expect(stripPrivateData("api_key=sk-ant-1234567890abcdefghij")).toBe( "[REDACTED_SECRET]", ); }); it("strips GitHub PATs", () => { expect( stripPrivateData("token: ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh"), ).toBe("[REDACTED_SECRET]"); }); it("strips standalone GitHub PATs", () => { expect( stripPrivateData("found ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij here"), ).toBe("found [REDACTED_SECRET] here"); }); it("strips Slack tokens", () => { expect(stripPrivateData("xoxb-123456-789012-abcdef")).toBe( "[REDACTED_SECRET]", ); }); it("strips AWS access keys", () => { expect(stripPrivateData("key=AKIAIOSFODNN7EXAMPLE")).toBe( "key=[REDACTED_SECRET]", ); }); it("strips JWT tokens", () => { expect( stripPrivateData( "eyJhbGciOiJIUzI1.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.SflKxwRJSMeKKF2QT4fwpM", ), ).toBe("[REDACTED_SECRET]"); }); it("strips sk- prefixed keys", () => { expect(stripPrivateData("sk-1234567890abcdefghijklmnopqr")).toBe( "[REDACTED_SECRET]", ); }); it("strips OpenAI project keys", () => { expect( stripPrivateData("sk-proj-1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJ"), ).toBe("[REDACTED_SECRET]"); }); it("strips GitHub fine-grained service tokens", () => { expect( stripPrivateData("ghs_1234567890abcdefghijklmnopqrstuvwxyzAB"), ).toBe("[REDACTED_SECRET]"); }); it("strips bearer tokens", () => { expect( stripPrivateData( "Authorization: Bearer sk-proj-1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJ", ), ).toBe("Authorization: [REDACTED_SECRET]"); }); it("handles multiple secrets in one string", () => { const input = "sk-abcdefghijklmnopqrstuv and ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij"; const result = stripPrivateData(input); expect(result).not.toContain("sk-"); expect(result).not.toContain("ghp_"); }); it("does not strip short strings", () => { expect(stripPrivateData("api_key=short")).toBe("api_key=short"); }); it("returns empty string unchanged", () => { expect(stripPrivateData("")).toBe(""); }); it("handles no secrets gracefully", () => { expect(stripPrivateData("normal text without secrets")).toBe( "normal text without secrets", ); }); it("works correctly on consecutive calls (no regex statefulness)", () => { const input = "sk-ABCDEFGHIJKLMNOPQRSTUVWXYZabc"; expect(stripPrivateData(input)).toBe("[REDACTED_SECRET]"); expect(stripPrivateData(input)).toBe("[REDACTED_SECRET]"); expect(stripPrivateData(input)).toBe("[REDACTED_SECRET]"); }); });