import { expect, test } from '@playwright/test'; const MOCKED_USER_TRANSCRIPT = '[mocked user] What is the current mocked vertical slice?'; const MOCKED_ASSISTANT_RESPONSE = '[mocked assistant] This is a deterministic mocked response from the gateway vertical slice.'; test('voice session shell covers the mocked transcript/response slice', async ({ page }) => { await page.goto('/'); await expect(page.getByTestId('hydration-status')).toHaveText('ready'); await expect(page.getByTestId('connection-state')).toHaveText('not connected'); await expect(page.getByTestId('mocked-turn-button')).toBeDisabled(); await expect(page.getByTestId('session-id')).toHaveText('not assigned'); await expect(page.getByTestId('gateway-session-state')).toHaveText('not received'); await page.getByTestId('connect-button').click(); await expect(page.getByTestId('connection-state')).toHaveText('connected'); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('session-id')).not.toHaveText('not assigned'); await expect(page.getByTestId('mocked-turn-button')).toBeEnabled(); const sessionId = await page.getByTestId('session-id').textContent(); await page.getByTestId('mocked-turn-button').click(); await expect(page.getByTestId('mocked-turn-status')).toHaveText('running'); await expect(page.getByTestId('user-transcript')).toHaveText('waiting for mocked transcript…'); await expect(page.getByTestId('assistant-response')).toHaveText('waiting for mocked response…'); await expect(page.getByTestId('user-transcript')).toHaveText(MOCKED_USER_TRANSCRIPT); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('conversation-render-order')).toHaveText('transcript>response'); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); await page.getByTestId('disconnect-button').click(); await expect(page.getByTestId('connection-state')).toHaveText('disconnected'); await expect(page.getByTestId('connection-detail')).toHaveText('Gateway WebSocket is closed.'); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('session-id')).toHaveText(sessionId ?? ''); await expect(page.getByTestId('mocked-turn-button')).toBeDisabled(); await expect(page.getByTestId('user-transcript')).toHaveText(MOCKED_USER_TRANSCRIPT); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('session-id')).toHaveText(sessionId ?? ''); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('user-transcript')).toHaveText(MOCKED_USER_TRANSCRIPT); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); }); test('voice session shell can cancel an active mocked turn and start another one', async ({ page }) => { await page.goto('/'); await expect(page.getByTestId('hydration-status')).toHaveText('ready'); await expect(page.getByTestId('cancel-turn-button')).toBeDisabled(); await page.getByTestId('connect-button').click(); await expect(page.getByTestId('connection-state')).toHaveText('connected'); await expect(page.getByTestId('mocked-turn-button')).toBeEnabled(); await page.getByTestId('mocked-turn-button').click(); await expect(page.getByTestId('mocked-turn-status')).toHaveText('running'); await expect(page.getByTestId('cancel-turn-button')).toBeEnabled(); await expect(page.getByTestId('user-transcript')).toHaveText(MOCKED_USER_TRANSCRIPT); await expect(page.getByTestId('assistant-response')).toContainText('[mocked assistant]'); await page.getByTestId('cancel-turn-button').click(); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); await expect(page.getByTestId('cancel-turn-button')).toBeDisabled(); await expect(page.getByTestId('mocked-turn-button')).toBeEnabled(); await expect(page.getByTestId('user-transcript')).toHaveText(MOCKED_USER_TRANSCRIPT); await expect(page.getByTestId('assistant-response')).toContainText('[mocked assistant]'); await page.getByTestId('mocked-turn-button').click(); await expect(page.getByTestId('mocked-turn-status')).toHaveText('running'); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); }); test('voice session shell supports a placeholder mic-control cycle before another mocked turn', async ({ page }) => { await page.goto('/'); await expect(page.getByTestId('hydration-status')).toHaveText('ready'); await expect(page.getByTestId('mic-control-button')).toBeDisabled(); await page.getByTestId('connect-button').click(); await expect(page.getByTestId('connection-state')).toHaveText('connected'); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('mic-control-button')).toBeEnabled(); await page.getByTestId('mic-control-button').dispatchEvent('mousedown'); await expect(page.getByTestId('mic-control-status')).toHaveText('holding'); await expect(page.getByTestId('gateway-session-state')).toHaveText('listening'); await expect(page.getByTestId('partial-transcript')).toHaveText( '[mocked partial] Placeholder push-to-talk transcript in progress.' ); await expect(page.getByTestId('user-transcript')).toHaveText( '[mocked partial] Placeholder push-to-talk transcript in progress.' ); await expect(page.getByTestId('mocked-turn-button')).toBeDisabled(); await page.getByTestId('mic-control-button').dispatchEvent('mouseup'); await expect(page.getByTestId('mic-control-status')).toHaveText('idle'); await expect(page.getByTestId('user-transcript')).toHaveText( '[mocked final] Placeholder push-to-talk transcript completed from 1 appended chunk.' ); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('partial-transcript')).toHaveText('none'); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('mocked-turn-button')).toBeEnabled(); await page.getByTestId('mocked-turn-button').click(); await expect(page.getByTestId('mocked-turn-status')).toHaveText('running'); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); }); test('voice session shell can cancel a push-to-talk mocked response and start another turn', async ({ page }) => { await page.goto('/'); await expect(page.getByTestId('hydration-status')).toHaveText('ready'); await page.getByTestId('connect-button').click(); await expect(page.getByTestId('connection-state')).toHaveText('connected'); await page.getByTestId('mic-control-button').dispatchEvent('mousedown'); await expect(page.getByTestId('gateway-session-state')).toHaveText('listening'); await page.getByTestId('mic-control-button').dispatchEvent('mouseup'); await expect(page.getByTestId('user-transcript')).toHaveText( '[mocked final] Placeholder push-to-talk transcript completed from 1 appended chunk.' ); await expect(page.getByTestId('cancel-turn-button')).toBeEnabled(); await expect(page.getByTestId('assistant-response')).toContainText('[mocked assistant]'); await page.getByTestId('cancel-turn-button').click(); await expect(page.getByTestId('gateway-session-state')).toHaveText('idle'); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); await expect(page.getByTestId('user-transcript')).toHaveText( '[mocked final] Placeholder push-to-talk transcript completed from 1 appended chunk.' ); await expect(page.getByTestId('assistant-response')).toContainText('[mocked assistant]'); await expect(page.getByTestId('mocked-turn-button')).toBeEnabled(); await page.getByTestId('mocked-turn-button').click(); await expect(page.getByTestId('assistant-response')).toHaveText(MOCKED_ASSISTANT_RESPONSE); await expect(page.getByTestId('mocked-turn-status')).toHaveText('idle'); });