4.7 KiB
Smoke local do compose de desenvolvimento
Smoke do ambiente Docker local. Confere o Adaptador depois de atualizar código, reinstalar dependências ou recriar os contêineres, sem Supabase de homologação.
Não altera scripts/smoke-staging.ts nem o comando npm run smoke:staging.
Separação
| Smoke local | Smoke de homologação | |
|---|---|---|
| Comando | npm run smoke:local |
npm run smoke:staging |
| Script | scripts/smoke-local.ts |
scripts/smoke-staging.ts |
| Alvo | http://127.0.0.1:3000 (ADAPTER_SMOKE_LOCAL_URL só se for HTTP em loopback) |
ADAPTER_SMOKE_URL público |
| Identidade | POST /api/dev/session com as fixtures de desenvolvimento |
Supabase Auth de homologação |
| Banco | Postgres 16 do docker-compose.yml, publicado em loopback |
Banco de homologação |
| Jornada | modelo XLSX, upload, mapeamento, prévia, worker, XLSX, CSV e PDF | fase 1 anônima; fase 2 só leitura autenticada. Upload e download continuam no runbook |
| Resultado | evidência do compose local | evidência de hml-ada.elopro.app |
Um PASS local não preenche nem aprova os gates de homologação externa do checklist: deploy real (F7), smoke de homologação (F10) e ensaio de rollback (F11) continuam pendentes até rodarem no ambiente externo.
Quando rodar
Com o compose local no ar:
docker compose up --build
docker compose exec web /app/docker/entrypoint.sh migrate
npm run smoke:local
A migration é um passo anterior e manual. O smoke não executa migrate, seed, seed:staging nem flag.
O que verifica
GET /api/health/readycom HTTP 200 estatus=ready.checks.database=ok.checks.migrations=ok, sem ids pendentes. Se houver migration pendente, a jornada não grava.checks.redis=ok.- Leitura e escrita no volume privado: o contêiner
webgrava, relê e apaga um arquivo em/app/.data/storage/_smoke-local. O health de storage só cria diretório; esta prova é separada. ADAPTER_JOB_MODE=workernos contêinereswebeworker.- Sessão local emitida e
POST /api/auth/staging/sessionrespondendo 404. - Ana enxerga só o workspace Alpha.
GET /api/spreadsheet-adapter/modelsautenticado.- Cadastro de um XLSX fictício, upload, mapeamento, prévia, fila do worker e download XLSX, CSV e PDF pelos contratos reais em
src/app/api/spreadsheet-adapter/. - Conteúdo da sentinela fictícia nos três formatos e hash do modelo original inalterado. No PDF a sentinela é lida nos operadores de texto do arquivo gerado: a fonte padrão grava os caracteres em hexadecimal, não como texto solto.
- Anônimo recebe 401; Diego, no workspace Beta com o módulo desligado, recebe 403
FEATURE_DISABLED; Ana não seleciona Beta; Diego não lê, baixa nem exclui o recurso de Alpha; corpo comworkspace_idde Beta recebe 403WORKSPACE_FORBIDDEN. - Logs de
webeworkerdurante a execução, mais respostas HTTP 5xx.
Os dados são colunas Nome e Codigo e um valor SMOKELOCAL mais um sufixo da execução. Não há planilha real.
Segurança da gravação
Antes de cadastrar o modelo, o script:
- recusa
ADAPTER_ENV=stagingouproductionno processo; - recusa URL que não seja HTTP em loopback;
- interrompe se
/api/health/readyreportar outro ambiente; - lê
DATABASE_URLsó dentro do contêinerwebe só aceita hostpostgrese databaseadaptador; - conecta no host pela porta publicada por
docker compose port, e só se o bind for loopback; - exige role com
rolsuperourolbypassrls, porque a RLS força política e não háDELETEde modelo ou de job paraapp_user; - fotografa modelos, jobs, feature flags e configuração de upload.
A limpeza, na mesma transação, apaga somente o modelo e as operações criados nesta execução (nome, ids e autor conferidos, ids anteriores excluídos da cláusula). Auditoria removida é só a da Ana, posterior ao início da gravação, ligada a esses ids ou à tentativa de workspace forjado. Se a contagem de auditoria alheia mudar, a transação é desfeita.
Os arquivos apagados no volume são só as chaves original, source, out.csv e out.xlsx desse modelo e dessa operação. O script não roda docker compose down nem remove volume.
A feature flag não é ligada, desligada nem restaurada. Se ela mudar durante a execução, o item correspondente falha.
Se a limpeza não puder ser garantida, os itens de gravação ficam PENDENTE e não entram na conta de aprovados. Código de saída diferente de zero ocorre quando uma verificação executada falha. Pendência sozinha não reprova o processo.
Relatório
Ao terminar, o script imprime executados, aprovados, reprovados, pendentes, tempo, o estado de XLSX, CSV e PDF, as falhas e as pendências.