, Teste e correçoes

This commit is contained in:
2026-08-28 13:13:10 -03:00
parent 1143ed373b
commit 19a0c7a302
6 changed files with 157 additions and 76 deletions

View File

@@ -44,6 +44,21 @@ agent-browser network requests | grep -E " (4[0-9]{2}|5[0-9]{2})$" # deve vir
- 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/<arquivo>.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.
@@ -115,34 +130,65 @@ 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):
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 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"
# 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 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=..."
# 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. Fechar de novo:
agent-browser eval "document.querySelector('details[data-romaneio-target=overlay] summary').click()"
# 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. 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';})()"
# 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 <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).
**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 4d devolver `text/html`, a sessão caiu no meio do teste — refaça o login e
⚠️ 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