import { describe, expect, it, vi } from "vitest";
import { deliverIssuedTicketSms } from "./db";

describe("ticket SMS delivery flow", () => {
  const input = {
    orderId: 42,
    attendeeName: "Ama Mensah",
    attendeePhone: "0552250838",
    eventTitle: "GNG Summit",
    quantity: 2,
  };

  it("records sending then sent when the provider accepts the confirmation", async () => {
    const statuses: string[] = [];
    const sender = vi.fn().mockResolvedValue(true);
    const sent = await deliverIssuedTicketSms(input, async (status) => statuses.push(status), sender);

    expect(sent).toBe(true);
    expect(sender).toHaveBeenCalledWith({ recipient: input.attendeePhone, attendeeName: input.attendeeName, eventTitle: input.eventTitle, orderId: input.orderId, quantity: input.quantity });
    expect(statuses).toEqual(["sending", "sent"]);
  });

  it("records failed without throwing when the provider rejects delivery", async () => {
    const statuses: string[] = [];
    const sent = await deliverIssuedTicketSms(input, async (status) => statuses.push(status), vi.fn().mockResolvedValue(false));

    expect(sent).toBe(false);
    expect(statuses).toEqual(["sending", "failed"]);
  });

  it("records failed when the provider throws so ticket issuance can remain non-blocking", async () => {
    const statuses: string[] = [];
    const sent = await deliverIssuedTicketSms(input, async (status) => statuses.push(status), vi.fn().mockRejectedValue(new Error("provider unavailable")));

    expect(sent).toBe(false);
    expect(statuses).toEqual(["sending", "failed"]);
  });
});

