teqo-backup/tests/int/homeSearchStateDeputies.int.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

87 lines
3.6 KiB
TypeScript

// @vitest-environment node
import type { Payload } from 'payload'
import { getPayload } from 'payload'
import { beforeAll, describe, expect, it } from 'vitest'
import { setStateDeputyMunicipalitiesBatchRecord } from '@/app/(campaign)/campanha/actions/stateDeputy'
import config from '@/payload.config'
import { searchHomeStateDeputies } from '@/utilities/homeSearch/searchHomeStateDeputies'
import { installCampaignFixtures } from '../helpers/campaignFixtures'
let payload: Payload
const campaignFixtures = installCampaignFixtures({
getPayload: () => payload,
setPayload: (nextPayload) => {
payload = nextPayload
},
})
describe('searchHomeStateDeputies (B52)', () => {
beforeAll(async () => {
payload = await getPayload({ config: await config })
})
it('returns empty hits when query is shorter than the minimum', async () => {
const fixtures = campaignFixtures()
const coordinator = await fixtures.createCampaignUser('coordinator')
const result = await searchHomeStateDeputies(payload, coordinator, 'a')
expect(result).toEqual([])
})
it('matches state deputies by word-start on the name for staff', async () => {
const fixtures = campaignFixtures()
const coordinator = await fixtures.createCampaignUser('coordinator')
const uniqueName = `${fixtures.value('Zeca')} Oliveira`
const stateDeputy = await fixtures.createStateDeputy({ name: uniqueName })
const result = await searchHomeStateDeputies(payload, coordinator, 'Zeca')
expect(result.some((hit) => hit.slug === stateDeputy.slug)).toBe(true)
expect(result.find((hit) => hit.slug === stateDeputy.slug)?.name).toBe(uniqueName)
})
it('matches state deputies by word-start on the party when the name does not match', async () => {
const fixtures = campaignFixtures()
const coordinator = await fixtures.createCampaignUser('coordinator')
const stateDeputy = await fixtures.createStateDeputy({
name: `${fixtures.value('Maria')} Silva`,
party: 'PSOL',
})
const result = await searchHomeStateDeputies(payload, coordinator, 'PSOL')
expect(result.some((hit) => hit.slug === stateDeputy.slug)).toBe(true)
})
it('returns state deputy hits for advisor role when name matches', async () => {
const fixtures = campaignFixtures()
const advisor = await fixtures.createCampaignUser('advisor')
const uniqueName = `${fixtures.value('Assessoria')} Dobradinha`
const stateDeputy = await fixtures.createStateDeputy({ name: uniqueName })
const result = await searchHomeStateDeputies(payload, advisor, 'Assessoria')
expect(result.some((hit) => hit.slug === stateDeputy.slug)).toBe(true)
})
it('reports municipality count on matched state deputies', async () => {
const fixtures = campaignFixtures()
const coordinator = await fixtures.createCampaignUser('coordinator')
const uniqueName = `${fixtures.value('Carteira')} Dobradinha`
const stateDeputy = await fixtures.createStateDeputy({ name: uniqueName })
// Allocated, never pinned slugs: parallel specs mutating the same seeded
// municipality deadlocked municipality_rels (miss #73).
const first = await fixtures.getMunicipality()
const second = await fixtures.getMunicipality()
await setStateDeputyMunicipalitiesBatchRecord(payload, coordinator, {
stateDeputyId: stateDeputy.id,
municipalityIds: [first.id, second.id],
assigned: true,
})
const result = await searchHomeStateDeputies(payload, coordinator, 'Carteira')
const hit = result.find((row) => row.slug === stateDeputy.slug)
expect(hit?.municipalityCount).toBe(2)
expect(hit?.party).toBe(stateDeputy.party ?? null)
})
})