# Plano de testes — `PP-1` Palpitar nos jogos com prazo aberto

**Story:** `docs/stories/PP-1-palpitar-jogos-prazo-aberto.md`

É a ação central do produto: se ela falha, nada mais importa. O risco não é o
caminho feliz — é o palpite que a pessoa **acha** que enviou, e a recusa que ela
não entende. Toda validação existe em dois lugares (app e servidor) e as duas
precisam concordar: divergência produz erro sem explicação.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| PP-1-01 | Jogos com prazo aberto trazem campo para cada time | caminho feliz | alta |
| PP-1-02 | Palpite salvo continua lá ao reabrir | caminho feliz | alta |
| PP-1-03 | Rodada inteira em uma requisição | caminho feliz | alta |
| PP-1-04 | Placar inválido é recusado pelo servidor | validação | alta |
| PP-1-05 | O app não deixa digitar valor inválido | validação | alta |
| PP-1-06 | Prazo fechado é recusado com o motivo | regra de negócio | alta |
| PP-1-07 | Um jogo fechado não derruba o resto do lote | borda | alta |
| PP-1-08 | Jogo de outro bolão é recusado | autorização | alta |
| PP-1-09 | Quem não participa não palpita nem lê | autorização | alta |
| PP-1-10 | Sem autenticação, não palpita | autorização | alta |
| PP-1-11 | Confirmação visível de que salvou | UI | alta |
| PP-1-12 | Rodada sem jogo tem estado próprio | UI | média |
| PP-1-13 | Falha de carga mostra motivo e retry | UI | alta |

---

### PP-1-01 — Jogos com prazo aberto trazem campo para cada time
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** dois campos por jogo, teclado numérico, com o nome dos
times legível.

### PP-1-02 — Palpite salvo continua lá ao reabrir
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** a leitura da rodada devolve o que foi enviado. É a única
forma de o participante confiar que o palpite existe.

### PP-1-03 — Rodada inteira em uma requisição
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** 10 jogos num envio. Um request por jogo, em rede ruim,
significa metade da rodada salva.

### PP-1-04 — Placar inválido é recusado pelo servidor
**Tipo:** validação · **Prioridade:** alta
**Passos:** negativo, não inteiro, acima do teto.
**Resultado esperado:** 400. Nunca confiar no cliente: o app é só a primeira
barreira.

### PP-1-05 — O app não deixa digitar valor inválido
**Tipo:** validação · **Prioridade:** alta
**Resultado esperado:** só dígitos, no máximo 2, e o mesmo teto do servidor.
Divergir dos limites do servidor produz recusa sem explicação — o pior tipo.

### PP-1-06 — Prazo fechado é recusado com o motivo
**Tipo:** regra de negócio · **Prioridade:** alta
**Resultado esperado:** recusa citando o prazo, decidida pelo **relógio do
servidor**, e a tela explica. Erro genérico aqui vira acusação de trapaça.

### PP-1-07 — Um jogo fechado não derruba o resto do lote
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** os jogos abertos são salvos e o fechado é reportado. É o
caso real de quem palpita a rodada faltando dez minutos para o primeiro jogo.

### PP-1-08 — Jogo de outro bolão é recusado
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** recusado. Aceitar criaria palpite fantasma, num jogo que
o bolão não tem.

### PP-1-09 — Quem não participa não palpita nem lê
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** 403 nas duas ações.

### PP-1-10 — Sem autenticação, não palpita
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** 401.

### PP-1-11 — Confirmação visível de que salvou
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** confirmação explícita depois do envio. Sem ela o casual
reenvia por insegurança — e é o que motivou a fila offline de `PP-4`.

### PP-1-12 — Rodada sem jogo tem estado próprio
**Tipo:** UI · **Prioridade:** média
**Resultado esperado:** "nenhum jogo nesta rodada" com o que fazer, em vez de
tela vazia que parece falha.

### PP-1-13 — Falha de carga mostra motivo e retry
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** motivo + "tentar de novo". Lista vazia por erro de rede
seria lida como "o bolão não tem jogos".
