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()
  })
})