File size: 2,241 Bytes
51d2e6a 5fe2e71 51d2e6a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import { render, screen } from '@testing-library/react'
import { beforeEach, describe, expect, it } from 'vitest'
import { I18nProvider } from '../i18n/index'
import { LoadingSpinner } from './LoadingSpinner'
import type { JobStageHistoryEntry } from '../types/api'
const history: JobStageHistoryEntry[] = [
{
stage: 'designing',
started_at: '2026-10-26T13:00:00.000Z',
ended_at: '2026-10-26T13:00:25.200Z',
duration_ms: 25_200,
},
{
stage: 'generating',
started_at: '2026-10-26T13:00:25.200Z',
ended_at: '2026-10-26T13:01:42.300Z',
duration_ms: 77_100,
},
]
describe('LoadingSpinner stage history', () => {
beforeEach(() => {
localStorage.clear()
})
it('renders settled stage durations in the hover tooltip', () => {
render(
<I18nProvider>
<LoadingSpinner stage="rendering" stageHistory={history} />
</I18nProvider>,
)
expect(screen.getByText('Stage time')).toBeInTheDocument()
expect(screen.getByText('Designing')).toBeInTheDocument()
expect(screen.getByText('25.2s')).toBeInTheDocument()
expect(screen.getByText('Generating Code')).toBeInTheDocument()
expect(screen.getByText('77.1s')).toBeInTheDocument()
})
it('hides sub-100ms stages from the tooltip', () => {
render(
<I18nProvider>
<LoadingSpinner
stage="generating"
stageHistory={[
{
stage: 'queued',
started_at: '2026-10-26T13:00:00.000Z',
ended_at: '2026-10-26T13:00:00.008Z',
duration_ms: 8,
},
...history,
]}
/>
</I18nProvider>,
)
expect(screen.queryByText('Queued')).not.toBeInTheDocument()
expect(screen.getByText('Designing')).toBeInTheDocument()
})
it('renders narration and muxing progress labels', () => {
const { rerender } = render(
<I18nProvider>
<LoadingSpinner stage="narrating" />
</I18nProvider>,
)
expect(screen.getByText('Preparing narration...')).toBeInTheDocument()
rerender(
<I18nProvider>
<LoadingSpinner stage="muxing" />
</I18nProvider>,
)
expect(screen.getByText('Muxing audio...')).toBeInTheDocument()
})
})
|