Initial Commit

This commit is contained in:
2026-05-27 23:47:53 +01:00
parent fbc70f96e6
commit 9b28db724f
18103 changed files with 1600554 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
import { describe, expect, it } from "@suaveplan/testing/runner";
import { HIBP_CODES } from "../error-codes.js";
import { HibpError } from "./hibp-error.js";
describe("HibpError", () => {
it("carries the code and message", { timeout: 5000 }, () => {
const err = new HibpError(HIBP_CODES.NOT_FOUND, "missing");
expect(err.code).toBe(HIBP_CODES.NOT_FOUND);
expect(err.message).toContain("missing");
expect(err.name).toBe("HibpError");
});
it("threads cause and context", { timeout: 5000 }, () => {
const cause = new Error("boom");
const err = new HibpError(HIBP_CODES.NETWORK_ERROR, "wrap", {
cause,
context: { url: "https://example.com" },
traceId: "t-1",
});
expect(err.cause).toBe(cause);
expect(err.context).toEqual({ url: "https://example.com" });
expect(err.traceId).toBe("t-1");
});
it("JSON form omits api key, email, password, and full hash", {
timeout: 5000,
}, () => {
const sha = "F3BBBE3A5FA0E1E81F4D9F3CC0E9D5B5B69E9C4F";
const err = new HibpError(
HIBP_CODES.NETWORK_ERROR,
`failed for user@example.com with hash ${sha} and key k_test`,
{ leakClass: "sha1" }
);
const json = JSON.stringify(err.toJSON());
expect(json).not.toContain(sha);
expect(json).not.toContain("user@example.com");
expect(json).toContain("HIBP.NETWORK_ERROR");
expect(json).toContain("[redacted]");
});
it("threads injectable clock", { timeout: 5000 }, () => {
const err = new HibpError(HIBP_CODES.ABORTED, "x", {
clock: () => 12345,
});
expect(err.timestamp).toBe(12345);
});
it("omits leakClass from JSON when absent", { timeout: 5000 }, () => {
const err = new HibpError(HIBP_CODES.NOT_FOUND, "x");
const json = err.toJSON();
expect(json.leakClass).toBeUndefined();
});
});