import { expect, test } from "@playwright/test"; import { mockCoreApis } from "@e2e/fixtures/api-mocks"; import { paidImageDisplayMessageId, paidImageMessageId, } from "@e2e/fixtures/test-data"; import { clearBrowserState, completeVipPayment, defaultCharacterChatPath, dismissChatInterruptions, enterChatFromSplash, expectInsufficientCreditsDialog, expectVipChatSubscriptionUrl, submitEmailLogin, switchToEmailSignIn, } from "@e2e/fixtures/test-helpers"; const paidImageOverlayUrl = new RegExp( `${defaultCharacterChatPath}\\?image=${encodeURIComponent(paidImageDisplayMessageId)}$`, ); test.beforeEach(async ({ baseURL, context, page }) => { await clearBrowserState(context, page, baseURL); await mockCoreApis(page, { paidImageFlow: true, }); }); test("guest can unlock a paid image after email login and subscription payment", async ({ page, }) => { await enterChatFromSplash(page); await dismissChatInterruptions(page); const messageInput = page.getByRole("textbox", { name: "Message" }); await expect(messageInput).toBeVisible({ timeout: 10_000 }); await messageInput.fill("给我发图片"); const sendRequestPromise = page.waitForRequest("**/api/chat/send"); await messageInput.press("Enter"); const sendRequest = await sendRequestPromise; expect(sendRequest.postDataJSON()).toMatchObject({ message: "给我发图片", }); const paidImageButton = page.getByRole("button", { name: "Open image in fullscreen", }).last(); await expect(paidImageButton).toBeVisible(); await paidImageButton.click(); await expect(page).toHaveURL(paidImageOverlayUrl); const lockedImageDialog = page.getByRole("dialog", { name: "Locked fullscreen image", }); await expect(lockedImageDialog).toBeVisible(); await lockedImageDialog .getByRole("button", { name: "Unlock high-definition large image" }) .click(); await expect(page).toHaveURL(/\/auth\?redirect=/); expect(new URL(page.url()).searchParams.get("redirect")).toBe( `${defaultCharacterChatPath}?image=${encodeURIComponent(paidImageDisplayMessageId)}`, ); await switchToEmailSignIn(page); const unlockRequestPromise = page.waitForRequest( "**/api/chat/unlock-private", ); await submitEmailLogin(page, { expectedUrl: paidImageOverlayUrl, }); const unlockRequest = await unlockRequestPromise; expect(unlockRequest.postDataJSON()).toMatchObject({ messageId: paidImageMessageId, }); const insufficientCreditsDialog = await expectInsufficientCreditsDialog(page); await insufficientCreditsDialog .getByRole("button", { name: "Top up now" }) .click(); await expectVipChatSubscriptionUrl(page); await completeVipPayment(page); await expect(page).toHaveURL( new RegExp( `${defaultCharacterChatPath}(?:\\?image=${encodeURIComponent(paidImageDisplayMessageId)})?$`, ), ); expect(new URL(page.url()).pathname).toBe(defaultCharacterChatPath); await expect(page.getByRole("textbox", { name: "Message" })).toBeVisible(); });