Files
Reem-Notas/docs/BATERIA-DE-TESTES.md

278 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Bateria de testes — Reem Notas (ambiente de teste)
Roteiro de regressão para ser executado por um agente (inclusive modelos menores)
com a skill `agent-browser`. Não é preciso conhecer o projeto: siga os casos na
ordem e preencha o relatório do final.
## Regras de segurança (leia antes de tudo)
1. **Somente leitura + interações seguras.** É PROIBIDO:
- clicar em qualquer botão que abra confirmação (`Tem certeza?`, `Rebuscar o
plano?` etc.) — se a confirmação abrir por engano, cancele;
- finalizar, arquivar, excluir ou registrar pagamento de consolidação;
- criar, editar ou excluir usuários, perfis, contatos, grupos ou eventos;
- qualquer envio de WhatsApp/notificação.
- Formulários só podem ser preenchidos nos casos em que o roteiro mandar
explicitamente (login e campos de busca).
2. **Ambiente**: `https://teste.reemtransportes.com.br` (nunca o domínio de
produção).
3. **Avisos do ambiente de teste** (não são falhas):
- Não há pagamentos registrados (`pago_em` vazio) — gráficos e tabelas de
pagamento vazios são o esperado;
- O deploy é manual: o site pode estar atrás do código do repositório. Se um
caso falhar por algo que parece "código novo que não chegou lá", registre
como `DEPLOY?` em vez de `FALHOU`.
4. Screenshots de evidência vão para o diretório de scratchpad da sessão.
## Credenciais
- **Admin (web)**: e-mail `admin@reem.com`, senha `Reem@2026!` — em
`https://teste.reemtransportes.com.br/auth/login`, aba "E-mail".
- **Motorista**: aba "PIN Motorista" da mesma tela (PIN de 4 dígitos; se nenhum
PIN de teste for fornecido na tarefa, marque o caso 8 como `PULADO`).
## Teste 0 — transversal (rodar em TODA página visitada)
Depois de abrir cada página do roteiro, sempre rode:
```bash
agent-browser errors # deve vir vazio
agent-browser network requests | grep -E " (4[0-9]{2}|5[0-9]{2})$" # deve vir vazio
```
- Qualquer erro de console JS ⇒ FALHOU (anote a mensagem).
- Qualquer request com status ≥ 400 ⇒ FALHOU (anote a URL — um asset
`*_controller-*.js` com 404 significa Stimulus quebrado na página inteira; foi
exatamente assim que o bug do preview do romaneio passou despercebido).
- Exceção: chamadas para domínios de terceiros (cloudflareinsights etc.) com
falha não reprovam o caso; registre como observação.
## Roteiro
### Caso 1 — Login por e-mail
```bash
agent-browser open https://teste.reemtransportes.com.br/auth/login
agent-browser snapshot -i # localizar refs de E-mail, Senha e Entrar
agent-browser fill @eX "admin@reem.com"
agent-browser fill @eY "Reem@2026!"
agent-browser press Enter
agent-browser wait --load networkidle
agent-browser get url
```
**PASSOU se**: a URL final é `/dashboard` (ou a home do perfil) e o Teste 0 passa.
Obs.: use `press Enter` — o clique no botão às vezes não navega no primeiro clique.
### Caso 2 — Dashboards
```bash
agent-browser open https://teste.reemtransportes.com.br/dashboard
agent-browser eval "document.querySelectorAll('canvas').length" # gráficos Chart.js
agent-browser eval "document.documentElement.scrollWidth <= window.innerWidth" # sem overflow horizontal
agent-browser screenshot dashboard.png
agent-browser open https://teste.reemtransportes.com.br/dashboard/operacoes
# repetir os três comandos acima (operacoes.png)
```
**PASSOU se**: as duas páginas carregam, há pelo menos 1 `canvas` em cada, sem
overflow horizontal, Teste 0 limpo.
**Versão mobile** (obrigatória no dashboard):
```bash
agent-browser set device "iPhone 16"
agent-browser open https://teste.reemtransportes.com.br/dashboard
agent-browser eval "document.documentElement.scrollWidth <= window.innerWidth"
agent-browser screenshot dashboard-mobile.png
agent-browser set viewport 1280 800 # voltar ao desktop
```
**PASSOU se**: sem scroll horizontal no mobile (regra do projeto: nada de tabela
que exija zoom).
### Caso 3 — Consolidações (abas e filtros)
```bash
agent-browser open "https://teste.reemtransportes.com.br/consolidacoes?visao=lista"
agent-browser snapshot -i | head -40
agent-browser open "https://teste.reemtransportes.com.br/consolidacoes?visao=motoristas"
agent-browser get url
```
**PASSOU se**: as duas visões abrem sem erro; ao trocar de visão os filtros da URL
se mantêm (as visões são abas da MESMA tela, não telas separadas); Teste 0 limpo.
### Caso 4 — Romaneios (inclui o preview)
```bash
agent-browser open https://teste.reemtransportes.com.br/admin/romaneios
agent-browser snapshot -i | head -30 # lista de romaneios
# abrir o primeiro romaneio da lista (link do item):
agent-browser click @eX
agent-browser wait --load networkidle
```
Na tela do romaneio:
A prévia é um `<details>` nativo — abre e fecha **sem JavaScript**, de propósito
(quando os assets caem, ela precisa continuar funcionando):
```bash
# 4a. Fechada ao carregar, e o PDF ainda NÃO foi buscado (iframe é loading=lazy):
agent-browser eval "(()=>{const d=document.querySelector('details[data-romaneio-target=overlay]'); return d ? 'aberto:'+d.open : 'PREVIA AUSENTE';})()"
# esperado: "aberto:false"
# 4b. Abrir e conferir que o iframe aponta para o PDF:
agent-browser eval "document.querySelector('details[data-romaneio-target=overlay] summary').click()"
agent-browser eval "(()=>{const d=document.querySelector('details[data-romaneio-target=overlay]'); const f=d.querySelector('iframe'); return 'aberto:'+d.open+' src:'+(f?.getAttribute('src')||'sem src');})()"
# esperado: "aberto:true src:/admin/romaneios/<id>/pdf?veiculo=..."
# 4c. Fechar de novo:
agent-browser eval "document.querySelector('details[data-romaneio-target=overlay] summary').click()"
# 4d. O PDF responde e é PDF de verdade (não a página de login):
agent-browser eval "(async()=>{const r=await fetch(document.querySelector('details[data-romaneio-target=overlay] iframe').src); const b=await r.blob(); return r.status+' '+b.type+' '+Math.round(b.size/1024)+'KB';})()"
# esperado: "200 application/pdf <N>KB"
```
**PASSOU se**: 4a fechada, 4b abre com src do PDF, 4c fecha, 4d devolve
`application/pdf`, Teste 0 limpo. **NÃO** clicar em "Reimportar plano" (tem
confirmação).
⚠️ Se 4d devolver `text/html`, a sessão caiu no meio do teste — refaça o login e
repita, **não** registre como falha do PDF (já deu falso positivo assim).
### Caso 4e — Vínculo manual da operação (só leitura)
O bloco "Operação do mês" tem que aparecer em todo romaneio, e o formulário
precisa funcionar **sem JavaScript** (é `<details>` nativo + form comum):
```bash
agent-browser eval "(()=>{const d=[...document.querySelectorAll('details')].find(x=>x.querySelector('select[name=operacao_tabela]')); return d ? 'existe | aberto:'+d.open+' | opcoes:'+d.querySelectorAll('option').length : 'AUSENTE';})()"
```
⚠️ Procure pelo `select[name=operacao_tabela]`, **não** pelo texto "Operação do
mês": esse rótulo fica FORA do `<details>` e é renderizado em maiúsculas pelo
CSS, então busca por texto dá falso negativo (já aconteceu num diagnóstico).
**PASSOU se**: o bloco existe; num romaneio **sem** operação ele vem `aberto:true`
(a pendência fica à vista) e num **com** operação vem `aberto:false`; a lista tem
mais de uma `option`.
⚠️ **NÃO enviar o formulário** — vincular altera dados do romaneio. Só conferir
que o controle está lá e abre.
### Caso 5 — Planilha SimpliRoute
```bash
agent-browser open https://teste.reemtransportes.com.br/admin/planilha_simpli_route
agent-browser snapshot -i | head -20
```
**PASSOU se**: a tela abre com a lista de operações disponíveis, Teste 0 limpo.
(Não é preciso baixar o arquivo.)
### Caso 6 — Telas de admin
Abrir cada URL e rodar o Teste 0:
```
/admin/usuarios
/admin/perfis
/admin/configuracoes
/admin/auditoria_logs
/admin/edicao_lancamento
```
**PASSOU se**: todas abrem com conteúdo (título + tabela/cards), sem erro.
**NÃO** editar nada nessas telas.
### Caso 7 — Notificações
Abrir cada URL e rodar o Teste 0:
```
/admin/contatos
/admin/grupos
/admin/eventos
/admin/envios
```
**PASSOU se**: todas abrem, sem erro. **NÃO** disparar envio nem mexer no
WhatsApp/sessão.
### Caso 8 — Login PIN do motorista (mobile)
Somente se um PIN de teste foi fornecido na tarefa; senão marcar `PULADO`.
```bash
agent-browser set device "iPhone 16"
agent-browser open https://teste.reemtransportes.com.br/auth/login
# clicar na aba "PIN Motorista", digitar o PIN, entrar
```
**PASSOU se**: cai no dashboard do motorista, valores legíveis sem zoom,
Teste 0 limpo. Ao final: `agent-browser set viewport 1280 800`.
## Caso 9 — Tempo de resposta (performance)
Mede o tempo real de cada tela e do PDF. Rode logado, com a rede parada (sem
outra aba baixando coisa), e compare com a linha de base.
```bash
# Tempo das telas (TTFB | resposta completa | DOM pronto)
for u in /dashboard /dashboard/operacoes "/consolidacoes?visao=lista" /admin/romaneios /admin/romaneios/13; do
agent-browser open "https://teste.reemtransportes.com.br$u" >/dev/null
agent-browser eval "(()=>{const n=performance.getEntriesByType('navigation')[0]; return Math.round(n.responseStart-n.requestStart)+'|'+Math.round(n.responseEnd-n.requestStart)+'|'+Math.round(n.domContentLoadedEventEnd-n.startTime);})()"
done
```
```bash
# Tempo do PDF (o mais pesado do sistema). Com cache-buster, senão mede o cache.
agent-browser eval "(async()=>{const t0=performance.now(); const r=await fetch('/admin/romaneios/13/pdf?veiculo=GADE_002&cb='+Math.random()); const b=await r.blob(); return Math.round(performance.now()-t0)+'ms, '+Math.round(b.size/1024)+' KB';})()"
```
**Linha de base medida em 28/08/2026** (romaneio de 2.047 paradas / 72 veículos,
ambiente de teste, acesso pelo domínio com Cloudflare na frente):
| Alvo | TTFB | Resposta | DOM pronto |
|---|---|---|---|
| `/dashboard` | 339 ms | 340 ms | 493 ms |
| `/dashboard/operacoes` | 168 ms | 251 ms | 402 ms |
| `/consolidacoes?visao=lista` | 349 ms | 351 ms | 430 ms |
| `/admin/romaneios` | 49 ms | 50 ms | 127 ms |
| `/admin/romaneios/13` | 71 ms | 78 ms | 155 ms |
| **PDF de 1 veículo** | — | **228 ms** (84 KB) | — |
| **PDF de TODOS (72)** | — | **8.947 ms** (1,7 MB) | — |
**Orçamento — FALHOU se passar de**: 1 s de TTFB em qualquer tela; 1 s no PDF de
um veículo (é ele que a prévia carrega, tem que abrir na hora); 30 s no PDF
completo (acima disso o proxy corta a conexão e o operador recebe erro).
⚠️ **Ponto de atenção conhecido**: o PDF de todos os veículos leva ~9 s e segura
um processo do servidor esse tempo todo. Ainda dentro do aceitável para uma ação
manual e pontual, mas é o primeiro candidato a virar download em segundo plano se
o volume crescer ou se dois operadores baixarem ao mesmo tempo. **Não** compare
esse número com o do PDF de um veículo: são unidades diferentes (1 folha × 72).
## Relatório final (obrigatório)
Terminar a execução com uma tabela e a lista de falhas:
| Caso | Resultado | Evidência |
|------|-----------|-----------|
| 0 (por página) | PASSOU/FALHOU | página + erro |
| 1 Login | PASSOU/FALHOU/DEPLOY?/PULADO | screenshot |
| 2 Dashboards | … | … |
| 3 Consolidações | … | … |
| 4 Romaneios/preview | … | … |
| 5 Planilha | … | … |
| 6 Admin | … | … |
| 7 Notificações | … | … |
| 8 PIN motorista | … | … |
| 9 Performance | … | tabela de tempos |
Depois da tabela, listar **somente as falhas**, cada uma com: URL, o que era
esperado, o que aconteceu (mensagem de erro/console) e o caminho do screenshot.
Se tudo passou, dizer isso em uma linha. Encerrar com `agent-browser close`.