74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import { SuaveplanError } from "@suaveplan/error";
|
|
import { describe, expect, it } from "@suaveplan/testing/runner";
|
|
import { SEED_CODES, SeedError } from "./error-codes.js";
|
|
|
|
describe("SEED_CODES registry", () => {
|
|
it("declares every required code with namespaced value", () => {
|
|
expect(SEED_CODES.DUPLICATE_NAME).toBe("SEED.DUPLICATE_NAME");
|
|
expect(SEED_CODES.UNREGISTERED_DEPENDENCY).toBe(
|
|
"SEED.UNREGISTERED_DEPENDENCY"
|
|
);
|
|
expect(SEED_CODES.CIRCULAR_DEPENDENCY).toBe("SEED.CIRCULAR_DEPENDENCY");
|
|
expect(SEED_CODES.DEPENDENCY_DEPTH_EXCEEDED).toBe(
|
|
"SEED.DEPENDENCY_DEPTH_EXCEEDED"
|
|
);
|
|
expect(SEED_CODES.INVALID_CONFIG).toBe("SEED.INVALID_CONFIG");
|
|
expect(SEED_CODES.STORE_ERROR).toBe("SEED.STORE_ERROR");
|
|
expect(SEED_CODES.ABORTED).toBe("SEED.ABORTED");
|
|
});
|
|
|
|
it("registry is frozen", () => {
|
|
expect(Object.isFrozen(SEED_CODES)).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("SeedError", () => {
|
|
it("every SEED.* code is reachable from a call site", () => {
|
|
for (const code of Object.values(SEED_CODES)) {
|
|
const err = new SeedError(code, `test ${code}`);
|
|
expect(err.code).toBe(code);
|
|
expect(err).toBeInstanceOf(SuaveplanError);
|
|
expect(err).toBeInstanceOf(SeedError);
|
|
expect(err).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it("SeedError preserves cause and SuaveplanError contract", () => {
|
|
const root = new Error("underlying boom");
|
|
const err = new SeedError(SEED_CODES.STORE_ERROR, "wrap", {
|
|
cause: root,
|
|
});
|
|
expect(err.cause).toBe(root);
|
|
expect(err.code).toBe("SEED.STORE_ERROR");
|
|
expect(err.timestamp).toBeTypeOf("number");
|
|
expect(err.message).toBe("wrap");
|
|
});
|
|
|
|
it("exposes seedName discriminant when provided", () => {
|
|
const err = new SeedError(SEED_CODES.DUPLICATE_NAME, "dup", {
|
|
seedName: "users",
|
|
});
|
|
expect(err.seedName).toBe("users");
|
|
expect(err.dependency).toBeUndefined();
|
|
});
|
|
|
|
it("exposes dependency discriminant when provided", () => {
|
|
const err = new SeedError(
|
|
SEED_CODES.UNREGISTERED_DEPENDENCY,
|
|
"missing",
|
|
{
|
|
seedName: "posts",
|
|
dependency: "users",
|
|
}
|
|
);
|
|
expect(err.seedName).toBe("posts");
|
|
expect(err.dependency).toBe("users");
|
|
});
|
|
|
|
it("omits discriminants when not provided", () => {
|
|
const err = new SeedError(SEED_CODES.INVALID_CONFIG, "bad config");
|
|
expect(err.seedName).toBeUndefined();
|
|
expect(err.dependency).toBeUndefined();
|
|
});
|
|
});
|