Initial Commit

This commit is contained in:
2026-05-27 23:29:53 +01:00
commit fbc70f96e6
10000 changed files with 1102152 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
import { describe, expect, it } from "@suaveplan/testing/runner";
import { SmsError } from "./legacy-errors.js";
describe("SmsError legacy class", () => {
it("factory methods return the right code", { timeout: 5000 }, () => {
expect(SmsError.invalidPhoneNumber("bad").code).toBe(
"SMS_INVALID_PHONE_NUMBER"
);
expect(SmsError.sendFailed("m1").code).toBe("SMS_SEND_FAILED");
expect(SmsError.templateNotFound("t").code).toBe(
"SMS_TEMPLATE_NOT_FOUND"
);
expect(SmsError.recipientOptedOut("+15551234567").code).toBe(
"SMS_RECIPIENT_OPTED_OUT"
);
expect(SmsError.providerNotConfigured().code).toBe(
"SMS_PROVIDER_NOT_CONFIGURED"
);
});
it("isSmsError narrows the type", { timeout: 5000 }, () => {
const e = SmsError.invalidPhoneNumber("bad");
expect(SmsError.isSmsError(e)).toBe(true);
expect(SmsError.isSmsError(new Error("x"))).toBe(false);
expect(SmsError.isSmsError("string")).toBe(false);
});
it("carries phoneNumber context for invalidPhoneNumber", {
timeout: 5000,
}, () => {
const e = SmsError.invalidPhoneNumber("bad-phone");
expect(e.context).toEqual({ phoneNumber: "bad-phone" });
});
it("carries messageId context for sendFailed", { timeout: 5000 }, () => {
const cause = new Error("net");
const e = SmsError.sendFailed("m1", cause);
expect(e.context).toEqual({ messageId: "m1" });
expect(e.cause).toBe(cause);
});
it("sendFailed without cause omits cause property", {
timeout: 5000,
}, () => {
const e = SmsError.sendFailed("m1");
expect(e.cause).toBeUndefined();
});
it("templateNotFound carries templateId context", {
timeout: 5000,
}, () => {
const e = SmsError.templateNotFound("welcome");
expect(e.context).toEqual({ templateId: "welcome" });
});
it("recipientOptedOut carries phoneNumber context", {
timeout: 5000,
}, () => {
const e = SmsError.recipientOptedOut("+15551234567");
expect(e.context).toEqual({ phoneNumber: "+15551234567" });
});
it("constructor with custom context", { timeout: 5000 }, () => {
const e = new SmsError({
message: "custom",
code: "SMS_SEND_FAILED",
context: { providerId: "twilio" },
});
expect(e.name).toBe("SmsError");
expect(e.context).toEqual({ providerId: "twilio" });
});
it("constructor without context defaults to empty object", {
timeout: 5000,
}, () => {
const e = new SmsError({
message: "custom",
code: "SMS_SEND_FAILED",
});
expect(e.context).toEqual({});
});
});