revert(payment): remove unsupported Stripe and EzPay upgrade
Docker Image / Build and Push Docker Image (push) Successful in 2m15s
Docker Image / Build and Push Docker Image (push) Successful in 2m15s
This commit is contained in:
@@ -13,7 +13,6 @@ export interface MockCoreApisOptions {
|
||||
paidImageInsufficientCreditsFlow?: boolean;
|
||||
paidVoiceInsufficientCreditsFlow?: boolean;
|
||||
topUpHandoffFlow?: boolean;
|
||||
checkoutHandoffFlow?: boolean;
|
||||
}
|
||||
|
||||
export async function mockCoreApis(page: Page, options: MockCoreApisOptions = {}) {
|
||||
@@ -24,7 +23,6 @@ export async function mockCoreApis(page: Page, options: MockCoreApisOptions = {}
|
||||
paidImageInsufficientCreditsFlow: options.paidImageInsufficientCreditsFlow ?? false,
|
||||
paidVoiceInsufficientCreditsFlow: options.paidVoiceInsufficientCreditsFlow ?? false,
|
||||
topUpHandoffFlow: options.topUpHandoffFlow ?? false,
|
||||
checkoutHandoffFlow: options.checkoutHandoffFlow ?? false,
|
||||
};
|
||||
const chatState = { hasExpiredChatSend: false, paidImageRequested: false, paidImageUnlocked: false };
|
||||
|
||||
@@ -32,7 +30,6 @@ export async function mockCoreApis(page: Page, options: MockCoreApisOptions = {}
|
||||
chatSendTokenRefreshFlow: chatOptions.chatSendTokenRefreshFlow,
|
||||
isChatSendTokenExpired: () => chatState.hasExpiredChatSend,
|
||||
topUpHandoffFlow: chatOptions.topUpHandoffFlow,
|
||||
checkoutHandoffFlow: chatOptions.checkoutHandoffFlow,
|
||||
});
|
||||
await registerCharacterMocks(page);
|
||||
await registerUserMocks(page);
|
||||
|
||||
@@ -1,24 +1,15 @@
|
||||
import type { Page } from "@playwright/test";
|
||||
|
||||
import { apiEnvelope } from "../data/common";
|
||||
import { checkoutHandoffResponse, emailLoginResponse, guestLoginResponse, refreshedEmailLoginResponse, refreshedGuestLoginResponse, topUpHandoffResponse } from "../data/auth";
|
||||
import { emailLoginResponse, guestLoginResponse, refreshedEmailLoginResponse, refreshedGuestLoginResponse, topUpHandoffResponse } from "../data/auth";
|
||||
|
||||
export interface AuthMockState {
|
||||
chatSendTokenRefreshFlow: boolean;
|
||||
isChatSendTokenExpired: () => boolean;
|
||||
topUpHandoffFlow: boolean;
|
||||
checkoutHandoffFlow: boolean;
|
||||
}
|
||||
|
||||
export async function registerAuthMocks(page: Page, state: AuthMockState) {
|
||||
await page.route("**/api/auth/handoff/checkout/consume", async (route) => {
|
||||
if (!state.checkoutHandoffFlow) {
|
||||
await route.continue();
|
||||
return;
|
||||
}
|
||||
await route.fulfill({ json: apiEnvelope(checkoutHandoffResponse) });
|
||||
});
|
||||
|
||||
await page.route("**/api/auth/handoff/topup/consume", async (route) => {
|
||||
if (!state.topUpHandoffFlow) {
|
||||
await route.continue();
|
||||
|
||||
@@ -63,15 +63,3 @@ export const topUpHandoffResponse = {
|
||||
loginProvider: "facebook_messenger",
|
||||
},
|
||||
};
|
||||
|
||||
export const checkoutHandoffResponse = {
|
||||
token: "e2e-checkout-token",
|
||||
refreshToken: "e2e-checkout-refresh-token",
|
||||
loginStatus: "email",
|
||||
user: e2eEmailUser,
|
||||
checkoutIntent: {
|
||||
planId: "vip_monthly",
|
||||
autoRenew: true,
|
||||
commercialOfferId: "13ec8a10-58d7-4d24-b66b-8db5699a1aa8",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,17 +2,18 @@ import { expect, type Page } from "@playwright/test";
|
||||
|
||||
export async function completeVipPayment(page: Page) {
|
||||
const checkoutButton = page.getByRole("button", { name: "Pay and Top Up" });
|
||||
await expect(checkoutButton).toBeEnabled();
|
||||
|
||||
await checkoutButton.click();
|
||||
await expect(checkoutButton).toBeDisabled();
|
||||
await page.getByRole("button", { name: /Monthly,/i }).click();
|
||||
const renewalDialog = page.getByRole("dialog", {
|
||||
name: "Automatic Renewal Confirmation",
|
||||
});
|
||||
await expect(renewalDialog).toBeVisible();
|
||||
await renewalDialog.getByRole("button", { name: "Confirm" }).click();
|
||||
await expect(checkoutButton).toBeEnabled();
|
||||
|
||||
const createOrderRequestPromise = page.waitForRequest("**/api/payment/create-order");
|
||||
const orderStatusRequestPromise = page.waitForRequest("**/api/payment/order-status**");
|
||||
await renewalDialog.getByRole("button", { name: "Confirm" }).click();
|
||||
await checkoutButton.click();
|
||||
const createOrderRequest = await createOrderRequestPromise;
|
||||
expect(createOrderRequest.postDataJSON()).toMatchObject({ planId: "vip_monthly", payChannel: "stripe" });
|
||||
await orderStatusRequestPromise;
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
|
||||
import { mockCoreApis } from "@e2e/fixtures/api-mocks";
|
||||
import { apiEnvelope } from "@e2e/fixtures/data/common";
|
||||
import {
|
||||
clearBrowserState,
|
||||
seedEmailSession,
|
||||
} from "@e2e/fixtures/test-helpers";
|
||||
|
||||
const facebookAndroidUserAgent =
|
||||
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 " +
|
||||
"(KHTML, like Gecko) Version/4.0 Chrome/126.0.0.0 Mobile Safari/537.36 " +
|
||||
"[FB_IAB/FB4A;FBAV/566.0.0.48.73;]";
|
||||
const handoffToken = "checkout-handoff-token-that-is-at-least-32-characters";
|
||||
|
||||
test.use({
|
||||
userAgent: facebookAndroidUserAgent,
|
||||
viewport: { width: 390, height: 844 },
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ baseURL, context, page }) => {
|
||||
await clearBrowserState(context, page, baseURL);
|
||||
});
|
||||
|
||||
test("consumes the handoff, removes its token, and does not create an order", async ({
|
||||
page,
|
||||
}) => {
|
||||
await mockCoreApis(page, { checkoutHandoffFlow: true });
|
||||
let createOrderRequests = 0;
|
||||
page.on("request", (request) => {
|
||||
if (request.url().includes("/api/payment/create-order")) {
|
||||
createOrderRequests += 1;
|
||||
}
|
||||
});
|
||||
const consumeRequest = page.waitForRequest(
|
||||
"**/api/auth/handoff/checkout/consume",
|
||||
);
|
||||
|
||||
await page.goto(
|
||||
`/external-entry?target=checkout&character=nayeli&handoffToken=${encodeURIComponent(handoffToken)}`,
|
||||
);
|
||||
|
||||
expect((await consumeRequest).postDataJSON()).toEqual({ handoffToken });
|
||||
await expect(page).toHaveURL(
|
||||
/\/subscription\?planId=vip_monthly&autoRenew=1&character=nayeli&commercialOfferId=.*&payChannel=stripe/,
|
||||
);
|
||||
expect(page.url()).not.toContain("handoffToken");
|
||||
await expect.poll(() => createOrderRequests).toBe(0);
|
||||
await expect
|
||||
.poll(() =>
|
||||
page.evaluate(() => ({
|
||||
loginProvider: localStorage.getItem("cozsweet:login_provider"),
|
||||
loginToken: localStorage.getItem("cozsweet:login_token"),
|
||||
})),
|
||||
)
|
||||
.toEqual({ loginProvider: "email", loginToken: "e2e-checkout-token" });
|
||||
});
|
||||
|
||||
test("offers the Facebook external-browser path before creating a Stripe order", async ({
|
||||
page,
|
||||
}) => {
|
||||
await mockCoreApis(page);
|
||||
let createOrderRequests = 0;
|
||||
page.on("request", (request) => {
|
||||
if (request.url().includes("/api/payment/create-order")) {
|
||||
createOrderRequests += 1;
|
||||
}
|
||||
});
|
||||
await page.route("**/api/auth/handoff/checkout", async (route) => {
|
||||
await route.fulfill({
|
||||
json: apiEnvelope({
|
||||
externalUrl:
|
||||
"https://cozsweet.com/external-entry?target=checkout&handoffToken=opaque-token",
|
||||
expiresAt: "2026-07-28T16:00:00+00:00",
|
||||
}),
|
||||
});
|
||||
});
|
||||
|
||||
await seedEmailSession(page);
|
||||
await page.goto("/subscription?type=vip&payChannel=stripe&character=maya");
|
||||
await page.getByRole("button", { name: /Monthly,/i }).click();
|
||||
const externalButton = page.getByRole("button", {
|
||||
name: "Open in browser for more payment methods",
|
||||
});
|
||||
const paymentButton = page.getByRole("button", { name: "Pay and Top Up" });
|
||||
await expect(externalButton).toBeVisible();
|
||||
await expect(externalButton).toBeEnabled();
|
||||
await expect(paymentButton).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole("dialog", { name: "Automatic Renewal Confirmation" }),
|
||||
).toHaveCount(0);
|
||||
const externalBox = await externalButton.boundingBox();
|
||||
const paymentBox = await paymentButton.boundingBox();
|
||||
expect(externalBox).not.toBeNull();
|
||||
expect(paymentBox).not.toBeNull();
|
||||
expect(externalBox!.y).toBeLessThan(paymentBox!.y);
|
||||
expect(paymentBox!.y + paymentBox!.height).toBeLessThanOrEqual(844);
|
||||
const handoffRequest = page.waitForRequest("**/api/auth/handoff/checkout");
|
||||
await externalButton.click();
|
||||
expect((await handoffRequest).postDataJSON()).toMatchObject({
|
||||
planId: "vip_monthly",
|
||||
autoRenew: true,
|
||||
});
|
||||
expect(createOrderRequests).toBe(0);
|
||||
});
|
||||
@@ -232,11 +232,19 @@ test("Indonesia VIP defaults to QRIS and completes after status polling", async
|
||||
"true",
|
||||
);
|
||||
const checkoutButton = page.getByRole("button", { name: "Pay and Top Up" });
|
||||
await expect(checkoutButton).toBeEnabled();
|
||||
await expect(checkoutButton).toBeDisabled();
|
||||
await expectCheckoutButtonLayout(page);
|
||||
await expect(
|
||||
page.getByRole("dialog", { name: "Automatic Renewal Confirmation" }),
|
||||
).toHaveCount(0);
|
||||
|
||||
await page.getByRole("button", { name: /Monthly, 195900 IDR/i }).click();
|
||||
const renewalDialog = page.getByRole("dialog", {
|
||||
name: "Automatic Renewal Confirmation",
|
||||
});
|
||||
await expect(renewalDialog).toBeVisible();
|
||||
expect(payment.getCreateOrderCount()).toBe(0);
|
||||
|
||||
await renewalDialog.getByRole("button", { name: "Confirm" }).click();
|
||||
await expect(renewalDialog).toBeHidden();
|
||||
await expect(checkoutButton).toBeEnabled();
|
||||
expect(payment.getCreateOrderCount()).toBe(0);
|
||||
|
||||
const orderId = await expectQrisOrder(
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
|
||||
test("serves the VIP membership benefits agreement from the same site", async ({
|
||||
page,
|
||||
}) => {
|
||||
const response = await page.goto("/legal/vip-membership-benefits.html");
|
||||
|
||||
expect(response?.status()).toBe(200);
|
||||
await expect(
|
||||
page.getByRole("heading", { name: "VIP Membership Benefits Agreement" }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
test("serves the automatic renewal agreement from the same site", async ({
|
||||
page,
|
||||
}) => {
|
||||
const response = await page.goto("/legal/automatic-renewal.html");
|
||||
|
||||
expect(response?.status()).toBe(200);
|
||||
await expect(
|
||||
page.getByRole("heading", { name: "Automatic Renewal Agreement" }),
|
||||
).toBeVisible();
|
||||
});
|
||||
Reference in New Issue
Block a user