Como rodar o smoke test E2E¶
Diátaxis: how-to. Para o tutorial inicial do app, veja
docs/tutorials/primeiro-atendimento.md.
scripts/smoke-e2e.py é um script Python que exercita o caminho
crítico do Anotae sem subir a interface gráfica. Roda em
~0,1 segundo com parâmetros KDF intencionalmente baixos.
Quando rodar¶
- Pré-release: confirmar que nada quebrou antes de tag.
- Pós-instalação: validar binário PyInstaller numa máquina nova (Windows, Linux, macOS).
- Diagnóstico: produzir vault de teste reproduzível para anexar num issue de bug.
- CI: garantir que a integração entre vault, repositories, backup e export continua coerente.
Como rodar¶
Saída esperada:
Anotae vX.Y.Z — smoke E2E em /tmp/anotae-smoke-<timestamp>
KDF: t=1 m=8192 (parâmetros baixos para não travar CI/hardware modesto)
Criar vault cifrado... ✓ (0.03s)
Cadastrar profissional default... ✓ (0.00s)
Cadastrar paciente sintético... ✓ (0.00s)
Salvar 3 encounters sintéticos... ✓ (0.00s)
Listar encounters do vault... ✓ (0.00s)
Calcular sumário estatístico... ✓ (0.00s)
Criar backup do vault... ✓ (0.00s)
Verificar integridade SHA-256 do backup... ✓ (0.00s)
Listar backups via list_backups()... ✓ (0.01s)
Fechar vault e reabrir com mesma senha... ✓ (0.01s)
Renderizar export Markdown anonimizado (weak)... ✓ (0.01s)
[OK] Smoke E2E concluído com sucesso.
Métricas:
encounters: 3
ciap2_distintos: 1
cid10_distintos: 1
backup_size_bytes: 4096
backup_hash_prefix: 5c9dec18
backups: 1
markdown_chars: 651
Limpou pasta temporária /tmp/anotae-smoke-<timestamp>.
Opções de linha de comando¶
| Flag | Default | Uso |
|---|---|---|
--vault-dir DIR |
pasta temporária | Onde criar o vault. Útil para reproduzir bug. |
--keep |
descartar | Não apaga vault ao final (combinar com --vault-dir). |
--password <sua-senha> |
smoke-senha-mestra-teste |
Senha-mestra do vault de smoke. |
Exit codes¶
| Código | Significado |
|---|---|
0 |
Sucesso (todos os passos passaram). |
1 |
Falha em algum passo (mensagem PT-BR no stderr). |
2 |
Erro de argumento. |
O que o smoke cobre¶
11 passos sequenciais que tocam todos os módulos críticos:
VaultManager.create_vault— Argon2id + ChaCha20-Poly1305 round-tripProfessionalRepository.create— cifra de PII + UNIQUE em CNSPatientRepository.create— cifra de campos PII (nome, DN, mãe…)EncounterRepository.createx3 — FKs para patient/professionalEncounterRepository.list_all— leitura paginadacore.statistics.summary— agregações CIAP-2/CID-10persistence.backup.create_backup— snapshot cifrado + hashverify_backup— recálculo do SHA-256list_backups— descoberta de snapshots- Round-trip de senha: fecha vault, reabre com mesma senha, confirma que encounters persistiram
core.encounter_export.render_markdown(level="weak")— anonimização LGPD Art. 12 (sanity: nenhum dado em claro de paciente; presença deANON-…)
O que o smoke NÃO cobre¶
- GUI PySide6 (sem janelas — para isso use o app real).
- Native Messaging Host (extensão de navegador) — testes de
integração separados em
tests/integration/test_install_extension.py. - HTTP loopback com extensão real — testes em
tests/integration/test_http_bridge.py. - Operações com dados reais — sempre sintéticos.
Integrando ao CI¶
Já está integrado em dois lugares do .github/workflows/ci.yml:
-
Job
test(Ubuntu, Python 3.12 + 3.13) — corre depois dos pytest unitários, antes do build da extensão. Falha o pipeline inteiro se algo regredir. -
Job
smoke-cross-platform(Ubuntu + macOS + Windows, Python 3.12) —fail-fast: falsepara enxergar que SO quebrou. Útil para captar regressões específicas de plataforma:
smoke-cross-platform:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12" }
- run: pip install -e ".[dev]"
- env: { QT_QPA_PLATFORM: offscreen }
run: python scripts/smoke-e2e.py
QT_QPA_PLATFORM=offscreen é necessário porque alguns módulos
importam Qt no tempo de import (ex.: QPdfWriter em
core.encounter_export). Mesmo sem abrir janelas, o backend de
plataforma é tocado.
Para criar uma nova fixture reproduzível¶
Comprima tests/fixtures/smoke/ para distribuir como exemplo (sem
PII real — só dados sintéticos). Senha do vault: a passada via
--password, ou smoke-senha-mestra-teste por default.