nac-presale/server/fiatPayment.test.ts

132 lines
5.9 KiB
TypeScript

/**
* Fiat Payment Services — Unit Tests
* Tests for Alipay, WeChat Pay, and PayPal service helper functions.
* All external API calls are mocked; no real credentials required.
*/
import { describe, it, expect, vi, beforeEach } from "vitest";
// ─── Mock DB ──────────────────────────────────────────────────────────────────
vi.mock("./db", () => ({
getDb: vi.fn().mockResolvedValue(null),
}));
vi.mock("./tokenDistributionService", () => ({
creditXic: vi.fn().mockResolvedValue({ success: true, alreadyProcessed: false }),
calcXicAmount: vi.fn().mockImplementation((usd: number) => Math.floor(usd / 0.02)),
}));
// ─── Alipay Tests ─────────────────────────────────────────────────────────────
describe("alipayService", () => {
it("generateAlipayOrderId returns ALIPAY- prefixed string", async () => {
const { generateAlipayOrderId } = await import("./services/alipayService");
const id = generateAlipayOrderId();
expect(id).toMatch(/^ALIPAY-\d+-[A-Z0-9]+$/);
});
it("generateAlipayOrderId is unique on each call", async () => {
const { generateAlipayOrderId } = await import("./services/alipayService");
const ids = new Set(Array.from({ length: 100 }, () => generateAlipayOrderId()));
expect(ids.size).toBe(100);
});
it("createAlipayOrder returns error when DB unavailable", async () => {
const { createAlipayOrder } = await import("./services/alipayService");
const result = await createAlipayOrder({
orderId: "ALIPAY-TEST-001",
subject: "Test",
totalAmount: "100.00",
xicReceiveAddress: "0x1234567890abcdef1234567890abcdef12345678",
});
// DB is mocked to return null, so should fail gracefully
expect(result.success).toBe(false);
expect(result.error).toBeDefined();
});
});
// ─── WeChat Pay Tests ─────────────────────────────────────────────────────────
describe("wechatPayService", () => {
it("generateWechatOrderId returns WECHAT- prefixed string", async () => {
const { generateWechatOrderId } = await import("./services/wechatPayService");
const id = generateWechatOrderId();
expect(id).toMatch(/^WECHAT-\d+-[A-Z0-9]+$/);
});
it("generateWechatOrderId is unique on each call", async () => {
const { generateWechatOrderId } = await import("./services/wechatPayService");
const ids = new Set(Array.from({ length: 100 }, () => generateWechatOrderId()));
expect(ids.size).toBe(100);
});
it("createWechatOrder returns error when DB unavailable", async () => {
const { createWechatOrder } = await import("./services/wechatPayService");
const result = await createWechatOrder({
orderId: "WECHAT-TEST-001",
description: "Test",
totalFen: 10000,
xicReceiveAddress: "0x1234567890abcdef1234567890abcdef12345678",
payType: "NATIVE",
});
expect(result.success).toBe(false);
expect(result.error).toBeDefined();
});
});
// ─── PayPal Tests ─────────────────────────────────────────────────────────────
describe("paypalService", () => {
it("generatePaypalOrderId returns PAYPAL- prefixed string", async () => {
const { generatePaypalOrderId } = await import("./services/paypalService");
const id = generatePaypalOrderId();
expect(id).toMatch(/^PAYPAL-\d+-[A-Z0-9]+$/);
});
it("generatePaypalOrderId is unique on each call", async () => {
const { generatePaypalOrderId } = await import("./services/paypalService");
const ids = new Set(Array.from({ length: 100 }, () => generatePaypalOrderId()));
expect(ids.size).toBe(100);
});
it("createPaypalOrder returns error when DB unavailable", async () => {
const { createPaypalOrder } = await import("./services/paypalService");
const result = await createPaypalOrder({
orderId: "PAYPAL-TEST-001",
usdAmount: "100.00",
xicReceiveAddress: "0x1234567890abcdef1234567890abcdef12345678",
});
expect(result.success).toBe(false);
expect(result.error).toBeDefined();
});
});
// ─── tokenDistributionService.calcXicAmount ───────────────────────────────────
describe("calcXicAmount (mocked)", () => {
it("calculates XIC correctly at $0.02/XIC", async () => {
const { calcXicAmount } = await import("./tokenDistributionService");
expect(calcXicAmount(100)).toBe(5000);
expect(calcXicAmount(1000)).toBe(50000);
expect(calcXicAmount(0.02)).toBe(1);
});
});
// ─── Order ID Format Validation ───────────────────────────────────────────────
describe("Order ID format", () => {
it("all order IDs have correct prefix format", async () => {
const { generateAlipayOrderId } = await import("./services/alipayService");
const { generateWechatOrderId } = await import("./services/wechatPayService");
const { generatePaypalOrderId } = await import("./services/paypalService");
const alipay = generateAlipayOrderId();
const wechat = generateWechatOrderId();
const paypal = generatePaypalOrderId();
expect(alipay.startsWith("ALIPAY-")).toBe(true);
expect(wechat.startsWith("WECHAT-")).toBe(true);
expect(paypal.startsWith("PAYPAL-")).toBe(true);
// All should be under 64 chars (DB constraint)
expect(alipay.length).toBeLessThanOrEqual(64);
expect(wechat.length).toBeLessThanOrEqual(64);
expect(paypal.length).toBeLessThanOrEqual(64);
});
});