Ir para o conteúdo

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

# Direto da pasta do projeto, com .venv ativado:
python scripts/smoke-e2e.py

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.
# Preservar vault para investigar:
python scripts/smoke-e2e.py --vault-dir /tmp/anotae-debug --keep

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:

  1. VaultManager.create_vault — Argon2id + ChaCha20-Poly1305 round-trip
  2. ProfessionalRepository.create — cifra de PII + UNIQUE em CNS
  3. PatientRepository.create — cifra de campos PII (nome, DN, mãe…)
  4. EncounterRepository.create x3 — FKs para patient/professional
  5. EncounterRepository.list_all — leitura paginada
  6. core.statistics.summary — agregações CIAP-2/CID-10
  7. persistence.backup.create_backup — snapshot cifrado + hash
  8. verify_backup — recálculo do SHA-256
  9. list_backups — descoberta de snapshots
  10. Round-trip de senha: fecha vault, reabre com mesma senha, confirma que encounters persistiram
  11. core.encounter_export.render_markdown(level="weak") — anonimização LGPD Art. 12 (sanity: nenhum dado em claro de paciente; presença de ANON-…)

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:

  1. 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.

  2. Job smoke-cross-platform (Ubuntu + macOS + Windows, Python 3.12) — fail-fast: false para 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

python scripts/smoke-e2e.py --vault-dir tests/fixtures/smoke --keep

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.