Skip to content

Backfill coverage gaps closed by the gate - #288

Open
pnzrfst wants to merge 3 commits into
enforce-coverage-gatefrom
backfill-coverage-gaps
Open

Backfill coverage gaps closed by the gate#288
pnzrfst wants to merge 3 commits into
enforce-coverage-gatefrom
backfill-coverage-gaps

Conversation

@pnzrfst

@pnzrfst pnzrfst commented Aug 18, 2026

Copy link
Copy Markdown

Resumo

Quarta PR da série de migração qlty → couve (empilhada sobre #286). Fecha os 5 gaps de cobertura que o gate (--fail-on-low-coverage) apontou.

O que muda

  • lib/br_danfe/danfe_lib/nfce_lib/header.rb — remove width_box, morto desde a PR Shrink licensee name to fit #159 (2021), que trocou o único call site (bounding_box(width: width_box, ...)) por chamadas individuais de text_box/move_down sem remover o método. Confirmado via git log/git blame que não é bug latente, é código órfão de verdade.
  • spec/br_danfe/{cce_lib,danfe_lib/nfce_lib,danfe_lib/nfe_lib}/document_spec.rb — specs novas para o fallback method_missing/respond_to_missing? das 3 classes Document (delegação pro Prawn subjacente). Cada uma foi mutation-tested localmente: quebrei o super real (trocando por nil/true) e confirmei que a spec nova reprova — não é um passe vazio.
  • spec/spec_helper.rb — exclui lib/prawn/ do SimpleCov, ao lado da exclusão já existente de spec/support/: é um monkey-patch dos internals do Prawn (cache de largura de fonte), não lógica própria do br_danfe.

Prova ao vivo de que o gate funciona

Este commit está deliberadamente incompleto: a spec de delegação do nfe_lib/document_spec.rb está comentada, para provar que o gate (PR #286) reprova de verdade no CI, e não só localmente. Coverage local com isso: 99,94% (295 examples, 0 failures — os testes passam, só a cobertura cai). Um commit de follow-up vai reativar a spec e confirmar o CI virar verde.

O que NÃO muda

  • Não mexe em nenhum comportamento renderizado de PDF — só remove código morto e fecha gaps de delegação/config.

Plano de teste

  • bundle exec rspec local: 297 examples, 0 failures, 100% no estado final
  • bundle exec rubocop --display-cop-names --parallel local: sem ofensas
  • Mutation test manual nas 3 specs novas de delegação: cada uma reprova quando o super real é quebrado
  • CI reprova de propósito nesta PR, mostrando o gap exato no comentário de cobertura (ver comentário abaixo)
  • Commit de follow-up reativa a spec e CI vira verde

🤖 Generated with Claude Code

…nally disabled)

Removes header.rb's width_box, dead since PR #159 (2021) replaced its
only bounding_box call site with individual text_box/move_down calls
without removing the method itself.

Adds specs for the method_missing/respond_to_missing? delegation
fallback in the 3 Document wrapper classes (nfce_lib, cce_lib,
nfe_lib) - each mutation-tested locally to confirm it fails when the
real `super` fallback is broken.

Excludes lib/prawn/ from SimpleCov, alongside the existing
spec/support/ exclusion: it's a Prawn-internals monkey-patch, not
br_danfe's own product logic.

The nfe_lib delegation spec is deliberately commented out in this
commit to prove the coverage gate (PR #286) actually catches a real
gap on live CI, not just locally. Follow-up commit re-enables it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@pnzrfst pnzrfst self-assigned this Aug 18, 2026
@pnzrfst pnzrfst linked an issue Aug 18, 2026 that may be closed by this pull request
@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown

Coverage report

Rating Coverage File Not covered lines
🟢 100.00% spec/br_danfe/cce_lib/document_spec.rb
🟢 100.00% spec/br_danfe/danfe_lib/nfce_lib/document_spec.rb
🟢 100.00% lib/br_danfe/danfe_lib/nfce_lib/header.rb
🟢 100.00% spec/br_danfe/danfe_lib/nfe_lib/document_spec.rb

pnzrfst and others added 2 commits August 18, 2026 16:12
Proves couve's changed-files gate actually flags a real regression
when the file with the uncovered lines is part of the diff, unlike
the previous commit where only the spec file was touched and the
source file's regression was invisible to the gate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The gate verification is complete: the previous commit proved couve
stayed silent when only the spec file was in the diff, and the one
before that proved it fails for real once the source file is also
touched. Back to the intended final state - 100% coverage, gate green.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@pnzrfst

pnzrfst commented Aug 18, 2026

Copy link
Copy Markdown
Author

Verificação ao vivo do gate — dois experimentos

Antes de fechar esta PR, testamos de propósito o comportamento do gate (couve --fail-on-low-coverage, ligado em #286) em CI de verdade, não só localmente.

Experimento 1 — só a spec comentada, sem tocar na implementação

Commit c4422f8: comentei a spec de delegação em spec/br_danfe/danfe_lib/nfe_lib/document_spec.rb, sem mudar lib/br_danfe/danfe_lib/nfe_lib/document.rb. Resultado: CI passou (run), mesmo com a cobertura real caindo pra 99,94% localmente.

Por quê: couve só avalia arquivos presentes no diff da PR (git diff --name-only origin/base...HEAD). Como document.rb não fazia parte do diff dessa PR, o gate nunca chegou a olhar pra ele — a regressão de cobertura ficou completamente invisível.

Experimento 2 — tocando a implementação também

Commit 0a78629: adicionei um comentário temporário em document.rb (linha morta, só pra puxar o arquivo pro diff), mantendo a spec comentada. Resultado: CI reprovou de verdade (run), e o comentário de cobertura mostrou exatamente onde:

🟡 97.29% | lib/br_danfe/danfe_lib/nfe_lib/document.rb | 26, 31

Commit 9ce98c3 reverte o toque temporário e reativa a spec — estado final: 100% de cobertura, CI verde.

Limitação que isso revela (não é bug, é o design)

O gate protege "o arquivo que esta PR está tocando", não "tudo que esta PR afeta". É possível remover/desabilitar um teste sem tocar no arquivo de produto que ele cobria, e o gate não vai perceber — a regressão só aparece quando outra PR futura tocar aquele mesmo arquivo. O couve do facil123 tem exatamente a mesma propriedade (mesmo filtro, @coverage[:source_files].select! { |file| changed_files.include?(file[:name]) }, documentado em docs/padroes-de-programacao/testes-automatizados/o-que-nao-cobrir.md de lá). Vale ter isso em mente: o gate é uma rede de proteção por PR, não uma garantia global de cobertura do repositório.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remover integração com qlty do CI (projeto pausado no Qlty Cloud)

1 participant