import { expect, test } from '@playwright/test' import { createAuthenticatedApiContext, createTroubleshootingTree, disposeApiContext, uniqueName, } from './helpers/api' test.describe('command palette smoke tests', () => { test('opens with Ctrl+K and shows empty state with quick actions', async ({ page }) => { await page.goto('/') await expect(page.getByTestId('app-shell')).toBeVisible() // Open command palette with keyboard shortcut (Ctrl+K on Linux/CI) await page.keyboard.press('Control+k') // Should show the palette modal with search input await expect(page.getByPlaceholder('Search flows, sessions, tags... or describe an issue to troubleshoot')).toBeVisible({ timeout: 3000 }) // Empty state should show quick actions — the palette label renders uppercase via CSS // Use the palette container to scope the check const palette = page.locator('.animate-scale-in') await expect(palette.getByText('Create New Flow')).toBeVisible() // Close with Escape await page.keyboard.press('Escape') await expect(page.getByPlaceholder('Search flows, sessions, tags... or describe an issue to troubleshoot')).not.toBeVisible() }) test('searches and shows AI Assistant option', async ({ page }) => { const api = await createAuthenticatedApiContext() await createTroubleshootingTree(api, { name: uniqueName('PW Palette Search Flow'), }) try { await page.goto('/') await expect(page.getByTestId('app-shell')).toBeVisible() await page.keyboard.press('Control+k') const input = page.getByPlaceholder('Search flows, sessions, tags... or describe an issue to troubleshoot') await expect(input).toBeVisible() await input.fill('PW Palette Search') // Should show AI Assistant section with FlowPilot option await expect(page.getByText('AI Assistant')).toBeVisible({ timeout: 5000 }) await expect(page.getByText('Troubleshoot with FlowPilot')).toBeVisible() } finally { await disposeApiContext(api) } }) test('navigates to a page when typing a page name', async ({ page }) => { await page.goto('/') await expect(page.getByTestId('app-shell')).toBeVisible() await page.keyboard.press('Control+k') const input = page.getByPlaceholder('Search flows, sessions, tags... or describe an issue to troubleshoot') await expect(input).toBeVisible() await input.fill('analytics') // 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 the heading within the palette item await palette.getByText('Analytics', { exact: true }).first().click() await expect(page).toHaveURL(/\/analytics/) }) test('FlowPilot option navigates to assistant chat', async ({ page }) => { await page.goto('/') await expect(page.getByTestId('app-shell')).toBeVisible() await page.keyboard.press('Control+k') const input = page.getByPlaceholder('Search flows, sessions, tags... or describe an issue to troubleshoot') await expect(input).toBeVisible() await input.fill('how do I fix a print spooler issue') // AI Assistant section should appear with FlowPilot option await expect(page.getByText('AI Assistant')).toBeVisible({ timeout: 3000 }) const flowpilotOption = page.getByText('Troubleshoot with FlowPilot') await expect(flowpilotOption).toBeVisible() await flowpilotOption.click() // Phase 1 of the FlowPilot migration renamed /assistant to /pilot. // /assistant still 301-redirects to /pilot, so accept either landing URL. await expect(page).toHaveURL(/\/(pilot|assistant)/) }) })