# 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). ⚠️ **404 de asset engana duas vezes.** O Cloudflare guarda os arquivos por um ano, então uma tela pode parecer boa enquanto a origem já não serve nada — sempre confira com cache-buster: ```bash curl -s -o /dev/null -w "%{http_code}\n" "https://teste.reemtransportes.com.br/assets/controllers/.js?cb=$RANDOM" ``` E se **todos** derem 404, o problema é o build inteiro, não os arquivos: a tarefa `tailwindcss:build` aborta o `assets:precompile` quando falta `app/assets/tailwind/application.css`. O Propshaft, sem manifesto, continua gerando URLs com o digest certo — por isso a página abre normal e o JS some em silêncio. Confira no servidor com `docker compose logs app | grep '\[boot\] assets'`. - 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 pop-up cujo estado mora na **URL** (`?previa=1`) — abre, fecha e troca de folha por navegação normal, sem JavaScript. **Teste sempre navegando de verdade**, nunca com `.click()` de dentro do `eval`: o clique programático já mascarou um bug (com o Turbo carregado, o mecanismo anterior por `#hash` não abria, mas o `.click()` fazia parecer que abria). ```bash # 4a. Fechada, o pop-up NÃO existe no HTML (e nenhum PDF é gerado): agent-browser open "https://teste.reemtransportes.com.br/admin/romaneios/13" agent-browser eval "document.querySelector('[data-romaneio-target=overlay]') ? 'PRESENTE (erro)' : 'ausente (correto)'" # 4b. Abrir pelo botão, com clique REAL: agent-browser snapshot -i | grep -i "prévia" # pegar o ref do link agent-browser click @eN agent-browser eval "(()=>{const o=document.querySelector('[data-romaneio-target=overlay]'); if(!o) return 'NAO ABRIU'; const c=[...o.querySelectorAll('span')].find(s=>s.textContent.includes(' de ')); return 'aberto | '+c.textContent.trim()+' | url='+location.search;})()" # esperado: "aberto | 1 de 72 · GADE_001 | url=?veiculo=GADE_001&previa=1" # 4c. Avançar de folha SEM fechar (é o carrossel): agent-browser eval "(()=>{const o=document.querySelector('[data-romaneio-target=overlay]'); const a=[...o.querySelectorAll('a')].filter(x=>(x.getAttribute('href')||'').includes('previa')); return a.at(-1).getAttribute('href');})()" # copie o href e navegue nele com `agent-browser open`; o pop-up tem que continuar # aberto e o contador virar "2 de 72". # 4d. Fechar pelo ✕ (volta para a URL sem previa) e o pop-up sumir do HTML. # 4e. O PDF responde e é PDF de verdade (não a página de login): agent-browser eval "(async()=>{const r=await fetch('/admin/romaneios/13/pdf?veiculo=GADE_001&cb='+Math.random()); const b=await r.blob(); return r.status+' '+b.type+' '+Math.round(b.size/1024)+'KB';})()" # esperado: "200 application/pdf KB" ``` **PASSOU se**: 4a ausente, 4b abre com o contador certo, 4c avança mantendo aberto, 4d fecha, 4e devolve `application/pdf`. **NÃO** clicar em "Reimportar plano" (tem confirmação). ⚠️ Se 4e 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 4f — Prévia em branco é o NAVEGADOR, não o sistema O quadro do PDF pode aparecer branco mesmo com tudo funcionando, porque o navegador se recusa a desenhar PDF em iframe. As três causas conhecidas: 1. **"Baixar PDFs em vez de abri-los"** ligado (Chrome/Brave/Edge: `chrome://settings/content/pdfDocuments`); 2. **bloqueador de conteúdo** (Brave Shields, uBlock) barrando o quadro; 3. **bloqueio de pop-up/redirecionamento** do navegador. O sistema **não consegue detectar isso** (o iframe é opaco por segurança), por isso o pop-up traz um aviso fixo com a saída ("abra em outra aba"). Antes de abrir bug de "prévia não aparece", confirme que **não** é o navegador: ```bash # Se ISTO devolve application/pdf, o servidor está certo e o problema é o navegador: agent-browser eval "(async()=>{const r=await fetch('/admin/romaneios/13/pdf?veiculo=GADE_001&cb='+Math.random()); const b=await r.blob(); return r.status+' '+b.type;})()" ``` **PASSOU se**: o aviso está visível no rodapé do pop-up e o `fetch` acima devolve `application/pdf`. Se o fetch devolve PDF e o quadro está branco, o veredito é **"configuração do navegador"**, não falha do sistema — registre 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`.