teqo/tests/unit/campaignMunicipalityV2QuickActions.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

105 lines
3.8 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
isMunicipalityV2Path,
parseMunicipalityV2Slug,
resolveMunicipalityV2QuickActions,
resolveMunicipalityV2QuickActionsForPath,
} from '@/lib/campaignMunicipalityV2QuickActions'
import { resolveQuickActionsForPath } from '@/lib/campaignQuickActionRegistry'
describe('campaignMunicipalityV2QuickActions paths', () => {
it('detects the municipality v2 path', () => {
expect(isMunicipalityV2Path('/campanha/municipio/cairu/v2')).toBe(true)
expect(isMunicipalityV2Path('/campanha/municipios/cairu')).toBe(false)
expect(isMunicipalityV2Path('/campanha/municipio/cairu')).toBe(false)
})
it('parses municipality v2 slugs', () => {
expect(parseMunicipalityV2Slug('/campanha/municipio/cairu/v2')).toBe('cairu')
expect(parseMunicipalityV2Slug('/campanha/municipio/feira-de-santana/v2')).toBe(
'feira-de-santana',
)
expect(parseMunicipalityV2Slug('/campanha/municipios/cairu')).toBeUndefined()
})
})
describe('resolveMunicipalityV2QuickActions', () => {
it('lists secondary navigation for staff with municipality prefill', () => {
const actions = resolveMunicipalityV2QuickActions('coordinator', 'cairu', 42)
expect(actions.map((action) => action.id)).toEqual([
'municipality-dossier',
'municipality-elections',
'new-leadership',
'plan-tour',
])
expect(actions.find((action) => action.id === 'municipality-dossier')?.href).toBe(
'/campanha/municipios/cairu?tab=dossie',
)
expect(actions.find((action) => action.id === 'municipality-elections')?.href).toBe(
'/campanha/municipios/cairu?tab=elections',
)
expect(actions.find((action) => action.id === 'new-leadership')?.href).toBe(
'/campanha/liderancas/nova?municipality=42',
)
expect(actions.find((action) => action.id === 'plan-tour')?.href).toContain(
'/campanha/atividades/giros?region=',
)
})
it('omits register-update and wizard operational actions', () => {
const actions = resolveMunicipalityV2QuickActions('advisor', 'cairu', 1)
expect(actions.some((action) => action.id === 'register-update')).toBe(false)
expect(actions.some((action) => action.id === 'update-votes')).toBe(false)
})
it('returns nothing for leader', () => {
expect(resolveMunicipalityV2QuickActions('leader', 'cairu', 1)).toEqual([])
})
it('omits new-leadership without municipality id', () => {
const actions = resolveMunicipalityV2QuickActions('coordinator', 'cairu')
expect(actions.map((action) => action.id)).toEqual([
'municipality-dossier',
'municipality-elections',
'plan-tour',
])
})
})
describe('resolveMunicipalityV2QuickActionsForPath', () => {
it('returns null outside v2', () => {
expect(
resolveMunicipalityV2QuickActionsForPath('/campanha/municipios/cairu', 'coordinator', {}),
).toBeNull()
})
it('prefers context slug over pathname', () => {
const actions = resolveMunicipalityV2QuickActionsForPath(
'/campanha/municipio/feira-de-santana/v2',
'coordinator',
{ municipalitySlug: 'cairu', municipalityId: 7 },
)
expect(actions?.find((action) => action.id === 'municipality-dossier')?.href).toContain(
'/campanha/municipios/cairu',
)
expect(actions?.find((action) => action.id === 'new-leadership')?.href).toContain(
'municipality=7',
)
})
})
describe('campaignQuickActionRegistry municipality v2', () => {
it('returns v2 secondary actions instead of wizard catalog', () => {
const actions = resolveQuickActionsForPath('/campanha/municipio/cairu/v2', 'coordinator', {
municipalitySlug: 'cairu',
municipalityId: 99,
})
expect(actions.map((action) => action.id)).toEqual([
'municipality-dossier',
'municipality-elections',
'new-leadership',
'plan-tour',
])
})
})