Repository Public
1import { expect, test } from '@playwright/test';2import { FIX, mission, reveal, seeded, setTheme, shot } from './helpers';34/** Desktop screenshots (1440×900), light and dark, of the seeded fixture state. Reviewed by eye. */5for (const theme of ['light', 'dark'] as const) {6 test.describe(`desktop screenshots — ${theme}`, () => {7 test.beforeEach(async ({ page }) => {8 await seeded(page);9 await setTheme(page, theme);10 });11 const settle = (page: import('@playwright/test').Page) => page.waitForTimeout(700);1213 test('home', async ({ page }) => {14 await page.goto('/home/');15 await expect(page.getByTestId('needs-you').getByTestId('wait-card')).toHaveCount(2);16 await expect(page.getByTestId('health-worker')).toHaveAttribute('data-ok', 'true');17 await settle(page);18 await shot(page, `desktop-home-${theme}`);19 });20 test('mission detail with an expanded diff', async ({ page }) => {21 const m = await mission(page, FIX.done);22 await page.goto(`/mission/?id=${m.id}`);23 await expect(page.getByTestId('run-result')).toBeVisible();24 const edit = page.locator('[data-testid="tool-row"][data-tool="edit_file"]').first();25 await reveal(page, edit);26 await page.getByTestId('timeline-scroll').evaluate((el) => { el.scrollTop -= 190; });27 await expect(edit.getByTestId('diff-view')).toBeVisible();28 await settle(page);29 await shot(page, `desktop-mission-${theme}`);30 // the tail: shell block, approval outcome, result31 const shell = page.locator('[data-testid="tool-row"][data-tool="shell"]');32 await reveal(page, shell);33 await shell.getByRole('button').first().click();34 await shell.scrollIntoViewIfNeeded();35 await settle(page);36 await shot(page, `desktop-mission-shell-${theme}`);37 });38 test('mission waiting on an approval (live)', async ({ page }) => {39 const m = await mission(page, FIX.approval);40 await page.goto(`/mission/?id=${m.id}`);41 await expect(page.getByTestId('timeline-wait').getByTestId('wait-approve')).toBeVisible();42 await settle(page);43 await shot(page, `desktop-mission-waiting-${theme}`);44 });45 test('approvals', async ({ page }) => {46 await page.goto('/approvals/');47 await expect(page.getByTestId('wait-card')).toHaveCount(2);48 await settle(page);49 await shot(page, `desktop-approvals-${theme}`);50 });51 test('spend', async ({ page }) => {52 await page.goto('/spend/');53 await expect(page.getByTestId('week-bar')).toHaveCount(7);54 await settle(page);55 await shot(page, `desktop-spend-${theme}`);56 });57 test('settings', async ({ page }) => {58 await page.goto('/settings/');59 await expect(page.getByTestId('settings')).toBeVisible();60 await settle(page);61 await shot(page, `desktop-settings-${theme}`);62 });63 test('missions, new mission dialog, policy', async ({ page }) => {64 await page.goto('/missions/');65 await expect(page.getByTestId('mission-row')).toHaveCount(6);66 await expect(page.getByTestId('mission-row').first()).toContainText('Claude');67 await settle(page);68 await shot(page, `desktop-missions-${theme}`);69 await page.getByTestId('new-mission').click();70 await page.getByTestId('mission-objective').fill('Some invoice totals are off by one cent. Find the cause, fix it with a regression test and commit.');71 await expect(page.getByTestId('model-picker')).toBeVisible();72 await settle(page);73 await shot(page, `desktop-new-mission-${theme}`);74 await page.keyboard.press('Escape');75 await page.goto('/policy/');76 await expect(page.getByTestId('rule-row')).toHaveCount(2);77 await settle(page);78 await shot(page, `desktop-policy-${theme}`);79 });80 });81}8283test('system, projects, login (light)', async ({ page }) => {84 await seeded(page);85 await page.goto('/system/');86 await expect(page.getByTestId('system-models')).toBeVisible();87 await page.waitForTimeout(500);88 await shot(page, 'desktop-system-light');89 await page.goto('/projects/');90 await expect(page.getByTestId('project-card')).toHaveCount(2);91 await page.waitForTimeout(400);92 await shot(page, 'desktop-projects-light');93 await page.context().clearCookies();94 await page.goto('/login/');95 await expect(page.getByTestId('login-submit')).toBeVisible();96 await page.waitForTimeout(500);97 await shot(page, 'desktop-login-light');98});99