# Plano de testes — `PP-10` Job de sincronização com a fonte de dados

**Story:** `docs/stories/PP-10-sincronizacao-com-a-fonte.md`

Por que esta story concentra risco: é o **único ponto de entrada de dado
externo** do sistema, e `PP-6`, `PR-1` e `PR-6` só funcionam se ela estiver
rodando. É infraestrutura, mas o produto para sem ela.

Dois casos (`PP-10-06` e `PP-10-07`) dependem do cliente real e do token, que não
existem — ficam registrados como **bloqueados**, não como aprovados.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| PP-10-01 | Job atualiza horário e placar do que mudou | caminho feliz | alta |
| PP-10-02 | Mudança de horário dispara o gatilho de `PP-6` | caminho feliz | alta |
| PP-10-03 | Placar novo em jogo apurado dispara `PR-6` | caminho feliz | alta |
| PP-10-04 | Fonte indisponível não corrompe o armazenado | borda | alta |
| PP-10-05 | Job parado recupera o atraso sem perder mudanças | borda | alta |
| PP-10-06 | Respeitar o rate limit de 10 req/min | borda | alta |
| PP-10-07 | Resposta malformada da fonte | negativo | alta |
| PP-10-08 | Jogo que a fonte não conhece mais | borda | média |
| PP-10-09 | Jogo novo na fonte que o bolão não tem | borda | média |
| PP-10-10 | Job desabilitado não roda | borda | média |
| PP-10-11 | Duas execuções concorrentes | concorrência | média |

---

### PP-10-01 — Job atualiza horário e placar do que mudou
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** os jogos alterados na fonte são atualizados; o resultado
do job traz `jogosVerificados` > 0 e os contadores do que mudou.

### PP-10-02 — Mudança de horário dispara o gatilho de `PP-6`
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** `horariosAlterados` e, quando o novo horário está no
futuro, `palpitesReabertos` > 0. Coberto em detalhe pelo plano `PP-6`.

### PP-10-03 — Placar novo em jogo apurado dispara `PR-6`
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** o caminho de correção é usado (`correcoesAplicadas` > 0),
com trilha de auditoria e aviso — não uma sobrescrita silenciosa.

### PP-10-04 — Fonte indisponível não corrompe o armazenado
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** fonte configurada para falhar.
**Resultado esperado:** o job registra a falha e **nada** é alterado: contagem de
jogos, horários e placares idênticos antes e depois. Uma fonte fora do ar não
pode apagar o calendário do bolão.

### PP-10-05 — Job parado recupera o atraso sem perder mudanças
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** simular um período sem execução, com **duas** mudanças
acumuladas na fonte (horário de um jogo e placar de outro).
**Resultado esperado:** a primeira execução após a volta aplica **as duas**. O job
não pode depender de ter visto o estado intermediário.

### PP-10-06 — Respeitar o rate limit de 10 req/min
**Tipo:** borda · **Prioridade:** alta
**Status: bloqueado** — depende de `BE-1`/`BE-6` (cliente real e token). O
adaptador falso não faz requisição, então não há limite a respeitar. Registrado
para não parecer coberto.

### PP-10-07 — Resposta malformada da fonte
**Tipo:** negativo · **Prioridade:** alta
**Status: parcialmente bloqueado** — o contrato da porta `FonteDeDados` é
tipado, então "malformado" só existe na fronteira HTTP, que é `BE-1`. O que **é**
testável hoje: a porta lançando erro inesperado (não `FonteIndisponivelError`)
não pode deixar dado pela metade.

### PP-10-08 — Jogo que a fonte não conhece mais
**Tipo:** borda · **Prioridade:** média
**Pré-condições:** um jogo existe no bolão e a fonte deixa de devolvê-lo.
**Resultado esperado:** o jogo **permanece** como está, sem ser apagado nem
zerado. Apagar levaria embora os palpites de todos por causa de uma falha da
fonte.

### PP-10-09 — Jogo novo na fonte que o bolão não tem
**Tipo:** borda · **Prioridade:** média
**Resultado esperado:** o job ignora. Os jogos do bolão são fixados na criação
(`CC-1`); acrescentar jogo depois mudaria a competição no meio.

### PP-10-10 — Job desabilitado não roda
**Tipo:** borda · **Prioridade:** média
**Pré-condições:** `JOBS_HABILITADOS` desligado.
**Resultado esperado:** o agendamento não dispara, e a sincronização manual
continua possível. É o que permite rodar testes e ambiente local sem tráfego para
a fonte.

### PP-10-11 — Duas execuções concorrentes
**Tipo:** concorrência · **Prioridade:** média
**Passos:**
1. Disparar duas sincronizações ao mesmo tempo.
**Resultado esperado:** nenhum erro e nenhum efeito duplicado — sem correção
registrada duas vezes nem aviso em dobro para o mesmo participante.
