teqo-backup/tests/unit/municipalitySliceTotalsLine.unit.spec.ts

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