# Plano de testes — `CV-1` Encerrar o bolão com campeão e ranking final

**Story:** `docs/stories/CV-1-encerrar-bolao.md`

Por que esta story concentra risco: é o momento do título. E a decisão de 03/08
diz que **nada é congelado** — o campeão é calculado na leitura, e correção
posterior pode trocá-lo.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| CV-1-01 | Encerrar com todos os jogos apurados | caminho feliz | alta |
| CV-1-02 | Jogo pendente bloqueia o encerramento | caminho feliz | alta |
| CV-1-03 | Jogo adiado para depois da última rodada | borda | alta |
| CV-1-04 | Encerrar duas vezes é idempotente | borda | alta |
| CV-1-05 | Bolão encerrado recusa palpite | borda | alta |
| CV-1-06 | Bolão encerrado recusa convite e entrada | borda | alta |
| CV-1-07 | Campeão não é congelado | borda | alta |
| CV-1-08 | Classificação final acompanha o campeão | caminho feliz | média |
| CV-1-09 | Ninguém pontuou | borda | média |
| CV-1-10 | Estado de encerrado nas telas | caminho feliz | média |

---

### CV-1-01 — Encerrar com todos os jogos apurados
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** todos os jogos do bolão `FINISHED` e apurados.
**Passos:**
1. `POST /pools/:id/close` como admin.
**Resultado esperado:** HTTP 200 (ou 201) com `closedAt`, `closedEarly: false`,
`champions` e `finalRanking`.

### CV-1-02 — Jogo pendente bloqueia o encerramento
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** um jogo do bolão sem resultado.
**Resultado esperado:** 409 informando que ainda há jogo sem resultado. É essa
informação que faz o admin escolher entre esperar e encerrar antecipadamente.

### CV-1-03 — Jogo adiado para depois da última rodada
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** jogo remarcado para data posterior ao fim do bolão.
**Resultado esperado:** encerramento normal recusado; o caminho é o antecipado
(`CV-3`), que fica marcado como tal. O bolão não pode ficar preso para sempre
esperando um jogo que a CBF remarcou.

### CV-1-04 — Encerrar duas vezes é idempotente
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Encerrar.
2. Encerrar de novo.
**Resultado esperado:** o segundo devolve o **mesmo** resultado, sem alterar
`closedAt` e sem erro. Dois toques no botão não podem produzir dois
encerramentos.

### CV-1-05 — Bolão encerrado recusa palpite
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Enviar palpite pela API para jogo do bolão encerrado.
**Resultado esperado:** recusado. Se um jogo do bolão foi adiado para depois do
encerramento, ninguém palpita nele.

### CV-1-06 — Bolão encerrado recusa convite e entrada
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** gerar convite → 410; entrar com convite antigo → 410. No
app, a ação de convite **desaparece** no bolão encerrado.

### CV-1-07 — Campeão não é congelado
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Encerrar com Ana campeã por 2 pontos.
2. Corrigir um placar que dá 10 pontos a Bruno.
3. Reler o encerramento.
**Resultado esperado:** Bruno passa a ser o campeão. Nada de `champions`
persistido — é calculado na leitura, por decisão de 03/08.

### CV-1-08 — Classificação final acompanha o campeão
**Tipo:** caminho feliz · **Prioridade:** média
**Resultado esperado:** a tela de encerramento mostra campeão **e** a
classificação completa, rolável. Quem ficou em 2º também quer ver onde parou.

### CV-1-09 — Ninguém pontuou
**Tipo:** borda · **Prioridade:** média
**Pré-condições:** bolão em que nenhum participante acertou nada.
**Resultado esperado:** `champions` vazio e a tela diz "Nenhum campeão: ninguém
pontuou" — não um campeão arbitrário nem tela vazia.

### CV-1-10 — Estado de encerrado nas telas
**Tipo:** caminho feliz · **Prioridade:** média
**Resultado esperado:** na home, o bolão aparece marcado como encerrado e
continua acessível; na tela de palpite, faixa explicando, etiquetas "bolão
encerrado" por jogo e **sem** ação de enviar.
