Initial Commit
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user