132 lines
5.9 KiB
TypeScript
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);
|
|
});
|
|
});
|