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
90 lines
3.6 KiB
TypeScript
90 lines
3.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import {
|
|
homeActionsForRole,
|
|
toHomeActionButtonProps,
|
|
UNCOVERED_MUNICIPALITIES_LIST_HREF,
|
|
} from '@/lib/campaignHomeActions'
|
|
import { LEADER_CONTACTS_HOME } from '@/lib/campaignPaths'
|
|
import { buildMunicipalityListHref } from '@/utilities/municipality/municipalityListUrl'
|
|
|
|
const staffActionIds = [
|
|
'update-votes',
|
|
'register-update',
|
|
'change-trend',
|
|
'update-leadership',
|
|
'register-demand',
|
|
'uncovered-municipalities',
|
|
] as const
|
|
|
|
const leaderActionIds = ['register-supporter', 'my-contacts'] as const
|
|
|
|
describe('homeActionsForRole', () => {
|
|
it.each(['coordinator', 'candidate'] as const)('returns six staff actions for %s', (role) => {
|
|
const ids = homeActionsForRole(role).map((action) => action.id)
|
|
expect(ids).toEqual([...staffActionIds])
|
|
})
|
|
|
|
it('returns six staff actions for advisor with portfolio-scoped descriptions', () => {
|
|
const actions = homeActionsForRole('advisor')
|
|
expect(actions.map((action) => action.id)).toEqual([...staffActionIds])
|
|
expect(
|
|
actions.some((action) => action.description.includes('nos municípios da sua carteira')),
|
|
).toBe(true)
|
|
const uncovered = actions.find((action) => action.id === 'uncovered-municipalities')
|
|
expect(uncovered?.description).toContain('sua carteira')
|
|
expect(uncovered?.description).not.toContain('nos municípios da sua carteira nos municípios')
|
|
})
|
|
|
|
it('returns two leader actions without municipality staff ids', () => {
|
|
const actions = homeActionsForRole('leader')
|
|
expect(actions.map((action) => action.id)).toEqual([...leaderActionIds])
|
|
for (const staffId of staffActionIds) {
|
|
expect(actions.some((action) => action.id === staffId)).toBe(false)
|
|
}
|
|
})
|
|
})
|
|
|
|
describe('toHomeActionButtonProps', () => {
|
|
it('wires my-contacts to the leader contacts route', () => {
|
|
const [supporter, contacts] = toHomeActionButtonProps(homeActionsForRole('leader'))
|
|
expect(supporter.href).toBeUndefined()
|
|
expect(contacts.href).toBe(LEADER_CONTACTS_HOME)
|
|
})
|
|
|
|
it('wires uncovered-municipalities when href is provided', () => {
|
|
const props = toHomeActionButtonProps(
|
|
homeActionsForRole('coordinator'),
|
|
UNCOVERED_MUNICIPALITIES_LIST_HREF,
|
|
)
|
|
const uncovered = props.find((action) => action.id === 'uncovered-municipalities')
|
|
expect(uncovered?.href).toBe(UNCOVERED_MUNICIPALITIES_LIST_HREF)
|
|
const updateVotes = props.find((action) => action.id === 'update-votes')
|
|
expect(updateVotes?.href).toBe('/campanha/acoes/atualizar-votos')
|
|
const registerUpdate = props.find((action) => action.id === 'register-update')
|
|
expect(registerUpdate?.href).toBe('/campanha/acoes/registrar-atualizacao')
|
|
})
|
|
|
|
it('omits uncovered href when not provided', () => {
|
|
const props = toHomeActionButtonProps(homeActionsForRole('coordinator'))
|
|
expect(props.find((action) => action.id === 'uncovered-municipalities')?.href).toBeUndefined()
|
|
})
|
|
|
|
it('prefills wizard hrefs when municipalitySlug is provided', () => {
|
|
const props = toHomeActionButtonProps(homeActionsForRole('coordinator'), {
|
|
municipalitySlug: 'cairu',
|
|
})
|
|
expect(props.find((action) => action.id === 'update-votes')?.href).toBe(
|
|
'/campanha/acoes/atualizar-votos?municipio=cairu',
|
|
)
|
|
expect(props.find((action) => action.id === 'uncovered-municipalities')?.href).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe('UNCOVERED_MUNICIPALITIES_LIST_HREF', () => {
|
|
it('matches canonical municipality list builder (client/server parity)', () => {
|
|
expect(buildMunicipalityListHref({ page: 1, coverage: 'sem_assessor', sort: 'votos' }, 1)).toBe(
|
|
UNCOVERED_MUNICIPALITIES_LIST_HREF,
|
|
)
|
|
})
|
|
})
|