import fs from 'node:fs'; import path from 'node:path'; import { type APIRequestContext, type Browser, type BrowserContext, expect, type Page, } from '@playwright/test'; import { generateId } from 'ai'; import { ChatPage } from './pages/chat'; import { getUnixTime } from 'date-fns'; export type UserContext = { context: BrowserContext; page: Page; request: APIRequestContext; }; export async function createAuthenticatedContext({ browser, name, chatModel = 'chat-model', }: { browser: Browser; name: string; chatModel?: 'chat-model' | 'chat-model-reasoning'; }): Promise { const directory = path.join(__dirname, '../playwright/.sessions'); if (!fs.existsSync(directory)) { fs.mkdirSync(directory, { recursive: true }); } const storageFile = path.join(directory, `${name}.json`); const context = await browser.newContext(); const page = await context.newPage(); const email = `test-${name}@playwright.com`; const password = generateId(); await page.goto('http://localhost:3000/register'); await page.getByPlaceholder('user@acme.com').click(); await page.getByPlaceholder('user@acme.com').fill(email); await page.getByLabel('Password').click(); await page.getByLabel('Password').fill(password); await page.getByRole('button', { name: 'Sign Up' }).click(); await expect(page.getByTestId('toast')).toContainText( 'Account created successfully!', ); const chatPage = new ChatPage(page); await chatPage.createNewChat(); await chatPage.chooseModelFromSelector('chat-model-reasoning'); await expect(chatPage.getSelectedModel()).resolves.toEqual('Reasoning model'); await page.waitForTimeout(1000); await context.storageState({ path: storageFile }); await page.close(); const newContext = await browser.newContext({ storageState: storageFile }); const newPage = await newContext.newPage(); return { context: newContext, page: newPage, request: newContext.request, }; } export function generateRandomTestUser() { const email = `test-${getUnixTime(new Date())}@playwright.com`; const password = generateId(); return { email, password, }; }