teqo-backup/tests/unit/campaignMunicipalityQuickActions.unit.spec.ts
Francisco Solla 212a1f2423 feat(campaign): C87 — atualização unificada (texto + polaridade + urgente)
Substitui o modelo de MunicipalityUpdate (kind/semanal/urgente/nota/sinal + signalType)
por um modelo unificado: body obrigatório + polarity (boa/neutra/ruim) + urgent + adversarySignal.

- Schema: polarity enum obrigatório, urgent boolean default false, adversarySignal boolean
- Wizard: novo WizardUpdateBodyStep com campo de texto + polaridade + urgente
- Lista: controle unificado de atualização com polaridade inline
- Feed: exibe polaridade como badge colorido + indicador de urgência
- V2 status strip: atualização rápida de polaridade
- E11: queries atualizadas para polarity + adversarySignal
- Migração: 20260807_030000_unify_municipality_update (backfill polarity=neutra, urgent de kind, adversarySignal de kind+signalType)
- Testes: 18/18 integração C87, 593/593 total, 1399/1399 unitários
- Fix: testes de state deputy usavam nomes fixos que colidiam entre execuções
2026-08-07 05:04:41 -03:00

90 lines
3.3 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { CAMPAIGN_WIZARD_ACTION_SLUGS } from '@/lib/campaignActionRoutes'
import { UNCOVERED_MUNICIPALITIES_LIST_HREF } from '@/lib/campaignHomeActions'
import {
isMunicipalitiesListPath,
parseMunicipalityDetailSlug,
resolveMunicipalityDetailQuickActions,
resolveMunicipalityListQuickActions,
resolveMunicipalityQuickActionsForPath,
} from '@/lib/campaignMunicipalityQuickActions'
const wizardActionIds = [
'update-votes',
'register-update',
'change-trend',
'update-leadership',
'register-demand',
] as const
describe('campaignMunicipalityQuickActions paths', () => {
it('detects the municipality list path', () => {
expect(isMunicipalitiesListPath('/campanha/municipios')).toBe(true)
expect(isMunicipalitiesListPath('/campanha/municipios/')).toBe(true)
expect(isMunicipalitiesListPath('/campanha/municipios/cairu')).toBe(false)
})
it('parses municipality detail slugs', () => {
expect(parseMunicipalityDetailSlug('/campanha/municipios/cairu')).toBe('cairu')
expect(parseMunicipalityDetailSlug('/campanha/municipios/cairu/editar')).toBe('cairu')
expect(parseMunicipalityDetailSlug('/campanha/municipios')).toBeUndefined()
})
})
describe('resolveMunicipalityListQuickActions', () => {
it('mirrors the Início staff catalog without municipality prefill', () => {
const actions = resolveMunicipalityListQuickActions('coordinator')
expect(actions.map((action) => action.id)).toEqual([
...wizardActionIds,
'uncovered-municipalities',
])
expect(actions.find((action) => action.id === 'update-votes')?.href).toBe(
'/campanha/acoes/atualizar-votos',
)
expect(actions.find((action) => action.id === 'uncovered-municipalities')?.href).toBe(
UNCOVERED_MUNICIPALITIES_LIST_HREF,
)
})
it('returns nothing for leader', () => {
expect(resolveMunicipalityListQuickActions('leader')).toEqual([])
})
})
describe('resolveMunicipalityDetailQuickActions', () => {
it('prefills wizard hrefs and omits uncovered municipalities', () => {
const actions = resolveMunicipalityDetailQuickActions('coordinator', 'cairu')
expect(actions.map((action) => action.id)).toEqual([...wizardActionIds])
expect(actions.find((action) => action.id === 'update-votes')?.href).toBe(
`/campanha/acoes/${CAMPAIGN_WIZARD_ACTION_SLUGS['update-votes']}?municipio=cairu`,
)
expect(actions.some((action) => action.id === 'uncovered-municipalities')).toBe(false)
})
})
describe('resolveMunicipalityQuickActionsForPath', () => {
it('routes list and detail paths', () => {
const list = resolveMunicipalityQuickActionsForPath('/campanha/municipios', 'advisor', {})
expect(list).toHaveLength(6)
const detail = resolveMunicipalityQuickActionsForPath(
'/campanha/municipios/feira-de-santana',
'candidate',
{},
)
expect(detail).toHaveLength(5)
expect(detail[0]?.href).toContain('municipio=feira-de-santana')
})
it('prefers context slug over pathname', () => {
const actions = resolveMunicipalityQuickActionsForPath(
'/campanha/municipios/feira-de-santana',
'coordinator',
{ municipalitySlug: 'cairu' },
)
expect(actions.find((action) => action.id === 'update-votes')?.href).toContain(
'municipio=cairu',
)
})
})