feat(tests): add pre-release multi-message lock types test suite

This commit is contained in:
2026-07-17 18:34:17 +08:00
parent 4e1f967e4a
commit 1b15f69a96
@@ -0,0 +1,104 @@
import { expect, test, type Locator, type Page } from "@playwright/test";
import {
defaultCharacterChatUrl,
dismissChatInterruptions,
enterChatFromSplash,
} from "@e2e/fixtures/test-helpers";
const preReleaseHost = "frontend-test.banlv-ai.com";
const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? "";
test.describe("pre-release multi-message lock types", () => {
test.setTimeout(120_000);
test.skip(
!baseURL.includes(preReleaseHost),
`Run this test only with PLAYWRIGHT_BASE_URL pointing at ${preReleaseHost}.`,
);
test("returns locked image, locked voice, then unlocked text", async ({
page,
}) => {
await enterChatFromSplash(page, {
expectedUrl: defaultCharacterChatUrl,
timeout: 20_000,
waitUntil: "domcontentloaded",
});
await dismissChatInterruptions(page);
const messageInput = page.getByRole("textbox", { name: "Message" });
await expect(messageInput).toBeEnabled({ timeout: 30_000 });
let aiMessageCount = await page
.locator('[aria-label="AI message"]')
.count();
const imageReply = await sendMessageAndWaitForAiReply(
page,
messageInput,
"发个图片",
aiMessageCount,
);
aiMessageCount += 1;
await expect(
imageReply.getByRole("button", { name: "Open image in fullscreen" }),
).toBeVisible();
await expect(
imageReply
.getByRole("button", { name: "Open image in fullscreen" })
.locator("img"),
).toHaveClass(/blur-sm/);
const voiceReply = await sendMessageAndWaitForAiReply(
page,
messageInput,
"发送语音",
aiMessageCount,
);
aiMessageCount += 1;
await expect(
voiceReply.getByRole("button", { name: "Unlock voice message" }),
).toBeVisible();
await expect(
voiceReply.getByRole("button", { name: "Play voice message" }),
).toBeDisabled();
const textReply = await sendMessageAndWaitForAiReply(
page,
messageInput,
"你好",
aiMessageCount,
);
await expect(
textReply.getByRole("button", { name: "Unlock voice message" }),
).toHaveCount(0);
await expect(
textReply.getByRole("group", { name: "Locked private image" }),
).toHaveCount(0);
await expect(textReply.getByRole("button", { name: /Unlock/ })).toHaveCount(0);
await expect(textReply).toContainText(/\S/);
});
});
async function sendMessageAndWaitForAiReply(
page: Page,
messageInput: Locator,
message: string,
previousAiMessageCount: number,
): Promise<Locator> {
const aiMessages = page.locator('[aria-label="AI message"]');
const sendRequestPromise = page.waitForRequest("**/api/chat/send");
await messageInput.fill(message);
await messageInput.press("Enter");
const sendRequest = await sendRequestPromise;
expect(sendRequest.postDataJSON()).toMatchObject({ message });
await expect
.poll(() => aiMessages.count(), { timeout: 60_000 })
.toBeGreaterThan(previousAiMessageCount);
const latestReply = aiMessages.last();
await expect(latestReply).toBeVisible();
return latestReply;
}