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({}); }); });