import { describe, expect, it, vi } from "vitest"; import { getPaymentUrl, getStripeClientSecret, isEzpayPayment, launchEzpayRedirect, resolveEzpayLaunchTarget, } from "../payment_launch"; describe("payment launch helpers", () => { it("extracts supported redirect urls from payment params", () => { expect(getPaymentUrl({ cashier_url: "https://pay.example/cashier" })).toBe( "https://pay.example/cashier", ); expect(getPaymentUrl({ checkoutUrl: "https://pay.example/checkout" })).toBe( "https://pay.example/checkout", ); expect(getPaymentUrl({ url: "" })).toBeNull(); }); it("detects ezpay provider case-insensitively", () => { expect(isEzpayPayment({ provider: "ezpay" })).toBe(true); expect(isEzpayPayment({ provider: "EZPAY" })).toBe(true); expect(isEzpayPayment({ provider: "stripe" })).toBe(false); }); it("extracts stripe client secrets only for stripe-like providers", () => { expect( getStripeClientSecret({ provider: "stripe", clientSecret: "pi_secret", }), ).toBe("pi_secret"); expect(getStripeClientSecret({ client_secret: "pi_secret_snake" })).toBe( "pi_secret_snake", ); expect( getStripeClientSecret({ provider: "ezpay", clientSecret: "pi_secret", }), ).toBeNull(); }); it("resolves Ezpay URL and QR launch parameters without treating QR data as a URL", () => { expect( resolveEzpayLaunchTarget({ provider: "ezpay", channelType: "URL", payData: "https://pay.example/qris", }), ).toEqual({ kind: "url", paymentUrl: "https://pay.example/qris" }); expect( resolveEzpayLaunchTarget({ provider: "ezpay", channelType: "QR", payData: "00020101021226670016COM.NOBUBANK.WWW", }), ).toEqual({ kind: "qr", qrData: "00020101021226670016COM.NOBUBANK.WWW", }); expect( resolveEzpayLaunchTarget({ provider: "ezpay", channelType: "QR", payData: "", }), ).toEqual({ kind: "error", errorMessage: "QRIS payment data is missing. Please try again.", }); }); it("rejects VA and unknown Ezpay channel types with explicit errors", () => { expect( resolveEzpayLaunchTarget({ provider: "ezpay", channelType: "VA" }), ).toEqual({ kind: "error", errorMessage: "Virtual account payments are not supported in this app.", }); expect( resolveEzpayLaunchTarget({ provider: "ezpay", channelType: "OTHER" }), ).toEqual({ kind: "error", errorMessage: "Unsupported Ezpay payment channel: OTHER.", }); }); it("reports a launch failure before redirecting without an order id", async () => { const onOpened = vi.fn(); const onFailed = vi.fn(); await launchEzpayRedirect({ orderId: null, paymentUrl: "https://pay.example/checkout?token=secret", subscriptionType: "topup", onOpened, onFailed, }); expect(onOpened).not.toHaveBeenCalled(); expect(onFailed).toHaveBeenCalledWith( "Missing order id before opening Ezpay.", ); }); });