refactor(e2e): organize fixtures by feature

This commit is contained in:
2026-07-16 11:49:58 +08:00
parent 764bb5a862
commit e730799aa5
28 changed files with 521 additions and 1335 deletions
+65
View File
@@ -0,0 +1,65 @@
import { expect, type Page } from "@playwright/test";
import { e2eEmailUser } from "../data/auth";
export const e2eEmailCredentials = {
email: "chanwillian0@gmail.com",
password: "12345678",
};
export const splashStartChatButtonName = "Start Chatting";
export function getSplashStartChatButton(page: Page) {
return page.getByRole("button", { name: splashStartChatButtonName });
}
export async function setEmailSessionStorage(page: Page) {
await page.evaluate((user) => {
localStorage.setItem("cozsweet:login_token", "e2e-email-token");
localStorage.setItem("cozsweet:refresh_token", "e2e-email-refresh-token");
localStorage.setItem("cozsweet:login_provider", "email");
localStorage.setItem("cozsweet:user_id", user.id);
localStorage.setItem("cozsweet:user", JSON.stringify(user));
}, e2eEmailUser);
}
export async function seedEmailSession(page: Page) {
await page.goto("/splash");
await setEmailSessionStorage(page);
}
export async function switchToEmailSignIn(page: Page) {
const otherOptionsButton = page.getByRole("button", { name: /Other Sign In Options/i });
const otherOptionsDialog = page.getByRole("dialog", { name: /Other sign-in options/i });
await expect(otherOptionsButton).toBeVisible({ timeout: 10_000 });
await expect(otherOptionsButton).toBeEnabled();
for (let attempt = 0; attempt < 3; attempt += 1) {
await otherOptionsButton.click();
try {
await expect(otherOptionsDialog).toBeVisible({ timeout: 2_000 });
break;
} catch (error) {
if (attempt === 2) throw error;
await otherOptionsButton.evaluate((button) => (button as HTMLButtonElement).click());
await page.waitForTimeout(500);
}
}
await page.getByRole("button", { name: "Email Sign In" }).click();
await expect(page.getByPlaceholder("Email")).toHaveValue(e2eEmailCredentials.email);
await expect(page.getByPlaceholder("Password")).toHaveValue(e2eEmailCredentials.password);
}
export async function submitEmailLogin(page: Page, options: { expectedUrl?: RegExp; waitForRequest?: boolean; urlTimeout?: number } = {}) {
const { expectedUrl, waitForRequest = true, urlTimeout = 10_000 } = options;
const loginButton = page.getByRole("button", { name: "Login" });
if (!waitForRequest) {
await Promise.all([expectedUrl ? page.waitForURL(expectedUrl, { timeout: urlTimeout }) : Promise.resolve(), loginButton.click()]);
return null;
}
const loginRequestPromise = page.waitForRequest("**/api/auth/login");
await loginButton.click();
const loginRequest = await loginRequestPromise;
expect(loginRequest.postDataJSON()).toMatchObject({ email: e2eEmailCredentials.email, password: e2eEmailCredentials.password, isTestAccount: true });
if (expectedUrl) await expect(page).toHaveURL(expectedUrl, { timeout: urlTimeout });
return loginRequest;
}