feat(chat): render commercial actions and persist greetings
This commit is contained in:
@@ -20,6 +20,23 @@ export interface ChatMockState {
|
||||
export async function registerChatMocks(page: Page, options: ChatMockOptions, state: ChatMockState) {
|
||||
let sendCount = 0;
|
||||
|
||||
await page.route("**/api/chat/opening-message", async (route) => {
|
||||
const body = route.request().postDataJSON() as {
|
||||
openingMessage?: unknown;
|
||||
} | undefined;
|
||||
await route.fulfill({
|
||||
json: apiEnvelope({
|
||||
messageId: "mock-opening-message",
|
||||
created: true,
|
||||
openingMessage:
|
||||
typeof body?.openingMessage === "string"
|
||||
? body.openingMessage
|
||||
: "Hello",
|
||||
createdAt: "2026-07-23T00:00:00Z",
|
||||
}),
|
||||
});
|
||||
});
|
||||
|
||||
await page.route("**/api/chat/history**", async (route) => {
|
||||
const response = options.paidVoiceInsufficientCreditsFlow
|
||||
? paidVoiceHistoryResponse
|
||||
@@ -44,7 +61,21 @@ export async function registerChatMocks(page: Page, options: ChatMockOptions, st
|
||||
await route.fulfill({ status: 401, json: { message: "expired" } });
|
||||
return;
|
||||
}
|
||||
const response = options.paidImageFlow && message.includes("给我发图片")
|
||||
const response = message.includes("private album offer test")
|
||||
? {
|
||||
...chatSendResponse,
|
||||
reply: "You always know how to make me smile.",
|
||||
messageId: "commercial-action-message",
|
||||
commercialAction: {
|
||||
actionId: "commercial-action-1",
|
||||
type: "privateAlbumOffer",
|
||||
copy: "There are more private photos waiting for you.",
|
||||
ctaLabel: "Open private zone",
|
||||
target: "privateZone",
|
||||
ruleId: "private_album_after_appearance_praise",
|
||||
},
|
||||
}
|
||||
: options.paidImageFlow && message.includes("给我发图片")
|
||||
? paidImageChatSendResponse
|
||||
: options.chatLimitTriggerAt != null && sendCount >= options.chatLimitTriggerAt
|
||||
? createWeeklyLimitChatSendResponse(sendCount, options.chatLimitTriggerAt)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
|
||||
import { mockCoreApis } from "@e2e/fixtures/api-mocks";
|
||||
import {
|
||||
clearBrowserState,
|
||||
enterChatFromSplash,
|
||||
} from "@e2e/fixtures/test-helpers";
|
||||
|
||||
test.beforeEach(async ({ baseURL, context, page }) => {
|
||||
await clearBrowserState(context, page, baseURL);
|
||||
await mockCoreApis(page);
|
||||
});
|
||||
|
||||
test("renders a backend commercial action and opens the private zone", async ({
|
||||
page,
|
||||
}) => {
|
||||
await enterChatFromSplash(page);
|
||||
|
||||
const input = page.getByRole("textbox", { name: "Message" });
|
||||
await expect(input).toBeEnabled();
|
||||
await input.fill("private album offer test");
|
||||
await input.press("Enter");
|
||||
|
||||
const offer = page.getByLabel("Open private zone");
|
||||
await expect(offer).toContainText(
|
||||
"There are more private photos waiting for you.",
|
||||
);
|
||||
await offer.getByRole("button", { name: "Open private zone" }).click();
|
||||
|
||||
await expect(page).toHaveURL(/\/characters\/elio\/private-zone$/);
|
||||
});
|
||||
Reference in New Issue
Block a user