mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 06:43:06 +00:00
Fold duplicated campanha access, loaders, list/filter/form shells, and scripts into shared modules; reorganize utilities by domain; stabilize e2e; and document prevention-first audit workflow so the same smells cannot creep back in.
110 lines
3.4 KiB
TypeScript
110 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import {
|
|
clearTerritoryListFilters,
|
|
formatTerritoryActiveFiltersSummary,
|
|
toggleTerritoryCoverageFilter,
|
|
toggleTerritoryRegionFilter,
|
|
} from '@/utilities/territory/territoryListFilters'
|
|
import {
|
|
buildTerritoryListHref,
|
|
buildTerritorySortHref,
|
|
parseTerritoryListParams,
|
|
resolveTerritoryListSort,
|
|
resolveTerritoryListUrl,
|
|
serializeTerritoryListSearchParams,
|
|
} from '@/utilities/territory/territoryListUrl'
|
|
|
|
describe('territory list URL contract', () => {
|
|
it('parses and canonicalizes supported filters', () => {
|
|
expect(
|
|
parseTerritoryListParams({
|
|
q: ' irecê ',
|
|
region: ['Velho Chico', 'Irecê', 'Velho Chico', 'desconhecido'],
|
|
coverage: 'sem_assessor',
|
|
sort: 'votes2022',
|
|
dir: 'asc',
|
|
}),
|
|
).toEqual({
|
|
q: 'irecê',
|
|
regions: ['Velho Chico', 'Irecê'],
|
|
coverage: 'sem_assessor',
|
|
sort: 'votes2022',
|
|
dir: 'asc',
|
|
})
|
|
})
|
|
|
|
it('omits the default sort pair from the canonical query', () => {
|
|
const state = parseTerritoryListParams({ sort: 'pct', dir: 'desc' })
|
|
|
|
expect(serializeTerritoryListSearchParams(state).toString()).toBe('')
|
|
expect(resolveTerritoryListSort(state)).toEqual({ sort: 'pct', dir: 'desc' })
|
|
})
|
|
|
|
it('preserves filters while toggling sort direction', () => {
|
|
const state = parseTerritoryListParams({ q: 'chico', region: 'Velho Chico' })
|
|
|
|
expect(buildTerritorySortHref(state, 'votes2022')).toBe(
|
|
'/campanha/territorios?q=chico®ion=Velho+Chico&sort=votes2022',
|
|
)
|
|
expect(
|
|
buildTerritorySortHref(
|
|
parseTerritoryListParams({ ...state, sort: 'votes2022', dir: 'desc' }),
|
|
'votes2022',
|
|
),
|
|
).toContain('dir=asc')
|
|
})
|
|
|
|
it('redirects unsupported and non-canonical query strings', () => {
|
|
expect(resolveTerritoryListUrl({ q: ' Irecê ', unknown: 'x' })).toEqual({
|
|
state: { q: 'Irecê' },
|
|
href: '/campanha/territorios?q=Irec%C3%AA',
|
|
redirectHref: '/campanha/territorios?q=Irec%C3%AA',
|
|
})
|
|
})
|
|
|
|
it('clears invalid values instead of serializing them', () => {
|
|
const state = parseTerritoryListParams({
|
|
coverage: 'talvez',
|
|
sort: 'unknown',
|
|
dir: 'sideways',
|
|
})
|
|
|
|
expect(state).toEqual({})
|
|
expect(buildTerritoryListHref(state)).toBe('/campanha/territorios')
|
|
})
|
|
})
|
|
|
|
describe('territory list filter state', () => {
|
|
it('toggles region and coverage filters canonically', () => {
|
|
const withRegion = toggleTerritoryRegionFilter({}, 'Irecê')
|
|
expect(withRegion).toEqual({ regions: ['Irecê'] })
|
|
expect(toggleTerritoryRegionFilter(withRegion, 'Irecê')).toEqual({})
|
|
|
|
const withCoverage = toggleTerritoryCoverageFilter({}, 'sem_assessor')
|
|
expect(withCoverage).toEqual({ coverage: 'sem_assessor' })
|
|
expect(toggleTerritoryCoverageFilter(withCoverage, 'sem_assessor')).toEqual({})
|
|
})
|
|
|
|
it('clears filters while preserving the selected sort', () => {
|
|
expect(
|
|
clearTerritoryListFilters({
|
|
q: 'irecê',
|
|
regions: ['Irecê'],
|
|
coverage: 'sem_assessor',
|
|
sort: 'votes2022',
|
|
dir: 'asc',
|
|
}),
|
|
).toEqual({ sort: 'votes2022', dir: 'asc' })
|
|
})
|
|
|
|
it('formats a compact active-filter summary', () => {
|
|
expect(
|
|
formatTerritoryActiveFiltersSummary({
|
|
q: 'chico',
|
|
regions: ['Irecê', 'Velho Chico'],
|
|
coverage: 'sem_assessor',
|
|
}),
|
|
).toBe('Irecê, Velho Chico · Com lacunas de assessoria · Busca "chico"')
|
|
})
|
|
})
|