mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:13:07 +00:00
72 lines
2.6 KiB
TypeScript
72 lines
2.6 KiB
TypeScript
import { createElement } from 'react'
|
|
import { renderToStaticMarkup } from 'react-dom/server'
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
|
|
import { MunicipalitySliceTotalsLine } from '@/components/campaign/municipality/MunicipalitySliceTotalsLine'
|
|
import type { MunicipalitySliceTotals } from '@/lib/municipalitySliceTotals'
|
|
import type { VoteEstimateScenario } from '@/lib/voteEstimate'
|
|
|
|
const scenarioState = { scenario: 'central' as VoteEstimateScenario }
|
|
|
|
vi.mock('@/components/campaign/municipality/MunicipalityEstimateScenarioContext', () => ({
|
|
useMunicipalityEstimateScenarioOptional: () => ({
|
|
scenario: scenarioState.scenario,
|
|
setScenario: () => {},
|
|
}),
|
|
}))
|
|
|
|
const render = (totals: MunicipalitySliceTotals): string =>
|
|
renderToStaticMarkup(createElement(MunicipalitySliceTotalsLine, { totals }))
|
|
|
|
describe('MunicipalitySliceTotalsLine', () => {
|
|
it('formats the four sums and reads the full scenario summary to screen readers', () => {
|
|
const html = render({
|
|
rowCount: 3,
|
|
votes2022: 1_234,
|
|
expectedByScenario: { pessimistic: 100, central: null, optimistic: 0 },
|
|
withEstimateCount: 1,
|
|
})
|
|
|
|
expect(html).toContain('data-slot="municipality-slice-totals"')
|
|
expect(html).toContain('1.234')
|
|
expect(html).toContain('Pess.')
|
|
expect(html).toContain('100')
|
|
expect(html).toContain('Média')
|
|
expect(html).toContain('—')
|
|
expect(html).toContain('Otim.')
|
|
expect(html).toContain('1 de 3 com expectativa')
|
|
expect(html).toContain(
|
|
'Pessimista: 100; Média: não informado; Otimista: 0; 1 de 3 com expectativa',
|
|
)
|
|
expect(html).not.toContain('aria-label=')
|
|
})
|
|
|
|
it('omits the coverage sentence and keeps the scenario dashes when nobody filled one', () => {
|
|
const html = render({
|
|
rowCount: 2,
|
|
votes2022: 0,
|
|
expectedByScenario: { pessimistic: null, central: null, optimistic: null },
|
|
withEstimateCount: 0,
|
|
})
|
|
|
|
expect(html).not.toContain('com expectativa')
|
|
expect(html).toContain(
|
|
'Pessimista: não informado; Média: não informado; Otimista: não informado',
|
|
)
|
|
})
|
|
|
|
it('emphasizes only the active scenario', () => {
|
|
scenarioState.scenario = 'optimistic'
|
|
const html = render({
|
|
rowCount: 1,
|
|
votes2022: 0,
|
|
expectedByScenario: { pessimistic: 100, central: 200, optimistic: 300 },
|
|
withEstimateCount: 1,
|
|
})
|
|
scenarioState.scenario = 'central'
|
|
|
|
expect(html).toContain('text-foreground font-semibold">300')
|
|
expect(html).not.toContain('text-foreground font-semibold">200')
|
|
expect(html).toContain('text-foreground">200')
|
|
})
|
|
})
|