mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 23:53:05 +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
87 lines
3.6 KiB
TypeScript
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)
|
|
})
|
|
})
|