feat: frontend consome optimistic concurrency, cobertura de testes, SBOM/scan #31

Merged
jhony75 merged 5 commits from feature/combined-perf-quality into develop 2026-09-06 03:35:58 -03:00
Owner

Tres entregas independentes, cada uma seu proprio commit:

  • Frontend consome o controle otimista de edicao: ReportDetail, IssueDetail, RunDetail e TechnicalValidationDetail capturam Last-Modified no GET e reenviam If-Unmodified-Since no PUT/PATCH. Um 412 mostra a mensagem do backend com um botao Recarregar. Validado com um teste manual real de conflito (edicao concorrente via curl com a pagina aberta no navegador).
  • Cobertura de testes Vitest: 24 novos testes em 8 arquivos, cobrindo formularios de criacao, telas de detalhe/edicao (incluindo o fluxo de conflito 412 de ponta a ponta) e as telas de listagem que ainda nao tinham teste.
  • SBOM + scan de vulnerabilidades (Trivy) no CI: gera SBOM (CycloneDX) e escaneia as imagens backend/frontend depois do build, falhando so em CRITICAL com correcao ja publicada. Validado localmente simulando o step exato do CI contra as duas imagens reais.

Validado com suite completa do backend (85 testes) + typecheck/testes (32)/build do frontend.

Tres entregas independentes, cada uma seu proprio commit: - **Frontend consome o controle otimista de edicao**: ReportDetail, IssueDetail, RunDetail e TechnicalValidationDetail capturam Last-Modified no GET e reenviam If-Unmodified-Since no PUT/PATCH. Um 412 mostra a mensagem do backend com um botao Recarregar. Validado com um teste manual real de conflito (edicao concorrente via curl com a pagina aberta no navegador). - **Cobertura de testes Vitest**: 24 novos testes em 8 arquivos, cobrindo formularios de criacao, telas de detalhe/edicao (incluindo o fluxo de conflito 412 de ponta a ponta) e as telas de listagem que ainda nao tinham teste. - **SBOM + scan de vulnerabilidades (Trivy)** no CI: gera SBOM (CycloneDX) e escaneia as imagens backend/frontend depois do build, falhando so em CRITICAL com correcao ja publicada. Validado localmente simulando o step exato do CI contra as duas imagens reais. Validado com suite completa do backend (85 testes) + typecheck/testes (32)/build do frontend.
ReportDetail, IssueDetail, RunDetail e TechnicalValidationDetail capturam
Last-Modified no GET e reenviam como If-Unmodified-Since no PUT/PATCH de
"Salvar alteracoes" — hook frontend/src/hooks/useLastModified.ts. Um 412
mostra a mensagem do backend com um botao "Recarregar" que refaz o GET
(capturando o Last-Modified novo); depois disso salvar funciona normalmente.

api.ts ganhou ApiError (preserva o status HTTP, antes so a mensagem
sobrevivia) e um onHeaders opcional em RequestOptions pra capturar headers de
resposta sem mudar o tipo de retorno de request() em nenhum outro lugar.

Validado com um teste manual real de conflito (edicao concorrente via curl
enquanto a pagina estava aberta no navegador) — 412 + mensagem + recarregar +
salvar de novo funcionaram ponta a ponta.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 novos testes (8 arquivos) cobrindo os formularios de criacao (ReportForm,
RunForm, TechnicalValidationForm — submissao feliz + validacao de campo
obrigatorio) e as telas de detalhe/edicao (ReportDetail, IssueDetail,
RunDetail, TechnicalValidationDetail — carregar, salvar, e o conflito 412 do
controle otimista de edicao visto de ponta a ponta: mensagem exibida, botao
"Recarregar", recuperacao depois de clicar nele), mais as telas de listagem
que ainda nao tinham teste (Issues, Runs, TechnicalValidations).

Helper de teste comum extraido pra frontend/src/test/renderWithProviders.tsx
(era duplicado inline em ReportList.test.tsx), com suporte a rota
parametrizada pros componentes que usam useParams().

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
feat: SBOM + scan de vulnerabilidades (Trivy) no CI
Some checks failed
EEG QA CI / validate-and-build (pull_request) Failing after 4m16s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
6855e5120f
Depois de construir as imagens de backend e frontend (docs fica de fora — nao
serve trafego de aplicacao), o CI roda Trivy:

1. gera SBOM (CycloneDX JSON) — hoje fica nos logs do job, ainda nao publicado
   como artifact baixavel (ver ressalva no BACKLOG.md);
2. escaneia vulnerabilidades e falha o job so em CRITICAL com correcao ja
   publicada (--ignore-unfixed) — HIGH ou CRITICAL sem patch disponivel ficam
   registradas mas nao bloqueiam, ja que nao ha nada acionavel a fazer agora.

Roda antes de "Publish images...", entao uma imagem com CRITICAL corrigivel
nunca chega a ser publicada. Validado localmente simulando o step exato do CI
(mesmas tags, mesmos comandos) contra as duas imagens reais — hoje ambas
passam limpas (backend: 122 componentes no SBOM, frontend: 72, nenhuma
CRITICAL corrigivel).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix: remover bind mount de path local no step de SBOM/scan (Trivy)
Some checks failed
EEG QA CI / validate-and-build (pull_request) Failing after 3m35s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
25b062ed93
O CI real (PR #31, run 68) falhou no step novo — nao consegui acessar o log
detalhado (API do Forgejo 15.0.6 nao expõe rota de logs de actions, e a
sessao do navegador nao estava autenticada), entao aplico a correcao mais
provavel com base em como o step estava estruturado.

Causa provavel: -v "$PWD/sbom:/out" monta um path do HOST, resolvido pelo
daemon Docker — mas o job (runs-on: docker) ja roda dentro de um container,
entao o "docker run" do Trivy cria um container IRMAO no daemon do HOST (via
socket compartilhado), nao um filho deste container. $PWD ali e um path
dentro do container do job, que nao existe no host — o bind mount falharia.

Troca --output /out/x.json + bind mount por redirecionamento de stdout
(docker run ... > arquivo.json), que nao depende de resolucao de path entre
containers. Testado localmente: JSON gerado limpo (logs INFO/WARN do Trivy
vao pro stderr, nao contaminam o stdout).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix: rodar Trivy como binario nativo em vez de via docker run
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 4m6s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
012db28a69
Log real do CI (PR #31, run 69): Cannot connect to the Docker daemon at
unix:///var/run/docker.sock. Is the docker daemon running? — o container do
job nao expoe um socket Docker de verdade nesse caminho (nem docker,
containerd nem podman testados pelo proprio Trivy), entao um container Trivy
a parte (via docker run -v /var/run/docker.sock:...) nao conseguia inspecionar
as imagens, mesmo com docker build/docker push funcionando normalmente nas
steps anteriores desse mesmo shell.

Corrigido instalando o Trivy como binario nativo (curl | sh do instalador
oficial) e rodando ele direto no shell do job, sem docker run — ele reusa o
mesmo client Docker que ja funciona pras outras steps, sem precisar de socket
algum. Testado num container que replica o cenario (docker CLI + socket real
do host): SBOM e scan de vulnerabilidades funcionam identicos ao esperado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jhony75 merged commit 24a0d75bf2 into develop 2026-09-06 03:35:58 -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!31
No description provided.