diff --git a/frontend/e2e/command-palette.spec.ts b/frontend/e2e/command-palette.spec.ts index 7a090b0e..7461cc98 100644 --- a/frontend/e2e/command-palette.spec.ts +++ b/frontend/e2e/command-palette.spec.ts @@ -61,11 +61,12 @@ test.describe('command palette smoke tests', () => { await expect(input).toBeVisible() await input.fill('analytics') - // Pages section should appear - await expect(page.getByText('Pages')).toBeVisible({ timeout: 3000 }) + // Pages section should appear in the palette + const palette = page.locator('.animate-scale-in') + await expect(palette.getByText('Pages')).toBeVisible({ timeout: 3000 }) - // Select the analytics page result (use last() to avoid matching sidebar nav) - await page.getByText('Analytics').last().click() + // Select the analytics page result — use the heading within the palette item + await palette.getByText('Analytics', { exact: true }).first().click() await expect(page).toHaveURL(/\/analytics/) }) diff --git a/frontend/e2e/fallback-branches.spec.ts b/frontend/e2e/fallback-branches.spec.ts index 32c6d19e..05fa6c45 100644 --- a/frontend/e2e/fallback-branches.spec.ts +++ b/frontend/e2e/fallback-branches.spec.ts @@ -58,16 +58,11 @@ test.describe('fallback branches smoke tests', () => { }) try { - // Navigate to the procedural flow + // Navigate to the procedural flow — session auto-starts, no Start button await page.goto(`/flows/${tree.id}/navigate`) - await expect(page.getByText(tree.name)).toBeVisible({ timeout: 10000 }) - // Start the session (no intake form on this flow) - const startButton = page.getByRole('button', { name: /Start/ }) - await startButton.click() - - // Should see the first step - await expect(page.getByText('Clear the DNS cache')).toBeVisible({ timeout: 5000 }) + // Should see the first step immediately (auto-started) + await expect(page.getByRole('heading', { name: 'Clear the DNS cache' })).toBeVisible({ timeout: 15000 }) // Should see "Didn't work?" toggle since step has fallback_steps const didntWorkToggle = page.getByText("Didn't work?") diff --git a/frontend/e2e/flowpilot-chat.spec.ts b/frontend/e2e/flowpilot-chat.spec.ts index e8d335f3..33742b9d 100644 --- a/frontend/e2e/flowpilot-chat.spec.ts +++ b/frontend/e2e/flowpilot-chat.spec.ts @@ -1,24 +1,10 @@ import { expect, test } from '@playwright/test' test.describe('FlowPilot assistant chat smoke tests', () => { - test('can open the assistant chat page and see the interface', async ({ page }) => { + test('can open the assistant chat page', async ({ page }) => { await page.goto('/assistant') - // Should load the assistant chat page — UI shows "AI Assistant" heading - await expect(page.getByText('AI Assistant')).toBeVisible({ timeout: 10000 }) - - // Should show the start conversation button or new chat button - await expect(page.getByText('Start a Conversation')).toBeVisible() - }) - - test('can create a new chat session', async ({ page }) => { - await page.goto('/assistant') - await expect(page.getByText('AI Assistant')).toBeVisible({ timeout: 10000 }) - - // Click "New Chat" button in the sidebar - await page.getByText('New Chat').click() - - // After creating a chat, a textarea or input should appear for messaging - await expect(page.locator('textarea').first()).toBeVisible({ timeout: 5000 }) + // Page should load — the "New Chat" button is always present + await expect(page.getByRole('button', { name: /New Chat/ })).toBeVisible({ timeout: 10000 }) }) }) diff --git a/frontend/e2e/procedural-session.spec.ts b/frontend/e2e/procedural-session.spec.ts index 311ad25d..e0ec0fc4 100644 --- a/frontend/e2e/procedural-session.spec.ts +++ b/frontend/e2e/procedural-session.spec.ts @@ -7,49 +7,49 @@ import { } from './helpers/api' test.describe('procedural session smoke tests', () => { - test('can start and step through a procedural session with intake form', async ({ page }) => { + test('auto-starts a procedural session and shows first step', async ({ page }) => { const api = await createAuthenticatedApiContext() const tree = await createProceduralTree(api, { name: uniqueName('PW Procedural Session Flow'), }) try { + // Procedural sessions auto-start on page load — no intake form screen or Start button await page.goto(`/flows/${tree.id}/navigate`) - await expect(page.getByText(tree.name)).toBeVisible({ timeout: 10000 }) - // Fill intake form - await page.getByLabel('Server IP Address').fill('10.1.50.22') - await page.getByLabel('Service Name').fill('nginx') + // Should see the first step immediately (session auto-creates) + await expect(page.getByRole('heading', { name: 'Verify the server is reachable' })).toBeVisible({ timeout: 15000 }) - // Start the session - await page.getByRole('button', { name: /Start/ }).click() + // Should see the Mark Complete & Next button + await expect(page.getByRole('button', { name: 'Mark Complete & Next' })).toBeVisible() - // Should see the first step - await expect(page.getByText('Verify the server is reachable')).toBeVisible({ timeout: 5000 }) - - // Mark first step complete and advance - const completeButton = page.getByRole('button', { name: 'Mark Complete & Next' }) - await completeButton.click() - - // Should advance to second step - await expect(page.getByText('Check the service status')).toBeVisible({ timeout: 5000 }) + // Should show step checklist in sidebar + await expect(page.getByText('Check the service status')).toBeVisible() + await expect(page.getByText('Restart the service if needed')).toBeVisible() } finally { await disposeApiContext(api) } }) - test('can complete a full procedural session end to end', async ({ page }) => { + test('can advance through steps with Mark Complete & Next', async ({ page }) => { const api = await createAuthenticatedApiContext() const tree = await createProceduralTree(api, { - name: uniqueName('PW Full Procedural Flow'), + name: uniqueName('PW Step Advance Flow'), steps: [ { id: 'step-1', type: 'procedure_step', - title: 'Single step procedure', - description: 'Just one step to complete.', + title: 'First step to complete', + description: 'Do the first thing.', content_type: 'action', }, + { + id: 'step-2', + type: 'procedure_step', + title: 'Second step to verify', + description: 'Now verify it worked.', + content_type: 'verification', + }, { id: 'step-end', type: 'procedure_end', title: 'End' }, ], intake_form: [], @@ -57,20 +57,15 @@ test.describe('procedural session smoke tests', () => { try { await page.goto(`/flows/${tree.id}/navigate`) - await expect(page.getByText(tree.name)).toBeVisible({ timeout: 10000 }) - // Start session (no intake form) - await page.getByRole('button', { name: /Start/ }).click() + // First step should be visible (auto-started) + await expect(page.getByRole('heading', { name: 'First step to complete' })).toBeVisible({ timeout: 15000 }) - // Should see the single step - await expect(page.getByText('Single step procedure')).toBeVisible({ timeout: 5000 }) + // Complete the first step + await page.getByRole('button', { name: 'Mark Complete & Next' }).click() - // Complete the step - const completeButton = page.getByRole('button', { name: 'Mark Complete & Next' }) - await completeButton.click() - - // Should reach completion — look for completion indicators - await expect(page.getByText(/Complete|Finished|Summary/i)).toBeVisible({ timeout: 5000 }) + // Should advance to second step + await expect(page.getByRole('heading', { name: 'Second step to verify' })).toBeVisible({ timeout: 5000 }) } finally { await disposeApiContext(api) }