Files
voiceUI/frontend/e2e/studio.spec.ts
T
2026-10-29 16:29:24 -04:00

52 lines
2.5 KiB
TypeScript

import { expect, test } from '@playwright/test'
test('shows the generation workspace and handles an empty library', async ({ page }) => {
await page.goto('/')
await expect(page.getByRole('heading', { name: 'Generated audio' })).toBeVisible()
await expect(page.getByText('Your next favorite take starts here.')).toBeVisible()
await expect(page.getByRole('tab', { name: /record/i })).toBeVisible()
})
test('records a browser microphone sample and offers a preview', async ({ page }) => {
await page.addInitScript(() => {
Object.defineProperty(navigator, 'mediaDevices', {
configurable: true,
value: { getUserMedia: async () => ({ getTracks: () => [{ stop() {} }] }) },
})
class TestMediaRecorder {
state = 'inactive'
mimeType = 'audio/webm'
ondataavailable: ((event: { data: Blob }) => void) | null = null
onstop: (() => void) | null = null
static isTypeSupported() { return true }
constructor(_: unknown) {}
start() { this.state = 'recording' }
stop() {
this.state = 'inactive'
this.ondataavailable?.({ data: new Blob(['fake audio'], { type: this.mimeType }) })
this.onstop?.()
}
}
Object.defineProperty(window, 'MediaRecorder', { configurable: true, value: TestMediaRecorder })
})
await page.goto('/')
await page.getByRole('tab', { name: /record/i }).click()
await page.getByRole('button', { name: /start recording/i }).click()
await expect(page.getByText('Recording in progress')).toBeVisible()
await page.waitForTimeout(700)
await page.getByRole('button', { name: /stop recording/i }).click()
await expect(page.getByLabel('Recording preview')).toBeVisible()
})
test('cancels a queued generation from the library', async ({ page }) => {
const job = { id: 'job-1', text: 'A queued sample', reference_id: 'ref-1', status: 'queued', error: null, created_at: '2026-10-27T12:00:00Z', updated_at: '2026-10-27T12:00:00Z', audio_url: null }
await page.route('**/api/references', (route) => route.fulfill({ json: [] }))
await page.route('**/api/generations*', (route) => route.fulfill({ json: { items: [job], page: 1, page_size: 50, total: 1, pages: 1 } }))
await page.route('**/api/generations/job-1/cancel', async (route) => route.fulfill({ json: { ...job, status: 'cancelled' } }))
await page.goto('/')
await expect(page.getByText('A queued sample')).toBeVisible()
await page.getByRole('button', { name: /cancel generation/i }).click()
await expect(page.getByText('CANCELLED', { exact: true })).toBeVisible()
})