feat: gerar Report a partir de uma Run #45

Merged
jhony75 merged 3 commits from feature/generate-report-from-run into develop 2026-09-08 16:32:06 -03:00
Owner

Novo botão "Gerar Report" na tela de uma Run (POST /api/runs/{id}/generate-report).

Decisões confirmadas com o usuário antes de implementar

  • Retrato congelado: cenários/steps (nome, status, causa da falha) são copiados pro report no momento da geração — editar a run original depois não muda mais um report já gerado/aprovado.
  • Achados automático + revisável: achados já abertos via "Abrir defeito" nos steps que falharam nessa run entram automaticamente, mas continuam podendo ser removidos/outros anexados depois (UI de anexar/remover achado já existia no ReportDetail).

Anexos: referência, não duplicação

Esse era o ponto que o usuário queria evitar. RunAttachment ganhou source_attachment_id (self-FK opcional, data agora nullable) — o passo copiado ganha sua própria linha (mantém step.images funcionando normalmente em toda a base), mas com o BLOB vazio e apontando pro anexo original via uma @property data que resolve pro anexo de origem quando a cópia não tem bytes próprios. Validado ponta a ponta manualmente: os bytes servidos pra cópia são idênticos aos do original, e a linha da cópia tem data IS NULL no banco (zero duplicação de BLOB).

Report.source_run_id (nullable, SET NULL, sem cascade) é só proveniência — apagar a run original não apaga o report, apagar o report não apaga a run original. Diferente de Report.run (a run "de suporte" exclusiva e descartável de todo report, que continua existindo do jeito que sempre existiu).

O que mais mudou

  • TestRun.report precisou de foreign_keys explícito — agora há dois caminhos de FK entre test_runs/reports (report_id e o novo source_run_id), o que quebrava toda query envolvendo Run com AmbiguousForeignKeysError até eu corrigir (pego pelos próprios testes).
  • RunDetail agora lista "Reports gerados a partir desta run", pra evitar gerar duplicado sem querer.
  • Bug pré-existente corrigido de carona: a aba Tests do ReportDetail nunca passava urlFn/onDelete corretos pra evidência de step — caía no endpoint de anexo de Report/Issue (/api/images) em vez do de Run (/api/run-images), onde evidência de step sempre vive. RunDetail já fazia certo; só ficou visível agora testando um report com evidência de step de verdade.

Verificação

  • pytest -q — 156 passed (5 testes novos cobrindo: snapshot congela status mesmo com a run mudando depois, evidência referenciada sem duplicar BLOB, achados pré-selecionados via "Abrir defeito", 404 pra run inexistente, 400 pra tentar gerar a partir da run de suporte de outro report)
  • downgrade/upgrade da migration testados manualmente, limpos
  • npx tsc --noEmit / npm run lint (0 erros) / npx vitest run (106 passed) / npm run build — todos ok
  • Testado manualmente no navegador contra o banco de dev real: run → evidência → Gerar Report → conferido cenário/step/evidência/proveniência no report gerado, bytes idênticos via /api/run-images, data IS NULL na linha copiada. Dados de teste removidos do dev depois.
Novo botão "Gerar Report" na tela de uma Run (`POST /api/runs/{id}/generate-report`). ## Decisões confirmadas com o usuário antes de implementar - **Retrato congelado**: cenários/steps (nome, status, causa da falha) são copiados pro report no momento da geração — editar a run original depois não muda mais um report já gerado/aprovado. - **Achados automático + revisável**: achados já abertos via "Abrir defeito" nos steps que falharam nessa run entram automaticamente, mas continuam podendo ser removidos/outros anexados depois (UI de anexar/remover achado já existia no ReportDetail). ## Anexos: referência, não duplicação Esse era o ponto que o usuário queria evitar. `RunAttachment` ganhou `source_attachment_id` (self-FK opcional, `data` agora nullable) — o passo copiado ganha sua própria linha (mantém `step.images` funcionando normalmente em toda a base), mas com o BLOB vazio e apontando pro anexo original via uma `@property data` que resolve pro anexo de origem quando a cópia não tem bytes próprios. Validado ponta a ponta manualmente: os bytes servidos pra cópia são idênticos aos do original, e a linha da cópia tem `data IS NULL` no banco (zero duplicação de BLOB). `Report.source_run_id` (nullable, `SET NULL`, sem cascade) é só proveniência — apagar a run original não apaga o report, apagar o report não apaga a run original. Diferente de `Report.run` (a run "de suporte" exclusiva e descartável de todo report, que continua existindo do jeito que sempre existiu). ## O que mais mudou - `TestRun.report` precisou de `foreign_keys` explícito — agora há dois caminhos de FK entre `test_runs`/`reports` (`report_id` e o novo `source_run_id`), o que quebrava toda query envolvendo Run com `AmbiguousForeignKeysError` até eu corrigir (pego pelos próprios testes). - RunDetail agora lista "Reports gerados a partir desta run", pra evitar gerar duplicado sem querer. - **Bug pré-existente corrigido de carona**: a aba Tests do ReportDetail nunca passava `urlFn`/`onDelete` corretos pra evidência de step — caía no endpoint de anexo de Report/Issue (`/api/images`) em vez do de Run (`/api/run-images`), onde evidência de step sempre vive. RunDetail já fazia certo; só ficou visível agora testando um report com evidência de step de verdade. ## Verificação - `pytest -q` — 156 passed (5 testes novos cobrindo: snapshot congela status mesmo com a run mudando depois, evidência referenciada sem duplicar BLOB, achados pré-selecionados via "Abrir defeito", 404 pra run inexistente, 400 pra tentar gerar a partir da run de suporte de outro report) - downgrade/upgrade da migration testados manualmente, limpos - `npx tsc --noEmit` / `npm run lint` (0 erros) / `npx vitest run` (106 passed) / `npm run build` — todos ok - Testado manualmente no navegador contra o banco de dev real: run → evidência → Gerar Report → conferido cenário/step/evidência/proveniência no report gerado, bytes idênticos via `/api/run-images`, `data IS NULL` na linha copiada. Dados de teste removidos do dev depois.
Retrato congelado no momento da geracao: nome/status/causa da falha de
cada cenario e passo da run sao copiados pro run de suporte do novo
report (editar a run original depois nao muda mais um report ja
gerado). As evidencias nunca sao duplicadas -- RunAttachment ganha
source_attachment_id (self-FK opcional) e a property `data` resolve
pro anexo original quando a copia nao tem BLOB proprio, entao o passo
copiado aponta pro mesmo anexo sem duplicar o BLOB no banco.

Achados ja abertos via "Abrir defeito" (Report.run_step_id) nos steps
que falharam nessa run entram automaticamente no report gerado --
mesma associacao N:N de sempre (report_issues), revisavel depois via
anexar/remover, como qualquer achado de report.

Report.source_run_id (nullable, SET NULL, sem cascade) e so
proveniencia -- apagar a run original nao apaga o report, apagar o
report nao apaga a run original. Diferente de Report.run (a run "de
suporte" exclusiva e descartavel do report, com cascade de verdade).

TestRun.report precisou de foreign_keys explicito porque agora ha dois
caminhos de FK entre test_runs e reports (report_id e o novo
source_run_id).
Chama POST /api/runs/{id}/generate-report e navega direto pro report
criado. RunDetail tambem lista os reports ja gerados a partir da run
(TestRun.generated_reports), pra evitar gerar duplicado sem querer.
Tipos regenerados de docs/openapi.json via openapi-typescript.
fix: evidencia de step no report usa /api/run-images, nao /api/images
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 6m38s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
9a376133ef
ExistingAttachments (linha do step, aba Tests do ReportDetail) nunca
passava urlFn nem um onDelete correto -- caia no default (api.imageUrl/
api.deleteImage, endpoint de anexo de Report/Issue), mas evidencia de
step sempre fica em RunAttachment (/api/run-images). Bug pre-existente
(RunDetail.tsx ja fazia certo, ver urlFn={api.runImageUrl} la), so
ficou visivel agora testando reports com evidencia de step de verdade.
jhony75 merged commit 8baac84f3f into develop 2026-09-08 16:32:06 -03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jhony75/eeg-qa!45
No description provided.