teqo-backup/tests/unit/supporterQuickActions.unit.spec.ts
Francisco Ignácio Fontoura Solla cf09cb548d format: Prettier
2026-08-03 21:06:52 -03:00

94 lines
3.8 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
SUPPORTER_CREATE_HREF,
SUPPORTER_IMPORT_HREF,
isSupportersListPath,
isSupportersPath,
parseSupporterDetailId,
resolveSupporterDetailQuickActions,
resolveSupporterListQuickActions,
resolveSupporterQuickActionsForPath,
} from '@/lib/supporterQuickActions'
describe('supporterQuickActions paths', () => {
it('matches apoiadores list exactly', () => {
expect(isSupportersListPath('/campanha/apoiadores')).toBe(true)
expect(isSupportersListPath('/campanha/apoiadores/')).toBe(true)
expect(isSupportersListPath('/campanha/apoiadores/novo')).toBe(false)
expect(isSupportersListPath('/campanha/apoiadores/importar')).toBe(false)
})
it('matches apoiadores detail ids', () => {
expect(parseSupporterDetailId('/campanha/apoiadores/42')).toBe(42)
expect(parseSupporterDetailId('/campanha/apoiadores/42/')).toBe(42)
expect(parseSupporterDetailId('/campanha/apoiadores/novo')).toBeUndefined()
expect(parseSupporterDetailId('/campanha/apoiadores/importar')).toBeUndefined()
expect(parseSupporterDetailId('/campanha/apoiadores/abc')).toBeUndefined()
expect(isSupportersPath('/campanha/apoiadores/42')).toBe(true)
expect(isSupportersPath('/campanha/apoiadores/novo')).toBe(false)
})
})
describe('resolveSupporterListQuickActions', () => {
it('returns register-supporter + import-supporters for coordinator', () => {
const actions = resolveSupporterListQuickActions('coordinator')
expect(actions.map((action) => action.id)).toEqual(['register-supporter', 'import-supporters'])
expect(actions[0]?.href).toBe(SUPPORTER_CREATE_HREF)
expect(actions[1]?.href).toBe(SUPPORTER_IMPORT_HREF)
})
it('returns register-supporter only for advisor and candidate', () => {
for (const role of ['advisor', 'candidate'] as const) {
const actions = resolveSupporterListQuickActions(role)
expect(actions.map((action) => action.id)).toEqual(['register-supporter'])
expect(actions[0]?.href).toBe(SUPPORTER_CREATE_HREF)
}
})
it('returns empty catalog for leader lockdown', () => {
expect(resolveSupporterListQuickActions('leader')).toEqual([])
})
})
describe('resolveSupporterDetailQuickActions', () => {
it('mirrors the list catalog on detail (B86)', () => {
expect(resolveSupporterDetailQuickActions('coordinator').map((action) => action.id)).toEqual([
'register-supporter',
'import-supporters',
])
expect(resolveSupporterDetailQuickActions('advisor').map((action) => action.id)).toEqual([
'register-supporter',
])
expect(resolveSupporterDetailQuickActions('leader')).toEqual([])
})
})
describe('resolveSupporterQuickActionsForPath', () => {
it('delegates list and detail catalogs (B86)', () => {
const list = resolveSupporterQuickActionsForPath('/campanha/apoiadores', 'coordinator', {})
expect(list.map((action) => action.id)).toEqual(['register-supporter', 'import-supporters'])
const detail = resolveSupporterQuickActionsForPath('/campanha/apoiadores/7', 'coordinator', {})
expect(detail.map((action) => action.id)).toEqual(['register-supporter', 'import-supporters'])
})
it('returns empty catalog on form and wizard pages (search-only FAB)', () => {
expect(
resolveSupporterQuickActionsForPath('/campanha/apoiadores/novo', 'coordinator', {}),
).toEqual([])
expect(
resolveSupporterQuickActionsForPath('/campanha/apoiadores/importar', 'coordinator', {}),
).toEqual([])
})
it('returns empty catalog on non-numeric detail (route 404s)', () => {
expect(
resolveSupporterQuickActionsForPath('/campanha/apoiadores/abc', 'coordinator', {}),
).toEqual([])
})
it('returns empty catalog for leader lockdown', () => {
expect(resolveSupporterQuickActionsForPath('/campanha/apoiadores', 'leader', {})).toEqual([])
})
})