mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:13:07 +00:00
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
105 lines
3.8 KiB
TypeScript
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',
|
|
])
|
|
})
|
|
})
|