Fix: falha silenciosa na suspensão de filiação via PAD
TLDR:
suspend!usavaupdateem vez deupdate!, então falhas de validação eram engolidas silenciosamente — o service atualizava o histórico do procedimento e retornava sucesso mesmo quando a filiação nunca chegou a ser suspensa.
Contexto
Quando um admin suspendia uma filiação pelo fluxo de PAD (Procedimento Administrativo), o service chamava procedure.membership.suspend! fora do bloco begin/rescue. suspend! usava update (não update!), que retorna false em falha sem levantar exceção. O service nunca checava esse retorno, então sempre seguia adiante para atualizar o corpo do procedimento e retornar { success: true }.
Resultado: o histórico do procedimento ganhava uma entrada dizendo “X suspendeu a filiação Y”, mas membership.suspended continuava false.
O mesmo problema existia em unsuspend_membership.
Objetivos
- Garantir que
suspend!eunsuspend!levantem em falha em vez de falhar silenciosamente - Garantir que o service só atualize o corpo do procedimento e retorne sucesso quando a filiação foi de fato alterada
- Garantir a mesma correção para
unsuspend_membership
Fora de escopo
— (não registrado na spec original)
Mudanças
| Arquivo | Mudança |
|---|---|
app/models/membership.rb |
suspend! e unsuspend! passam a usar update! |
app/services/admin_administrative_procedures_service.rb |
mover procedure.membership.suspend! e unsuspend! para dentro do bloco begin/rescue |
test/services/admin_administrative_procedures_service_test.rb (novo) |
cobre os caminhos de sucesso e de falha dos dois métodos |
Plano de implementação
- test: escrever testes falhando para
suspend_membershipeunsuspend_membership— caminho de sucesso e caminho de falha (quandosuspend!levanta). Arquivo:test/services/admin_administrative_procedures_service_test.rb - fix: trocar
suspend!eunsuspend!paraupdate!; mover as duas chamadas para dentro dobegin/rescueno service. Arquivos:app/models/membership.rb,app/services/admin_administrative_procedures_service.rb
Como verificar
bash
make test test=test/services/admin_administrative_procedures_service_test.rb
Manual:
- No admin PAD, associar uma filiação a um procedimento e clicar em “Suspender Filiação”
- Depois do redirect, checar que
membership.suspendedétrueemembership.suspended_atestá preenchido - Clicar em “Reativar Filiação” e confirmar que
membership.suspendedvoltou parafalse