feat(tests): add pre-release multi-message lock types test suite
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user