Pular para o conteúdo principal

8.3 Critérios de Aceitação dos RFs do MVP

Esta página documenta os critérios de aceitação, regras de negócio e cenários negativos para cada Requisito Funcional do MVP, alinhados ao DoR (critérios redigidos no formato Dado/Quando/Então) e ao DoD (critérios validados em homologação antes da entrega).

Formato adotado (DoR): Dado [contexto] / Quando [ação] / Então [resultado esperado]


RF-01 — Autenticar Administrador

Regras de Negócio

  • Apenas usuários com papel = "admin" na tabela usuarios podem acessar as rotas de gestão.
  • Credenciais inválidas não revelam se o e-mail existe (resposta genérica "credenciais inválidas").
  • Após autenticação bem-sucedida, o sistema emite um token JWT com expiração de 24 horas.
  • Cadastro público sempre cria papel = "usuario" — não é possível auto-promover para admin via API.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-01.1Login admin com sucessoadministrador com credenciais válidas e papel = "admin"realiza POST /usuarios?action=login com e-mail e senha corretossistema retorna HTTP 200 com token JWT e papel: "admin"
CA-01.2Credenciais inválidasusuário envia senha incorretarealiza POST /usuarios?action=loginsistema retorna HTTP 401 com mensagem genérica; nenhum token é emitido
CA-01.3Campos obrigatórios ausentesrequisição sem campo senharealiza POST /usuarios?action=loginsistema retorna HTTP 400 indicando campos faltantes
CA-01.4Acesso a rota protegida sem tokenrequisição sem header Authorizationacessa qualquer rota administrativa (/doacoes, /doadores, /voluntarios)sistema retorna HTTP 401 {"error":"Não autorizado"}
CA-01.5Token expiradotoken JWT emitido há mais de 24hacessa rota protegida com token vencidosistema retorna HTTP 401; usuário deve realizar novo login

RF-02 — Registrar Doação

Regras de Negócio

  • Campos obrigatórios: tipo e descricao.
  • Campo tipo aceita apenas: "dinheiro", "alimento", "roupa", "brinquedo", "material", "outro".
  • Campo quantidade deve ser inteiro positivo (> 0); padrão 1 quando não informado.
  • Campo data_doacao é opcional; quando ausente, usa data do registro.
  • Somente usuários autenticados podem registrar doações.
  • Toda doação registrada deve receber id único gerado pelo banco.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-02.1Registro com dados válidosadministrador autenticado, dados completos com tipo válidorealiza POST /doacoes com tipo, descricao, quantidade e doador_nomesistema retorna HTTP 201 com {"registrada": true, "doacao": {...}} incluindo id gerado
CA-02.2Registro com quantidade padrãoadministrador autenticado, quantidade não informadarealiza POST /doacoes com tipo e descricaosistema registra doação com quantidade = 1 e retorna HTTP 201
CA-02.3Tipo inválidoadministrador autenticado, tipo = "carro"realiza POST /doacoessistema retorna HTTP 422 com mensagem "Tipo de doação inválido"
CA-02.4Campos obrigatórios ausentesadministrador autenticado, corpo sem tiporealiza POST /doacoessistema retorna HTTP 422 com "Campos obrigatórios: tipo, descricao"
CA-02.5Quantidade inválidaadministrador autenticado, quantidade = 0realiza POST /doacoessistema retorna HTTP 422 com "Quantidade deve ser um inteiro maior que zero"
CA-02.6Usuário sem autenticaçãorequisição sem token JWTrealiza POST /doacoessistema retorna HTTP 401 {"error":"Não autorizado"}

RF-03 — Listar Doações

Regras de Negócio

  • Listagem disponível apenas para usuários autenticados.
  • Resultados ordenados por data_doacao decrescente (mais recentes primeiro).
  • Filtros opcionais: tipo, doador_nome, intervalo de datas.
  • Lista vazia retorna HTTP 200 com array vazio [], não HTTP 404.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-03.1Listagem completaadministrador autenticado, doações cadastradas no bancorealiza GET /doacoes sem filtrossistema retorna HTTP 200 com array de doações ordenado por data decrescente
CA-03.2Filtro por tipoadministrador autenticadorealiza GET /doacoes?tipo=alimentosistema retorna apenas doações com tipo = "alimento"
CA-03.3Banco sem registrosadministrador autenticado, banco vaziorealiza GET /doacoessistema retorna HTTP 200 com []
CA-03.4Usuário sem autenticaçãorequisição sem token JWTrealiza GET /doacoessistema retorna HTTP 401

RF-04 — Editar Doação

Regras de Negócio

  • Apenas usuários autenticados podem editar doações.
  • O id da doação deve existir no banco; caso contrário, retornar HTTP 404.
  • Campos editáveis: tipo, descricao, quantidade, doador_nome, data_doacao.
  • Não é permitido alterar o id da doação.
  • Toda edição deve ser registrada em log (timestamp + usuário responsável) — vinculado ao RNF-10.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-04.1Edição com dados válidosadministrador autenticado, doação com id existenterealiza PUT /doacoes/:id com campos a alterarsistema retorna HTTP 200 com dados atualizados
CA-04.2Tipo alterado para valor inválidoadministrador autenticadorealiza PUT /doacoes/:id com tipo = "outro2"sistema retorna HTTP 422 com "Tipo de doação inválido"
CA-04.3ID inexistenteadministrador autenticado, id não existe no bancorealiza PUT /doacoes/:idsistema retorna HTTP 404
CA-04.4Usuário sem autenticaçãorequisição sem tokenrealiza PUT /doacoes/:idsistema retorna HTTP 401

RF-05 — Registrar Doador

Regras de Negócio

  • Campo obrigatório: nome.
  • Campo email é opcional mas, quando informado, deve conter @ e domínio reconhecido.
  • Campo tipo aceita: "pessoa_fisica", "pessoa_juridica", "anonimo"; padrão "pessoa_fisica".
  • Não é permitido cadastrar dois doadores com o mesmo e-mail.
  • Somente administradores autenticados podem cadastrar doadores.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-05.1Cadastro com dados válidosadministrador autenticado, nome informadorealiza POST /doadores com nome e demais campos válidossistema retorna HTTP 201 com dados do doador e id gerado
CA-05.2Cadastro apenas com nomeadministrador autenticadorealiza POST /doadores somente com nomesistema registra doador com campos opcionais nulos e retorna HTTP 201
CA-05.3Nome ausenteadministrador autenticado, corpo sem nomerealiza POST /doadoressistema retorna HTTP 422 indicando campo obrigatório ausente
CA-05.4E-mail inválidoadministrador autenticado, email = "semdominio@"realiza POST /doadoressistema retorna HTTP 422 com mensagem de e-mail inválido
CA-05.5E-mail duplicadodoador com mesmo e-mail já existerealiza POST /doadores com e-mail repetidosistema retorna HTTP 400 indicando duplicidade
CA-05.6Usuário sem autenticaçãorequisição sem tokenrealiza POST /doadoressistema retorna HTTP 401

RF-06 — Listar Doadores

Regras de Negócio

  • Listagem disponível apenas para usuários autenticados.
  • Filtros opcionais: nome (busca parcial), tipo.
  • Resultado inclui contagem de doações associadas a cada doador.
  • Lista vazia retorna HTTP 200 com array [].

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-06.1Listagem completaadministrador autenticado, doadores cadastradosrealiza GET /doadoressistema retorna HTTP 200 com array de doadores
CA-06.2Filtro por nome parcialadministrador autenticadorealiza GET /doadores?nome=Mariasistema retorna apenas doadores cujo nome contém "Maria" (case-insensitive)
CA-06.3Banco sem registrosadministrador autenticado, banco vaziorealiza GET /doadoressistema retorna HTTP 200 com []
CA-06.4Usuário sem autenticaçãorequisição sem tokenrealiza GET /doadoressistema retorna HTTP 401

RF-07 — Registrar Entrega

Regras de Negócio

  • Campos obrigatórios: item, quantidade e data_entrega.
  • Campo quantidade deve ser inteiro positivo (> 0).
  • Campo beneficiario é opcional.
  • Somente administradores autenticados podem registrar entregas.
  • Toda entrega registrada recebe id único gerado pelo banco.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-07.1Registro com dados completosadministrador autenticado, todos os campos válidosrealiza POST /entregas com item, quantidade e data_entregasistema retorna HTTP 201 com dados da entrega e id gerado
CA-07.2Campos obrigatórios ausentesadministrador autenticado, corpo sem itemrealiza POST /entregassistema retorna HTTP 422 indicando campos obrigatórios ausentes
CA-07.3Quantidade inválidaadministrador autenticado, quantidade = -1realiza POST /entregassistema retorna HTTP 422 com mensagem de quantidade inválida
CA-07.4Falha de persistênciabanco de dados indisponívelrealiza POST /entregas com dados válidossistema retorna HTTP 400 com mensagem de erro; nenhum registro parcial é criado
CA-07.5Usuário sem autenticaçãorequisição sem tokenrealiza POST /entregassistema retorna HTTP 401

RF-08 — Listar Entregas

Regras de Negócio

  • Listagem disponível apenas para usuários autenticados.
  • Ordenação padrão: data_entrega decrescente.
  • Filtros opcionais: intervalo de datas, beneficiario.
  • Lista vazia retorna HTTP 200 com [].

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-08.1Listagem completaadministrador autenticado, entregas cadastradasrealiza GET /entregassistema retorna HTTP 200 com array de entregas ordenado por data decrescente
CA-08.2Filtro por períodoadministrador autenticadorealiza GET /entregas?de=2026-01-01&ate=2026-06-30sistema retorna apenas entregas no intervalo informado
CA-08.3Banco sem registrosadministrador autenticadorealiza GET /entregassistema retorna HTTP 200 com []
CA-08.4Usuário sem autenticaçãorequisição sem tokenrealiza GET /entregassistema retorna HTTP 401

RF-09 — Registrar Voluntário

Regras de Negócio

  • Campos obrigatórios: nome e email.
  • E-mail deve ser único no sistema — não é permitido duplicidade.
  • Campo area_atuacao é opcional.
  • Somente administradores autenticados podem cadastrar voluntários.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-09.1Cadastro com dados válidosadministrador autenticado, nome e email informadosrealiza POST /voluntarios com dados válidossistema retorna HTTP 201 com dados do voluntário e id gerado
CA-09.2E-mail duplicadovoluntário com mesmo e-mail já existerealiza POST /voluntarios com e-mail repetidosistema retorna HTTP 400 indicando que o e-mail já está em uso
CA-09.3Campos obrigatórios ausentesadministrador autenticado, corpo sem emailrealiza POST /voluntariossistema retorna HTTP 422 indicando campos obrigatórios ausentes
CA-09.4Usuário sem autenticaçãorequisição sem tokenrealiza POST /voluntariossistema retorna HTTP 401

RF-10 — Listar Voluntários

Regras de Negócio

  • Listagem disponível apenas para usuários autenticados.
  • Filtros opcionais: nome (busca parcial), area_atuacao.
  • Lista vazia retorna HTTP 200 com [].

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-10.1Listagem completaadministrador autenticado, voluntários cadastradosrealiza GET /voluntariossistema retorna HTTP 200 com array de voluntários
CA-10.2Filtro por área de atuaçãoadministrador autenticadorealiza GET /voluntarios?area=educacaosistema retorna apenas voluntários com area_atuacao = "educacao"
CA-10.3Banco sem registrosadministrador autenticadorealiza GET /voluntariossistema retorna HTTP 200 com []
CA-10.4Usuário sem autenticaçãorequisição sem tokenrealiza GET /voluntariossistema retorna HTTP 401

RF-11 — Registrar Disponibilidade

Regras de Negócio

  • Campos obrigatórios: voluntario_id, dia_semana e horario_inicio e horario_fim.
  • dia_semana aceita: "segunda", "terca", "quarta", "quinta", "sexta", "sabado", "domingo".
  • horario_inicio deve ser anterior a horario_fim.
  • Não é permitido registrar disponibilidade com sobreposição de horário para o mesmo voluntário no mesmo dia.
  • O voluntario_id deve existir no banco.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-11.1Registro com dados válidosadministrador autenticado, voluntário existenterealiza POST /disponibilidades com dados válidossistema retorna HTTP 201 com dados da disponibilidade registrada
CA-11.2Conflito de horáriovoluntário já tem disponibilidade das 08h às 12h na segundaregistra disponibilidade das 10h às 14h no mesmo diasistema retorna HTTP 422 com "Conflito de horário para este voluntário"
CA-11.3Horário início >= fimhorario_inicio = "14:00" e horario_fim = "08:00"realiza POST /disponibilidadessistema retorna HTTP 422 com mensagem de horário inválido
CA-11.4Voluntário inexistentevoluntario_id não existe no bancorealiza POST /disponibilidadessistema retorna HTTP 404 indicando voluntário não encontrado
CA-11.5Dia da semana inválidodia_semana = "feriado"realiza POST /disponibilidadessistema retorna HTTP 422 com mensagem de dia inválido

RF-12 — Editar Disponibilidade

Regras de Negócio

  • Somente disponibilidades existentes podem ser editadas; id inválido retorna HTTP 404.
  • As mesmas regras de validação do RF-11 se aplicam: horario_inicio < horario_fim, dia_semana válido.
  • Edição não pode gerar conflito de horário com outra disponibilidade do mesmo voluntário no mesmo dia.
  • Somente administradores autenticados podem editar disponibilidades.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-12.1Edição com dados válidosadministrador autenticado, disponibilidade com id existenterealiza PUT /disponibilidades/:id com novos horários válidossistema retorna HTTP 200 com dados atualizados
CA-12.2Conflito gerado pela ediçãovoluntário já tem outra disponibilidade no mesmo dia que sobrepõe o novo horáriorealiza PUT /disponibilidades/:idsistema retorna HTTP 422 com "Conflito de horário para este voluntário"
CA-12.3Horário inválido após ediçãohorario_inicio maior ou igual a horario_fim no novo payloadrealiza PUT /disponibilidades/:idsistema retorna HTTP 422 com mensagem de horário inválido
CA-12.4ID inexistenteid de disponibilidade não existe no bancorealiza PUT /disponibilidades/:idsistema retorna HTTP 404
CA-12.5Usuário sem autenticaçãorequisição sem tokenrealiza PUT /disponibilidades/:idsistema retorna HTTP 401

RF-13 — Gerar Escala

Nota: RF-13 não está no escopo do MVP de 18 RFs, mas seus critérios de aceitação e regras de negócio foram documentados conforme solicitação do professor (feedback issue #118: "Definir regras de negócio para [...] escala").

Regras de Negócio

  • Escala gerada com base nas disponibilidades registradas dos voluntários.
  • Um voluntário não pode ser alocado em dois eventos com conflito de horário.
  • Evento sem disponibilidade compatível retorna escala vazia para aquele slot.
  • Somente administradores autenticados podem gerar escalas.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-13.1Geração com voluntários disponíveisadministrador autenticado, evento cadastrado, voluntários com disponibilidade compatívelsolicita geração de escala para o eventosistema retorna HTTP 200 com lista de voluntários alocados por horário
CA-13.2Conflito de horário bloqueadovoluntário já alocado em outro evento no mesmo horáriosolicita alocação do mesmo voluntáriosistema exclui o voluntário da escala gerada e retorna os disponíveis sem conflito
CA-13.3Nenhum voluntário disponívelnenhum voluntário com disponibilidade compatível com o eventosolicita geração de escalasistema retorna HTTP 200 com {"escala": []} e mensagem indicando ausência de disponíveis
CA-13.4Evento inexistenteevento_id não existe no bancosolicita geração de escalasistema retorna HTTP 404

RF-20 — Publicar Solicitação de Apoio

Regras de Negócio

  • Campos obrigatórios: tipo_contribuicao, prazo e urgencia.
  • Campo urgencia aceita: "baixa", "media", "alta".
  • Campo prazo deve ser data futura.
  • Somente administradores autenticados podem publicar solicitações.
  • Solicitação publicada fica imediatamente visível na página pública.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-20.1Publicação com dados válidosadministrador autenticado, todos os campos válidosrealiza POST /solicitacoes com tipo_contribuicao, prazo e urgenciasistema retorna HTTP 201; solicitação aparece em GET /solicitacoes sem autenticação
CA-20.2Urgência inválidaadministrador autenticado, urgencia = "critica"realiza POST /solicitacoessistema retorna HTTP 422 com mensagem de urgência inválida
CA-20.3Prazo no passadoadministrador autenticado, prazo = "2020-01-01"realiza POST /solicitacoessistema retorna HTTP 422 com "Prazo deve ser uma data futura"
CA-20.4Campos obrigatórios ausentesadministrador autenticado, corpo sem urgenciarealiza POST /solicitacoessistema retorna HTTP 422 indicando campos obrigatórios ausentes
CA-20.5Usuário sem autenticaçãorequisição sem tokenrealiza POST /solicitacoessistema retorna HTTP 401

RF-21 — Listar Solicitações de Apoio

Regras de Negócio

  • Listagem pública — não requer autenticação.
  • Exibe apenas solicitações ativas (prazo não expirado).
  • Ordenação: urgencia decrescente (alta → media → baixa), depois prazo crescente.
  • Solicitações com prazo vencido não devem aparecer na listagem pública.

Critérios de Aceitação

#CenárioDadoQuandoEntão
CA-21.1Listagem pública sem autenticaçãosolicitações ativas cadastradasvisitante acessa GET /solicitacoes sem tokensistema retorna HTTP 200 com solicitações ordenadas por urgência decrescente
CA-21.2Filtragem automática de vencidassolicitação com prazo expirado existe no bancovisitante acessa GET /solicitacoessistema retorna apenas solicitações com prazo futuro; vencidas não aparecem
CA-21.3Ordenação por urgênciasolicitações com urgências mistasacessa GET /solicitacoesitens com urgencia = "alta" aparecem antes de "media" e "baixa"
CA-21.4Banco sem solicitações ativasnenhuma solicitação ativavisitante acessa GET /solicitacoessistema retorna HTTP 200 com []

Relação com DoR e DoD

Vínculo com o DoR

Os critérios acima satisfazem os requisitos do DoR:

Critério DoRComo os CAs atendem
Descrição com mínimo 50 palavras e comportamento esperadoCada RF possui descrição funcional + regras de negócio detalhadas
Mínimo 2 critérios de aceitação no formato Dado/Quando/EntãoTodos os RFs possuem ≥ 2 CAs positivos + cenários negativos
Dependências identificadasCAs de RF-13 referenciam RF-11; CAs de RF-16 referenciam RF-09 e RF-14
Vinculação ao requisito funcionalCada CA referencia seu RF (CA-XX.Y → RF-XX)

Vínculo com o DoD

Critério DoDComo validar via CAs
Testes unitários com cobertura ≥ 60%Cenários negativos (4xx) já têm testes em handler.test.ts — cobrem os CAs de erro
Pipeline CI passandodeno test executa os CAs automatizados (48/48 passando atualmente)
Funcionalidade testada em homologaçãoCAs positivos (HTTP 201/200) validados manualmente em staging antes da entrega
Critérios de aceitação do DoR validadosChecklist da issue marcado após validação de cada CA

DataVersãoDescriçãoAutor(es)Revisor(es)
29/06/20261.0Criação dos critérios de aceitação, regras de negócio e cenários negativos dos RFs do MVPEnzo