test(jusbr): contratos offline para auth/cpopg/download_documents (#141)#154
Open
bdcdo wants to merge 2 commits into
Open
test(jusbr): contratos offline para auth/cpopg/download_documents (#141)#154bdcdo wants to merge 2 commits into
bdcdo wants to merge 2 commits into
Conversation
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>
This was referenced Apr 30, 2026
This was referenced May 2, 2026
Collaborator
Author
|
Tentei rebasear em main mas dá conflito em |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sumário
Implementa a issue #141 (Sub-PR 1D — agregadores, fatia JusBR). Adiciona suite de contratos offline em
tests/jusbr/cobrindoauth,cpopg,download_documentsem 19 cenários viaresponses+OrderedRegistry, capture script com sanitização agressiva pós-captura, e resolve 3 followups descobertos durante a escrita dos contratos.Bloqueante para merge
tests/jusbr/falham comFileNotFoundErroraté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:
auth(token)—verify_expativado: comverify_signature=Falseo PyJWT desativaverify_exppor padrão, e o ramoexcept jwt.ExpiredSignatureErrorera dead code. Agoraverify_exp: Trueé explícito; tokens expirados levantamValueError("Token JWT expirado.")como já documentado.cpopg— colunaprocessoem fallbacks: linhas de fallback (CNJ Inválido / Não encontrado / Erro de detalhes) agora populamprocesso(canônico) além deprocesso_pesquisado.OutputCPOPGJusBRdeclaraprocesso: str(alinhado comOutputCJSGBase);processo_pesquisadoflui viaextra="allow".download_documents— download parcial: documentos com sóhrefTextoou sóhrefBinariosão baixados parcialmente, em vez de pulados. Documento é pulado apenas quando os dois hrefs faltam. Linha de saída temtexto=Noneou_raw_binary_api=Noneconforme o href ausente.Fora de escopo (declarado pela issue)
auth_firefox(): depende debrowser_cookie3lendo cookies reais do Firefox; candidato a cassette VCR na Fase 4 da test: plano de testagem 2026 #113.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.py—OutputCPOPGJusBR.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 varsJUSBR_JWT/JUSBR_CNJ_*+ sanitização agressiva.tests/fixtures/capture/README.md— seção "Agregadores → JusBR".CHANGELOG.md— entrada emAdded(contratos) + 3 entradas emChanged(followups).Test plan
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+mypyvia pre-commit → verdes (confirmado no commit).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