teqo-backup/tests/int/municipalityMapData.int.spec.ts
Francisco Ignácio Fontoura Solla ee44581ba4 Remove Tipo column and list kind filter from municipality list.
Drop the redundant type column, URL param, and filters while keeping municipality.kind for map and dossier; update tests and delivery docs.
2026-07-29 07:42:47 -03:00

95 lines
4.1 KiB
TypeScript

// @vitest-environment node
import type { Payload } from 'payload'
import { getPayload } from 'payload'
import { beforeAll, describe, expect, it } from 'vitest'
import { municipalityCatalog } from '@/lib/municipalityCatalog'
import config from '@/payload.config'
import { loadMunicipalityMapBundle } from '@/utilities/municipality/municipalityMapData'
import { installCampaignFixtures } from '../helpers/campaignFixtures'
const zoneMunicipalities = municipalityCatalog.filter((entry) => entry.kind === 'zona')
const ZONE_MUNICIPALITY_COUNT = zoneMunicipalities.length
const ZONE_MUNICIPALITY_SLUGS = new Set(zoneMunicipalities.map((entry) => entry.slug))
const ZONE_MUNICIPALITY_CODES = new Set(zoneMunicipalities.map((entry) => entry.ibgeCode))
let payload: Payload
const campaignFixtures = installCampaignFixtures({
getPayload: () => payload,
setPayload: (nextPayload) => {
payload = nextPayload
},
})
describe('loadMunicipalityMapBundle — list URL filters', () => {
beforeAll(async () => {
payload = await getPayload({ config: await config })
})
it('paints each zone under its own map key, never pooled under the city code', async () => {
const coordinator = await campaignFixtures().createCampaignUser('coordinator')
const bundle = await loadMunicipalityMapBundle(payload, coordinator, {
slug: zoneMunicipalities.map((entry) => entry.slug),
})
expect(bundle).not.toBeNull()
expect(bundle!.hasZoneMunicipalities).toBe(true)
expect(Object.keys(bundle!.municipalitiesByMapKey)).toHaveLength(ZONE_MUNICIPALITY_COUNT)
const mapKeys = Object.keys(bundle!.valuesByYear['2022'] ?? {})
expect(mapKeys.length).toBeGreaterThan(0)
for (const key of mapKeys) {
expect(ZONE_MUNICIPALITY_SLUGS.has(key), key).toBe(true)
expect(ZONE_MUNICIPALITY_CODES.has(key), key).toBe(false)
}
expect(Object.keys(bundle!.municipalitiesByMapKey).sort()).toEqual([...mapKeys].sort())
// The zones share the city's TSE rank — the artifact ranks by codarea only.
const ranks = bundle!.competitiveRankByYear['2022'] ?? {}
const positions = new Set(mapKeys.map((key) => ranks[key]?.rank))
expect(positions.size).toBe(1)
})
it('returns null when the filtered municipality set is empty', async () => {
const coordinator = await campaignFixtures().createCampaignUser('coordinator')
const bundle = await loadMunicipalityMapBundle(payload, coordinator, { q: 'zzznomatch' })
expect(bundle).toBeNull()
})
it('keeps advisor access and applies URL filters on top', async () => {
const fixtures = campaignFixtures()
const advisor = await fixtures.createCampaignUser('advisor')
const administered = await fixtures.getMunicipality()
await fixtures.assignMunicipalityAdvisors(administered.id, [advisor.id])
const included = await loadMunicipalityMapBundle(payload, advisor, { q: administered.name })
expect(included).not.toBeNull()
expect(included!.hasZoneMunicipalities).toBe(administered.kind === 'zona')
// Hand-written map key — must not call mapKeyForMunicipality (independent expectation).
const expectedMapKey = administered.kind === 'zona' ? administered.slug : administered.ibgeCode
expect(Object.keys(included!.municipalitiesByMapKey)).toEqual([expectedMapKey])
expect(Object.keys(included!.valuesByYear['2022'] ?? {})).toEqual([expectedMapKey])
const outsideSlug = municipalityCatalog.find((entry) => entry.slug !== administered.slug)!.slug
const excluded = await loadMunicipalityMapBundle(payload, advisor, { slug: [outsideSlug] })
expect(excluded).toBeNull()
})
it('includes validVotesByYear for TSE years and reuses 2022 for 2026', async () => {
const coordinator = await campaignFixtures().createCampaignUser('coordinator')
const bundle = await loadMunicipalityMapBundle(payload, coordinator, {})
expect(bundle).not.toBeNull()
expect(bundle!.validVotesByYear['2014']).toBeDefined()
expect(bundle!.validVotesByYear['2018']).toBeDefined()
expect(bundle!.validVotesByYear['2022']).toBeDefined()
expect(bundle!.validVotesByYear['2026']).toBe(bundle!.validVotesByYear['2022'])
})
})