# Plano de testes — `PR-10` Correção manual de placar pelo admin

**Story:** `docs/stories/PR-10-correcao-manual-de-placar.md`

Por que esta story concentra risco: é o **maior poder** que o admin tem — mexer
na pontuação de todos. A mitigação prevista é uma só: rastro visível a todos. Se
o rastro falhar, correção manual e fraude ficam indistinguíveis.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| PR-10-01 | Admin corrige e a pontuação é recalculada | caminho feliz | alta |
| PR-10-02 | Participante comum é recusado | autorização | alta |
| PR-10-03 | Jogo que ainda não começou é recusado | borda | alta |
| PR-10-03b | Jogo começado sem placar final é corrigível | borda | alta |
| PR-10-04 | Correção sem mudança não avisa ninguém | borda | alta |
| PR-10-05 | Origem MANUAL fica registrada com o nome | segurança | alta |
| PR-10-06 | Histórico é visível a qualquer participante | caminho feliz | alta |
| PR-10-07 | Histórico exige participar do bolão | autorização | alta |
| PR-10-08 | Fonte oficial prevalece depois | borda | alta |
| PR-10-09 | Correção em bolão encerrado troca o campeão | borda | alta |
| PR-10-10 | Placar fora do limite é recusado | negativo | média |
| PR-10-11 | Ação não aparece para quem não pode usá-la | caminho feliz | média |

---

### PR-10-01 — Admin corrige e a pontuação é recalculada
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** jogo `FINISHED 2x0` apurado; Ana com palpite `2x1` (3 pts).
**Dados de teste:** novo placar `2x1`.
**Passos:**
1. `PATCH /pools/:id/matches/:matchId/score` como admin.
**Resultado esperado:** HTTP 200 com `{afetados: 1, avisos: 1}`; o palpite de
Ana passa a `PLACAR_EXATO` / 10 pontos; o total dela no ranking sobe 7.

### PR-10-02 — Participante comum é recusado
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** 403 com "apenas o administrador do bolão pode fazer
isso". Nada alterado no jogo nem nos palpites.

### PR-10-03 — Jogo que ainda não começou é recusado
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** jogo com kickoff no futuro.
**Resultado esperado:** recusa com motivo próprio. Corrigir antes do apito seria
o admin **definindo** o resultado, não corrigindo — e com o palpite de todos
ainda em aberto.

### PR-10-03b — Jogo começado sem placar final é corrigível
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** jogo com kickoff no passado e `status` diferente de
`FINISHED` (a fonte não fechou, ou houve W.O.).
**Resultado esperado:** correção **aceita**, e o jogo passa a `FINISHED`.

_Correção de rumo do plano (06/08): a primeira versão deste caso dizia "jogo não
terminado é recusado", copiando a intuição de que só jogo encerrado é corrigível.
A regra real do código é outra e é a certa: exigir `FINISHED` deixaria o bolão
preso para sempre num W.O., que nunca é reagendado nem recebe placar da fonte. O
que barra o abuso é o **apito**, não o encerramento._

### PR-10-04 — Correção sem mudança não avisa ninguém
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** jogo `2x1`; admin envia `2x1`.
**Resultado esperado:** `{afetados: 0, avisos: 0}`, nenhuma linha em
`score_corrections`, nenhuma notificação. Avisar "sua pontuação mudou" quando
nada mudou treina o participante a ignorar aviso.

### PR-10-05 — Origem MANUAL fica registrada com o nome
**Tipo:** segurança · **Prioridade:** alta
**Passos:**
1. Corrigir como admin.
2. Ler o histórico do jogo.
**Resultado esperado:** registro com `source: MANUAL`, `correctedBy.displayName`
do admin, placar anterior e novo, e data. O aviso aos afetados diz "corrigido
pelo administrador"; o extrato marca "alterado pelo administrador".

### PR-10-06 — Histórico é visível a qualquer participante
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** participante comum lê o histórico completo. É a **única**
mitigação prevista para o poder de correção — esconder do participante comum
anularia a story.

### PR-10-07 — Histórico exige participar do bolão
**Tipo:** autorização · **Prioridade:** alta
**Pré-condições:** conta autenticada de fora do bolão.
**Resultado esperado:** 403. E `matchId` de jogo fora do bolão da rota → 404.
_A rota é escopada em `:poolId` e não checava nada (06/08): qualquer conta lia o
histórico de qualquer jogo, com o nome do admin de bolão alheio._

### PR-10-08 — Fonte oficial prevalece depois
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** admin corrigiu para `3x0`; a fonte passa a informar `2x0`.
**Passos:**
1. Rodar a sincronização.
**Resultado esperado:** placar volta a `2x0`, nova linha no histórico com
`source: OFFICIAL`, e as **duas** alterações ficam registradas. Decisão da story
(`BE-4`): a fonte oficial vence.

### PR-10-09 — Correção em bolão encerrado troca o campeão
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** bolão encerrado, campeão definido por 2 pontos de vantagem.
**Passos:**
1. Corrigir um jogo em que só o 2º colocado tinha palpite certo.
**Resultado esperado:** o campeão muda, o histórico registra, e os afetados são
avisados. Encerramento **não** congela nada — é decisão de 03/08.

### PR-10-10 — Placar fora do limite é recusado
**Tipo:** negativo · **Prioridade:** média
**Dados de teste:** `-1`, `21`, texto, campo ausente.
**Resultado esperado:** 400 do servidor; no app, mensagem antes de chamar o
servidor ("placar máximo é 20").

### PR-10-11 — Ação não aparece para quem não pode usá-la
**Tipo:** caminho feliz · **Prioridade:** média
**Resultado esperado:** o ícone de corrigir aparece **só** para admin e **só**
em jogo já iniciado. Botão que sempre falha é pior que ausência de botão.
