teqo-backup/tests/unit/campaignNucleusPage.unit.spec.ts
Francisco Ignácio Fontoura Solla 040c36bed7 Add filtered overview panel to the nuclei list page.
Give coordinators aggregate vote estimates, coverage, and recent updates for the current list filters without leaving /campanha/nucleos.
2026-07-18 18:20:33 -03:00

67 lines
2.2 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
const mocks = vi.hoisted(() => ({
getCampaignUser: vi.fn(),
getPayload: vi.fn(),
loadNucleusListPageData: vi.fn(),
loadNucleusListOverviewData: vi.fn(),
redirect: vi.fn((href: string) => {
throw new Error(`redirect:${href}`)
}),
}))
vi.mock('@payload-config', () => ({ default: {} }))
vi.mock('payload', () => ({ getPayload: mocks.getPayload }))
vi.mock('next/navigation', () => ({ redirect: mocks.redirect }))
vi.mock('@/utilities/campaignAuth', () => ({
getCampaignUser: mocks.getCampaignUser,
}))
vi.mock('@/utilities/nucleusPageData', () => ({
loadNucleusListPageData: mocks.loadNucleusListPageData,
}))
vi.mock('@/utilities/nucleusListOverviewPageData', () => ({
loadNucleusListOverviewData: mocks.loadNucleusListOverviewData,
}))
import NucleiPage from '@/app/(campaign)/campanha/(app)/nucleos/page'
describe('campaign nucleus server page canonical URL', () => {
beforeEach(() => {
vi.clearAllMocks()
mocks.getCampaignUser.mockResolvedValue({ id: 9, role: 'coordenador' })
mocks.getPayload.mockResolvedValue({})
mocks.loadNucleusListOverviewData.mockResolvedValue(null)
})
it('redirects a noncanonical query before loading Payload data', async () => {
await expect(
NucleiPage({
searchParams: Promise.resolve({
city: 'mucuge',
region: 'CHAPADA DIAMANTINA',
obsoleteFilter: 'legacy',
}),
}),
).rejects.toThrow('redirect:/campanha/nucleos?region=Chapada+Diamantina&city=Mucug%C3%AA')
expect(mocks.getCampaignUser).not.toHaveBeenCalled()
expect(mocks.getPayload).not.toHaveBeenCalled()
expect(mocks.loadNucleusListPageData).not.toHaveBeenCalled()
})
it('routes out-of-range pagination through the canonical resolver', async () => {
mocks.loadNucleusListPageData.mockResolvedValue({
result: { docs: [], totalDocs: 0, totalPages: 3 },
scope: { totalDocs: 0 },
state: { page: 9, q: 'Chapada' },
})
await expect(
NucleiPage({
searchParams: Promise.resolve({ q: 'Chapada', page: '9' }),
}),
).rejects.toThrow('redirect:/campanha/nucleos?q=Chapada&page=3')
expect(mocks.loadNucleusListPageData).toHaveBeenCalledOnce()
})
})