# 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 `
` 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//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 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** (é `
` 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 `
` 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`.