Skip to content

test(jusbr): contratos offline para auth/cpopg/download_documents (#141)#154

Open
bdcdo wants to merge 2 commits into
mainfrom
test/jusbr-contracts-141
Open

test(jusbr): contratos offline para auth/cpopg/download_documents (#141)#154
bdcdo wants to merge 2 commits into
mainfrom
test/jusbr-contracts-141

Conversation

@bdcdo
Copy link
Copy Markdown
Collaborator

@bdcdo bdcdo commented Apr 30, 2026

Sumário

Implementa a issue #141 (Sub-PR 1D — agregadores, fatia JusBR). Adiciona suite de contratos offline em tests/jusbr/ cobrindo auth, cpopg, download_documents em 19 cenários via responses + OrderedRegistry, capture script com sanitização agressiva pós-captura, e resolve 3 followups descobertos durante a escrita dos contratos.

Bloqueante para merge

⚠️ Rodar capture script com JWT real antes do merge. 10 testes em tests/jusbr/ falham com FileNotFoundError até tests/jusbr/samples/ ser preenchido:

```bash
JUSBR_JWT= JUSBR_CNJ_1= JUSBR_CNJ_2= \
python -m tests.fixtures.capture.jusbr
```

Sanitização agressiva (CNJ neutro, PII redatada, regex defensivo CPF/e-mail) acontece automaticamente. Detalhes em tests/fixtures/capture/README.md > "Agregadores → JusBR".

Followups resolvidos no PR

Os 3 achados durante a escrita dos contratos foram corrigidos junto, evitando 3 issues separadas:

  1. auth(token)verify_exp ativado: com verify_signature=False o PyJWT desativa verify_exp por padrão, e o ramo except jwt.ExpiredSignatureError era dead code. Agora verify_exp: True é explícito; tokens expirados levantam ValueError("Token JWT expirado.") como já documentado.

  2. cpopg — coluna processo em fallbacks: linhas de fallback (CNJ Inválido / Não encontrado / Erro de detalhes) agora populam processo (canônico) além de processo_pesquisado. OutputCPOPGJusBR declara processo: str (alinhado com OutputCJSGBase); processo_pesquisado flui via extra="allow".

  3. download_documents — download parcial: documentos com só hrefTexto ou só hrefBinario são baixados parcialmente, em vez de pulados. Documento é pulado apenas quando os dois hrefs faltam. Linha de saída tem texto=None ou _raw_binary_api=None conforme o href ausente.

Fora de escopo (declarado pela issue)

  • auth_firefox(): depende de browser_cookie3 lendo cookies reais do Firefox; candidato a cassette VCR na Fase 4 da test: plano de testagem 2026 #113.
  • Wiring de InputAuthJusBR/InputCPOPGJusBR/InputDownloadDocumentsJusBR: segue regra do projeto (contrato e wiring nunca no mesmo PR), follow-up separado.

Mudanças

  • src/juscraper/aggregators/jusbr/client.py — followups 1 + 2 + 3.
  • src/juscraper/aggregators/jusbr/schemas.pyOutputCPOPGJusBR.processo: str.
  • tests/jusbr/test_auth_contract.py (4 testes), test_cpopg_contract.py (5), test_cpopg_filters_contract.py (3), test_download_documents_contract.py (7), __init__.py.
  • tests/fixtures/capture/jusbr.py — capture script com env vars JUSBR_JWT/JUSBR_CNJ_* + sanitização agressiva.
  • tests/fixtures/capture/README.md — seção "Agregadores → JusBR".
  • CHANGELOG.md — entrada em Added (contratos) + 3 entradas em Changed (followups).

Test plan

  • Bloqueante: rodar capture script com JWT real para preencher tests/jusbr/samples/.
  • pytest tests/jusbr/ → 19 passando offline (após captura).
  • pytest -m "" → suite completa sem regressão.
  • pytest tests/schemas/ → schemas tests verdes (confirmado: 148 passing pré-captura).
  • flake8 + mypy via pre-commit → verdes (confirmado no commit).
  • Revisar diff dos samples capturados pra confirmar que sanitização zerou todo PII antes do commit final.

Refs

Closes #141. Refs #104 (umbrella), #113 (roadmap 0.9), #84 (decisão de manter agregadores fora do refactor estrutural), #22 (auth automatizada — separada).

🤖 Generated with Claude Code

Adiciona suite de contratos offline para o agregador JusBR (`tests/jusbr/`)
cobrindo `auth`, `cpopg` e `download_documents` em 19 cenarios via
`responses` + `OrderedRegistry`. Inclui capture script
`tests/fixtures/capture/jusbr.py` com sanitizacao agressiva pos-captura
(CNJ neutro, PII redatada, regex defensivo CPF/e-mail) — depende das env
vars `JUSBR_JWT`, `JUSBR_CNJ_1`, `JUSBR_CNJ_2`. Samples ainda nao
commitados (rodar capture script com JWT real para preencher
`tests/jusbr/samples/`); 9 testes ja passam offline e 10 ficam vermelhos
ate a captura.

Resolve no mesmo PR os 3 followups identificados durante a escrita dos
contratos:

1. `auth(token)`: adiciona `"verify_exp": True` explicito nas options do
   `jwt.decode`. Com `verify_signature=False` o PyJWT desativa
   `verify_exp` por padrao, e o ramo `except jwt.ExpiredSignatureError`
   era dead code — tokens expirados passavam silenciosamente. Agora
   levantam `ValueError("Token JWT expirado.")`.

2. `cpopg`: linhas de fallback (CNJ Invalido / Nao encontrado / Erro de
   detalhes) populam tambem a coluna `processo` (canonico do projeto)
   alem de `processo_pesquisado`. `OutputCPOPGJusBR` agora declara
   `processo: str` (alinhado com `OutputCJSGBase`); `processo_pesquisado`
   continua presente em rows de fallback como sinonimo via `extra="allow"`.

3. `download_documents`: documentos com so `hrefTexto` ou so `hrefBinario`
   sao baixados parcialmente em vez de pulados. Documento e pulado apenas
   quando ambos os hrefs faltam. Linha de saida tem `texto=None` ou
   `_raw_binary_api=None` quando o href correspondente ausenta.

`auth_firefox()` ficou fora dos contratos (depende de cookies reais do
Firefox; candidato a cassette VCR na Fase 4 da #113). Wiring de
`InputAuthJusBR`/`InputCPOPGJusBR`/`InputDownloadDocumentsJusBR` segue
como follow-up separado (regra do projeto: contrato e wiring nunca no
mesmo PR).

BLOQUEANTE para merge: rodar capture script com JWT real e commitar
samples. 10 testes em `tests/jusbr/` falham com FileNotFoundError ate
isso ser feito.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bdcdo
Copy link
Copy Markdown
Collaborator Author

bdcdo commented May 2, 2026

Tentei rebasear em main mas dá conflito em CHANGELOG.md e tests/fixtures/capture/README.md. CHANGELOG é trivial (manter a entrada nova de contratos JusBR + as que entraram em main). README de capture provavelmente conflita por causa das adições de capture scripts novos (TRF3/TRF5/TRF6, comunica_cnj, etc.) — vale conciliar mantendo as convenções de ambos.

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.

test(1D-jusbr): contrato offline para auth/cpopg/download_documents

2 participants