import { expect, test, type Page } from './fixtures'; // User feedback against the mock transport (no backend). The mock profile is a // durable (non-guest) account, so the Settings → Info "Feedback" entry is shown. async function loginLobby(page: Page): Promise { await page.goto('/'); await page.getByRole('button', { name: /guest/i }).click(); await expect(page.getByText('Your turn')).toBeVisible(); } // openFeedback navigates lobby ⚙️ → Info tab → the Feedback screen. async function openFeedback(page: Page): Promise { await page.getByRole('button', { name: /Settings/ }).click(); await expect(page.locator('.pane')).toHaveCount(1); await page.getByRole('button', { name: 'Info', exact: true }).click(); await page.getByRole('button', { name: 'Feedback', exact: true }).click(); } test('feedback: submit a message, then resend is blocked', async ({ page }) => { await loginLobby(page); await openFeedback(page); await expect(page.getByPlaceholder(/Describe the problem/)).toBeVisible(); await page.locator('textarea').fill('The board does not render on my phone.'); await page.getByRole('button', { name: 'Send', exact: true }).click(); await expect(page.getByText('Your message has been sent.')).toBeVisible(); await expect(page.getByRole('button', { name: 'Send', exact: true })).toBeDisabled(); }); test('feedback: an operator reply raises the badge and shows on the screen', async ({ page }) => { await loginLobby(page); // Simulate the operator answering: clears any pending message, sets the reply and // pushes the admin_reply live event. await page.evaluate(() => (window as unknown as { __mock: { adminReply(): void } }).__mock.adminReply()); // The lobby ⚙️ badge folds the awaiting reply into its count. await expect(page.getByRole('button', { name: /Settings/ }).locator('.badge')).toBeVisible(); await openFeedback(page); await expect(page.getByText('Reply to your last message')).toBeVisible(); await expect(page.getByText(/looking into it/)).toBeVisible(); });