Estratégia de testes
Última atualização: 16/09/2026.
O produto não tem PHPUnit / Pest / Cypress neste repositório. A qualidade
hoje é checklist manual + php -l + smoke de health/login. Este documento
define o que testar, a cobertura esperada quando a suíte nascer, e o mínimo
aceitável em cada PR.
Pirâmide desejada (alvo)
| Camada | Alvo | Estado atual |
|---|---|---|
| Unidade (serviços puros, RBAC, parse de taxa) | 60% dos casos de regra | inexistente |
| Integração (endpoint + MySQL de teste) | fluxos de escrita por módulo | inexistente |
| Contrato HTTP (OpenAPI / snapshot JSON) | 100% dos endpoints documentados | catálogo em docs/api/ |
| UI (smoke login + um CRUD) | 5–8 jornadas | manual |
| Exploratório / compliance | KYC, tenant leak | manual |
Quando PSR-4 avançar (plano-migracao-psr4.md), os
serviços deixam de depender de $GLOBALS e a camada unitária vira viável.
Como rodar o que existe
php -l backend/api/auth/login.php
# recorte nos arquivos do PR
git diff --name-only --diff-filter=ACM | findstr /R "\.php$"
node --check assets/js/pages/dashboard/dashboard-page.js
npm run build:css
curl -s http://localhost:8080/backend/api/health.php
Migrations: aplicar em banco local/HML, nunca como teste em prod.
Matriz mínima por PR (obrigatória)
Para qualquer mudança em backend/api ou serviço:
| Caso | Esperado |
|---|---|
| Sem cookie de sessão | 401 (exceto health, login, webhook, API externa) |
| Sem flag | 403 |
| Super-admin | 200 no caminho feliz |
| Outro White Label | 404/403 ou lista vazia — nunca o registro alheio |
| CSRF ausente em POST | 403/400 nos módulos que já exigem (tarefas, comercial, permissões, WL delete) |
| Método errado | 405 se o endpoint chama backend_require_method |
Muitos endpoints ainda não travam o verbo HTTP. Não assuma 405.
Cobertura por domínio (checklist)
Auth
- Login ok / senha errada / usuário inativo / rate limit (6ª tentativa).
- Forgot + reset com token expirado.
- Logout destrói sessão; fingerprint UA divergente derruba sessão.
RBAC / tenant
- Flag no usuário mas fora do escopo do WL → 403.
- Módulo
tasks/leadsdesligado emtenant_modules→ menu some e API 403. - Representante vê só a hierarquia (
users.user_id).
Estabelecimentos
- Cadastro incompleto permanece
cadastro_pendente. - Docs obrigatórios completos →
analise_compliance. - Aprovado/reprovado não rebaixa sozinho.
- Troca de representante gera linha em
logs_troca_representante. - Painel
user_ecenvia token de definir senha, não senha em claro.
Precificação
- Herança: usuário novo copia taxa do WL/pai.
- MDR vs custo efetivo não se misturam na UI errada.
- Excluir plano vinculado a EC deve falhar.
Comercial / Tarefas
due_datede tarefa: não fim de semana, ≥ 3 dias úteis, ≤ +90 dias.- Máx. 3 docs / 10 MB por tarefa.
- Kanban ≤ 200 cards; mudança de status exige flag e (hoje) super-admin
no caminho de
change-status— revalidar no código se isso mudar. - Places: quota da plataforma, não do WL.
Financeiro
- API externa sem token → 401.
- Export CSV não vaza WL.
Assinaturas
- Webhook com HMAC inválido → 401.
- Replay:
event_hashúnico.
Dados de teste
Use tenants fictícios. Mascare CPF/CNPJ. Não copie uploads/ de produção.
Bandeiras: seed 20260728_seed_bandeiras_base.php.
Quando automatizar primeiro
Ordem sugerida (maior risco / menor fixture):
backend_permission_user_can/ Política B (escopo WL)- Rate limit de login
- CSRF helper
backend_parse_percent_rate- Status machine de estabelecimento
- Um teste de API
health.php+login.phpcom MySQL de CI
Ferramenta candidata: PHPUnit 10 + MySQL de serviço no CI, quando o CI existir.