Handle inline Paddle checkout responses
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-03 19:15:37 +01:00
parent bd6a8b9c7c
commit 8764915fcd

View File

@@ -49,14 +49,32 @@ test.describe('Paddle sandbox full flow (staging)', () => {
checkoutCta.click(),
]);
const checkoutPayload = await apiResponse.json();
const checkoutUrl: string = checkoutPayload.checkout_url ?? checkoutPayload.url ?? '';
const rawBody = await apiResponse.text();
let checkoutPayload: Record<string, unknown> | null = null;
try {
checkoutPayload = rawBody && rawBody.trim().startsWith('{') ? JSON.parse(rawBody) : null;
} catch {
checkoutPayload = null;
}
const inlineMode = checkoutPayload?.mode === 'inline' || checkoutPayload?.inline === true;
const checkoutUrl = extractCheckoutUrl(checkoutPayload, rawBody);
if (!inlineMode) {
expect(checkoutUrl).toContain('paddle');
}
// Navigate to Paddle hosted checkout and complete payment.
if (inlineMode) {
await expect(
page.getByText(/Checkout geöffnet|Checkout opened|Paddle-Checkout/i).first()
).toBeVisible({ timeout: 20_000 });
} else if (checkoutUrl) {
await page.goto(checkoutUrl);
await expect(page).toHaveURL(/paddle/);
} else {
throw new Error(`Missing Paddle checkout URL. Response: ${rawBody}`);
}
await completeHostedPaddleCheckout(page, sandboxCard);
@@ -178,6 +196,29 @@ async function completeHostedPaddleCheckout(
await payButton.click();
}
function extractCheckoutUrl(payload: Record<string, unknown> | null, rawBody: string): string | null {
if (payload) {
const directUrl = payload.checkout_url ?? payload.url ?? payload.checkoutUrl;
if (typeof directUrl === 'string') {
return directUrl;
}
}
const trimmed = rawBody.trim();
if (/^https?:\/\//i.test(trimmed)) {
return trimmed;
}
if (trimmed.startsWith('<')) {
const match = trimmed.match(/https?:\/\/["'a-zA-Z0-9._~:/?#@!$&'()*+,;=%-]+/);
if (match) {
return match[0];
}
}
return null;
}
function buildTenantEmail(): string | null {
const rawEmail = process.env.E2E_TENANT_EMAIL ?? process.env.E2E_PADDLE_EMAIL ?? null;
if (!rawEmail) {