Handle inline Paddle checkout responses
This commit is contained in:
@@ -49,14 +49,32 @@ test.describe('Paddle sandbox full flow (staging)', () => {
|
|||||||
checkoutCta.click(),
|
checkoutCta.click(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const checkoutPayload = await apiResponse.json();
|
const rawBody = await apiResponse.text();
|
||||||
const checkoutUrl: string = checkoutPayload.checkout_url ?? checkoutPayload.url ?? '';
|
let checkoutPayload: Record<string, unknown> | null = null;
|
||||||
|
try {
|
||||||
|
checkoutPayload = rawBody && rawBody.trim().startsWith('{') ? JSON.parse(rawBody) : null;
|
||||||
|
} catch {
|
||||||
|
checkoutPayload = null;
|
||||||
|
}
|
||||||
|
|
||||||
expect(checkoutUrl).toContain('paddle');
|
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.
|
// Navigate to Paddle hosted checkout and complete payment.
|
||||||
await page.goto(checkoutUrl);
|
if (inlineMode) {
|
||||||
await expect(page).toHaveURL(/paddle/);
|
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);
|
await completeHostedPaddleCheckout(page, sandboxCard);
|
||||||
|
|
||||||
@@ -178,6 +196,29 @@ async function completeHostedPaddleCheckout(
|
|||||||
await payButton.click();
|
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 {
|
function buildTenantEmail(): string | null {
|
||||||
const rawEmail = process.env.E2E_TENANT_EMAIL ?? process.env.E2E_PADDLE_EMAIL ?? null;
|
const rawEmail = process.env.E2E_TENANT_EMAIL ?? process.env.E2E_PADDLE_EMAIL ?? null;
|
||||||
if (!rawEmail) {
|
if (!rawEmail) {
|
||||||
|
|||||||
Reference in New Issue
Block a user