mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-08-13 22:37:29 +00:00
Fallback invalid CoinPay checkout amounts (#42)
Co-authored-by: Codex Microtask Operator <codex-microtask@example.com>
This commit is contained in:
parent
ffefd364ce
commit
055cc09d14
2 changed files with 25 additions and 1 deletions
|
|
@ -221,6 +221,29 @@ describe("POST /api/hire-us/coinpay-checkout", () => {
|
||||||
expect(body.payment.checkout_url).toBe("https://checkout.stripe.test/card-only");
|
expect(body.payment.checkout_url).toBe("https://checkout.stripe.test/card-only");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("falls back when CoinPay returns an invalid checkout amount", async () => {
|
||||||
|
process.env.COINPAY_API_KEY = "cp_test_key";
|
||||||
|
process.env.COINPAY_API_URL = "https://coinpayportal.example";
|
||||||
|
process.env.COINPAY_BUSINESS_ID = "business-123";
|
||||||
|
process.env.COINPAY_ELIGIBILITY_MERCHANT_ID = "merchant-123";
|
||||||
|
|
||||||
|
vi.spyOn(globalThis, "fetch").mockImplementation(async (input) => {
|
||||||
|
const url = typeof input === "string" ? input : input.toString();
|
||||||
|
if (url.includes("/api/payments/merchant-eligibility")) {
|
||||||
|
return jsonResponse({ success: true, accepts_card: true, accepts_crypto: false, chains: [] });
|
||||||
|
}
|
||||||
|
return jsonResponse({ success: true, payment: { id: "pay_123", amount_usd: "not-a-number" } }, 201);
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await coinpayCheckout(
|
||||||
|
new NextRequest("http://localhost/api/hire-us/coinpay-checkout", { method: "POST", body: "{}" })
|
||||||
|
);
|
||||||
|
const body = await response.json();
|
||||||
|
|
||||||
|
expect(response.status).toBe(201);
|
||||||
|
expect(body.payment.amount_usd).toBe(250);
|
||||||
|
});
|
||||||
|
|
||||||
it("does not create checkout when no payment rail is available", async () => {
|
it("does not create checkout when no payment rail is available", async () => {
|
||||||
process.env.COINPAY_API_KEY = "cp_test_key";
|
process.env.COINPAY_API_KEY = "cp_test_key";
|
||||||
process.env.COINPAY_API_URL = "https://coinpayportal.example";
|
process.env.COINPAY_API_URL = "https://coinpayportal.example";
|
||||||
|
|
|
||||||
|
|
@ -70,12 +70,13 @@ export async function POST(request: NextRequest) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const payment = (payload.payment as Record<string, unknown>) || {};
|
const payment = (payload.payment as Record<string, unknown>) || {};
|
||||||
|
const amountUsd = Number(payment.amount_usd ?? payment.amount ?? 250);
|
||||||
return json(
|
return json(
|
||||||
{
|
{
|
||||||
success: true,
|
success: true,
|
||||||
payment: {
|
payment: {
|
||||||
id: payment.id,
|
id: payment.id,
|
||||||
amount_usd: Number(payment.amount_usd ?? payment.amount ?? 250),
|
amount_usd: Number.isFinite(amountUsd) ? amountUsd : 250,
|
||||||
payment_method: payment.stripe_checkout_url ? "card" : paymentRail.method,
|
payment_method: payment.stripe_checkout_url ? "card" : paymentRail.method,
|
||||||
currency: payment.currency ?? payment.blockchain ?? paymentRail.blockchain ?? paymentRail.currency,
|
currency: payment.currency ?? payment.blockchain ?? paymentRail.blockchain ?? paymentRail.currency,
|
||||||
crypto_amount: payment.amount_crypto ?? payment.crypto_amount ?? null,
|
crypto_amount: payment.amount_crypto ?? payment.crypto_amount ?? null,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue