Lista+detalhe única de edição para coordinator/candidate: nome, e-mail e celular com auto-save debounced (edit-where-you-see-it); carteira de municípios por chips com agregação de território de identidade, adição/remoção com UI otimista; criação inline no topo da tabela; ação de WhatsApp por assessor; reset de senha via e-mail (bloqueado para placeholders @planilha.invalid). Alinha access de update/phone/atribuição de município a isCampaignUnrestricted (coordinator + candidate). Sem migration. Testes int (campaignAdvisorManagement) + unit (schema e portfólio de municípios) cobrindo access, conflito de e-mail único, cap de assessores por município e agregação por território/ZE.
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
// @vitest-environment node
|
|
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
|
|
import type { CampaignUser } from '@/payload-types'
|
|
import {
|
|
reloadCampaignActor,
|
|
reloadUnrestrictedActor,
|
|
requireCampaignUser,
|
|
} from '@/utilities/campaignActionContext'
|
|
|
|
describe('campaign action context', () => {
|
|
it('preserves the generic authentication error', async () => {
|
|
await expect(requireCampaignUser(async () => null)).rejects.toThrow('Autenticação necessária.')
|
|
})
|
|
|
|
it('reloads the actor role with the transaction req', async () => {
|
|
const staleActor = { id: 9, role: 'coordinator' } as CampaignUser
|
|
const currentActor = { ...staleActor, role: 'leader' } as CampaignUser
|
|
const findByID = vi.fn().mockResolvedValue(currentActor)
|
|
const req = { transactionID: 21 }
|
|
|
|
await expect(reloadCampaignActor({ findByID }, staleActor, req)).resolves.toBe(currentActor)
|
|
expect(findByID).toHaveBeenCalledWith({
|
|
collection: 'campaignUser',
|
|
id: staleActor.id,
|
|
depth: 0,
|
|
overrideAccess: true,
|
|
req,
|
|
})
|
|
})
|
|
|
|
it('accepts coordinator and candidate as unrestricted', async () => {
|
|
const findByID = vi.fn()
|
|
for (const role of ['coordinator', 'candidate'] as const) {
|
|
const actor = { id: 1, role, collection: 'campaignUser' } as CampaignUser
|
|
findByID.mockResolvedValueOnce(actor)
|
|
await expect(reloadUnrestrictedActor({ findByID }, actor, 'denied')).resolves.toBe(actor)
|
|
}
|
|
})
|
|
|
|
it('rejects advisor for unrestricted reload', async () => {
|
|
const actor = { id: 2, role: 'advisor', collection: 'campaignUser' } as CampaignUser
|
|
const findByID = vi.fn().mockResolvedValue(actor)
|
|
await expect(reloadUnrestrictedActor({ findByID }, actor, 'denied')).rejects.toThrow('denied')
|
|
})
|
|
})
|