# Plano de testes — `CC-1` Criar bolão com os jogos já carregados

**Story:** `docs/stories/CC-1-criar-bolao.md`

É a story que sustenta as outras: sem jogos carregados não há palpite, prazo nem
ranking. O pior estado possível não é o erro — é o **bolão criado pela metade**,
porque o admin acredita que deu certo. O segundo pior é o bolão criado inteiro
mas inútil (rodadas que já começaram).

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| CC-1-01 | Jogos das rodadas escolhidas já vêm no bolão | caminho feliz | alta |
| CC-1-02 | Quem cria é admin e participante | caminho feliz | alta |
| CC-1-03 | Fonte indisponível não cria bolão pela metade | borda | alta |
| CC-1-04 | Fonte indisponível na tela: motivo e retry | UI | alta |
| CC-1-05 | Recusa do servidor aparece com o motivo | UI | alta |
| CC-1-06 | Intervalo sugerido daqui até o fim | UI | média |
| CC-1-07 | Nome ausente e rodada fora de 1–38 | validação | alta |
| CC-1-08 | Rodadas já encerradas: aviso de que não há prazo aberto | borda | alta |
| CC-1-09 | Rodadas futuras: todos os jogos com prazo aberto | caminho feliz | alta |
| CC-1-10 | Intervalo que cruza hoje: prazo aberto parcial | borda | alta |
| CC-1-11 | Jogo já existente é reaproveitado, não duplicado | regra de negócio | alta |
| CC-1-12 | Horários distintos por jogo, não por rodada | regra de negócio | alta |
| CC-1-13 | Rodada final antes da inicial é recusada | validação | média |
| CC-1-14 | Integração com a fonte oficial | bloqueado | alta |

---

### CC-1-01 — Jogos das rodadas escolhidas já vêm no bolão
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** 3 rodadas → 30 jogos vinculados, com times e horário.
Cadastrar jogo a jogo é o que faz o admin voltar para a planilha.

### CC-1-02 — Quem cria é admin e participante
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** vínculo com papel `ADMIN`. Admin permanente (decisão de
03/08): não transfere nem perde a administração.

### CC-1-03 — Fonte indisponível não cria bolão pela metade
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** `FONTE_FAKE_INDISPONIVEL=true`.
**Resultado esperado:** 503 com texto acionável **e nenhum registro criado** —
nem bolão, nem participação, nem `Match`. Bolão sem jogo é o pior estado
possível: o admin acha que criou e não tem o que palpitar.

### CC-1-04 — Fonte indisponível na tela: motivo e retry
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** motivo + "tentar de novo", e **sem** formulário — campo
vazio sem explicação faz o admin achar que o app quebrou.

### CC-1-05 — Recusa do servidor aparece com o motivo
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** o texto do servidor na tela, não "erro ao criar".

### CC-1-06 — Intervalo sugerido daqui até o fim
**Tipo:** UI · **Prioridade:** média
**Resultado esperado:** rodada atual + 1 até 38 pré-preenchidas. É o que o admin
quer em quase todo caso.

### CC-1-07 — Nome ausente e rodada fora de 1–38
**Tipo:** validação · **Prioridade:** alta
**Resultado esperado:** erro **no campo**, sem chamar a API. Validar só no
servidor gastaria uma ida e voltaria com mensagem genérica.

### CC-1-08 — Rodadas já encerradas: aviso de que não há prazo aberto
**Tipo:** borda · **Prioridade:** alta
**Passos:** criar bolão nas rodadas 1–3 (passado no calendário).
**Resultado esperado:** o bolão **é criado** (o critério pede aviso, não recusa)
e a resposta diz que zero jogos têm prazo aberto; o app avisa antes de seguir.
**Por que importa:** esse bolão é inútil — ninguém palpita e o convite é recusado
porque a entrada fecha no primeiro jogo. Sem o aviso o admin descobre pelo grupo.

### CC-1-09 — Rodadas futuras: todos os jogos com prazo aberto
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** `openMatches == totalMatches`, e a tela diz quantos jogos
dão palpite. O contraste com CC-1-08 é o que dá sentido ao número.

### CC-1-10 — Intervalo que cruza hoje: prazo aberto parcial
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** `0 < openMatches < totalMatches`. É o caso real de quem
cria "do returno até o fim" com o returno já começado.

### CC-1-11 — Jogo já existente é reaproveitado, não duplicado
**Tipo:** regra de negócio · **Prioridade:** alta
**Resultado esperado:** dois bolões no mesmo campeonato compartilham o mesmo
`Match`. Duplicar faria a correção de placar valer em um bolão e não no outro.

### CC-1-12 — Horários distintos por jogo, não por rodada
**Tipo:** regra de negócio · **Prioridade:** alta
**Resultado esperado:** `kickoffAt` diferente entre jogos da mesma rodada. O
prazo fecha por jogo (PP-5); rodada com horário único apagaria a regra.

### CC-1-13 — Rodada final antes da inicial é recusada
**Tipo:** validação · **Prioridade:** média
**Resultado esperado:** 400 com motivo.

### CC-1-14 — Integração com a fonte oficial
**Tipo:** bloqueado · **Prioridade:** alta
**Resultado esperado:** **bloqueado** — `BE-1` depende do token da
`football-data.org`. Hoje roda no adaptador falso, na mesma porta; quando o token
existir, só entra `FonteFootballDataAdapter` e nenhum outro arquivo muda. O caso
não é executável e não pode ser marcado como passando.
