# Testes — Dashboard Logístico (Auto-setup Expedicao)

## Cobertura

| Componente | Tipo | Path | Status |
|---|---|---|---|
| `AutoSetupExpedicaoLaboratorio::verificar` — sem linha → aguardando | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T1) | pass |
| `AutoSetupExpedicaoLaboratorio::verificar` — watchdog 11min → falhou | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T2) | pass |
| `AutoSetupExpedicaoLaboratorio::verificar` — watchdog NÃO dispara com 5min | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T3) | pass |
| `AutoSetupExpedicaoLaboratorio::iniciar` — idempotência 2 chamadas, 1 linha | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T4) | pass |
| `AutoSetupExpedicaoLaboratorio::iniciar` — no-op se já em_progresso válido | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T5) | pass |
| `AutoSetupExpedicaoLaboratorio::iniciar` — no-op se já pronto | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T6) | pass |
| `AutoSetupExpedicaoLaboratorio::garantirGrupoPadrao` — cria 1 grupo Padrão | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T7) | pass |
| `AutoSetupExpedicaoLaboratorio::garantirGrupoPadrao` — no-op na segunda call | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T8) | pass |
| `AutoSetupExpedicaoLaboratorio::garantirGrupoPadrao` — sem regioes → regioes_ids=[] | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T9) | pass |
| `AutoSetupExpedicaoLaboratorio::marcarPronto` — persiste status + finalizado_em | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T10) | pass |
| `AutoSetupExpedicaoLaboratorio::marcarFalhou` — persiste status + erro_mensagem | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T11) | pass |
| `AutoSetupExpedicaoLaboratorio::executarSync` — registra pid + iniciado_em | TDD/integration | `Testes/Laboratorios/AutoSetupExpedicaoTddTest.php` (T12) | pass |
| Cron `--modo-setup --block=N` 3x: 1 grupo único, status=pronto | Integration | `Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php` (I1) | pass |
| Cron legado (sem flags): exit=0, sem EXCEPTION, erros=0 | Integration | `Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php` (I2) | pass |
| Multi-tenant: setup BLOCK_A não afeta BLOCK_B | Integration | `Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php` (I3) | pass |
| Tenant isolation: `verificar` por block, block fictício não cria linha | Integration | `Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php` (I4) | pass |
| `StatusSetupSatelite::verificar` — lê block da sessão e ignora payload | SKIP | `Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php` (I4) | BUG (ver abaixo) |

**Paths absolutos dos arquivos de teste:**
- `/home/goldie/www/genesis/componentes/Missoes/Dashboards/sinais/Expedicao/Testes/Laboratorios/AutoSetupExpedicaoTddTest.php`
- `/home/goldie/www/genesis/componentes/Missoes/Dashboards/sinais/Expedicao/Testes/Laboratorios/AutoSetupExpedicaoIntegrationTest.php`

## Gaps de cobertura (e justificativa)

- **`StatusSetupSatelite` instanciado diretamente em testes** — não coberto porque há um bug de produção (`SessionGalaxia::get()` estático não existe). Tenant isolation do satélite foi coberta via `AutoSetupExpedicaoLaboratorio::verificar` diretamente, que é o que o satélite delega.
- **Crash `kill -9` mid-flight do cron** — não automatizado porque requer fork real do processo e sincronização de timing; cobertura manual suficiente conforme o techplan indica como teste manual.
- **`garantirGrupoPadrao` com regioes_administrativas reais populadas** — a tabela `regioes_administrativas` tem colunas obrigatórias não documentadas (`nomeregiao`, sem `nome`) que impediriam inserção de dados de teste sem conhecer schema completo. Coberto indiretamente pela suite de integração I1 (cron --modo-setup), que chama `garantirGrupoPadrao` com block fictício 99994 (sem regioes_adm, cria grupo com `[]`).
- **`Expedicao::start` branch de setup** — fora de escopo de teste automatizado CLI (requer GalaxiaRoute + visual rendering). Smoke test manual documentado no `04-frontend.md`.
- **View `html/configurando.php` + JS** — fora de escopo (sem teste de UI/CSS conforme antipadrões definidos).

## Output da execução

```
=== AutoSetupExpedicaoTddTest.php ===

PHP Warning: Constant SYSTEM_URL_PATH already defined (ignorável — padrão do bootstrap)
====================================================
TDD — AutoSetupExpedicaoLaboratorio (dev_gx_goldie)
====================================================

[PASS] T1 verificar sem linha → aguardando
[PASS] T1 iniciado_em null
[PASS] T1 finalizado_em null
[PASS] T1 erro null
[PASS] T1 mensagem preenchida
[PASS] T1 verificar nao insere linha
[PASS] T2 watchdog 11min → falhou
[PASS] T2 erro = Timeout de execução
[PASS] T2 status persistido no banco = falhou
[PASS] T2 erro_mensagem persistido no banco
[PASS] T3 em_progresso com 5min nao dispara watchdog
sh: 1: cannot create /var/log/dashboard_expedicao_setup_99991.log: Permission denied
[PASS] T4 primeiro iniciar → em_progresso
[PASS] T4 exatamente 1 linha apos primeiro iniciar
[PASS] T4 segundo iniciar → continua em_progresso
[PASS] T4 ainda exatamente 1 linha apos segundo iniciar (no-op)
[PASS] T5 banco permanece em_progresso apos 2 chamadas
[PASS] T6 iniciar quando pronto retorna pronto sem re-disparar
[PASS] T6 status continua pronto no banco
[PASS] T7 pre-cond: BLOCK_A sem regioes_administrativas
[PASS] T7 grupo Padrao criado
[PASS] T7 nome = Padrao
[PASS] T7 regioes_ids é array JSON
[PASS] T7 regioes_ids = [] para block sem regioes
[PASS] T7 exatamente 1 grupo criado
[PASS] T8 segunda call nao cria grupo duplicado
[PASS] T9 pre-cond: BLOCK_B sem regioes_administrativas
[PASS] T9 grupo criado mesmo sem regioes_administrativas
[PASS] T9 nome = Padrao
[PASS] T9 regioes_ids = [] (array vazio)
[PASS] T10 marcarPronto persiste status=pronto
[PASS] T10 finalizado_em preenchido
[PASS] T11 marcarFalhou persiste status=falhou
[PASS] T11 erro_mensagem correto
[PASS] T12 executarSync retorna em_progresso
[PASS] T12 status persistido = em_progresso
[PASS] T12 pid persistido (pid=1424122)
[PASS] T12 iniciado_em preenchido

====================================================
RESULTADO: PASS=37  FAIL=0
TODOS OS TESTES PASSARAM


=== AutoSetupExpedicaoIntegrationTest.php ===

PHP Warning: Constant SYSTEM_URL_PATH already defined (ignorável — padrão do bootstrap)
====================================================
INTEGRATION — AutoSetupExpedicaoLaboratorio (cron + satelite)
====================================================

── I1: cron --modo-setup rodado 3x (block=99994) ──
  [rodada 1] exit=0
  [rodada 2] exit=0
  [rodada 3] exit=0
[PASS] I1 status final = pronto apos 3 rodadas
[PASS] I1 exatamente 1 grupo Padrao (sem duplicata apos 3 rodadas)
[PASS] I1 linha de setup marcada pronto
[PASS] I1 finalizado_em preenchido
[PASS] I1 sem erro_mensagem
[PASS] I1 grupos_regioes continua com 1 linha apos 3 rodadas

── I2: cron legado (sem --modo-setup) ──
  exit_code=0
[PASS] I2 cron legado sai com exit=0 (erros=0)
[PASS] I2 sem EXCEPTION no output
[PASS] I2 cron finalizou mensagem presente
[PASS] I2 erros=0 no output
[PASS] I2 output nao menciona modo-setup

── I3: multi-tenant (BLOCK_A=99994, BLOCK_B=99995) ──
[PASS] I3 BLOCK_B sem linha em dashboard_expedicao_setup
[PASS] I3 BLOCK_B sem grupos_regioes criados por setup de BLOCK_A
[PASS] I3 BLOCK_B sem cache criado por setup de BLOCK_A
[PASS] I3 status de BLOCK_A permanece pronto apos setup de BLOCK_B
[PASS] I3 BLOCK_A continua com 1 grupo (nao afetado por setup de BLOCK_B)

── I4: tenant isolation (verificar por block) — Satelite SKIP (bug reportado) ──
  [BUG] StatusSetupSatelite::__construct usa SessionGalaxia::get() estatico
         que nao existe. Fatal Error em producao.

[PASS] I4 BLOCK_A verificar = pronto
[PASS] I4 BLOCK_B verificar retorna estado próprio (não contamina BLOCK_A)
[PASS] I4 BLOCK_A permanece pronto após leitura de BLOCK_B
[PASS] I4 block ficticio retorna aguardando
[PASS] I4 verificar nao cria linha para block ficticio

====================================================
RESULTADO: PASS=21  FAIL=0
TODOS OS TESTES PASSARAM
```

## Bugs encontrados

### BUG-1 — `StatusSetupSatelite` usa `SessionGalaxia::get()` estático inexistente

**Arquivo:** `componentes/Missoes/Dashboards/sinais/Expedicao/Satelites/StatusSetupSatelite.php:28`

**Descrição:** O Satélite chama `SessionGalaxia::get('galaxiaUserInfo')` como método estático. A classe `SessionGalaxia` não possui método `get()` estático — apenas o magic method `__get()` de instância. Em qualquer requisição real (web ou CLI), isso resulta em `Fatal error: Uncaught Error: Call to undefined method`.

**Reprodução:**
```php
// Em qualquer contexto que instancie o Satélite:
$s = new StatusSetupSatelite((object)['routeId'=>'x'], 'verificar', []);
// Fatal error: Call to undefined method Base_config\Core\SessionGalaxia::get()
```

**Mesmo padrão errado em** `Expedicao.php:75` — `\Base_config\Core\SessionGalaxia::get('galaxiaUserInfo')`.

**Correção esperada (para o dev backend):** Substituir `SessionGalaxia::get('galaxiaUserInfo')` por `(new SessionGalaxia())->galaxiaUserInfo` ou pelo equivalente usado no cron (`$_SESSION['dashboard']['galaxiaUserInfo']`). Verificar se o padrão correto no projeto é instanciar a classe ou acessar `$_SESSION` diretamente (como o cron faz em `AtualizarCacheExpedicaoLaboratorio`).

**Status:** Reportado ao dev backend. Não corrigido neste PR. Testes do Satélite marcados como SKIP até correção.

**Nota sobre `sh: cannot create /var/log/...`:** O `exec()` no T4 tenta criar o log em `/var/log/`, que não tem permissão no ambiente de dev. Não é um bug — é restrição de filesystem do ambiente. O comportamento do `iniciar` (idempotência de linha no banco) foi validado corretamente apesar do aviso.
