# Plano de testes — `PP-7` Sigilo do palpite até o jogo terminar

**Story:** `docs/stories/PP-7-sigilo-do-palpite.md`

Por que esta story concentra risco: é o que torna justa a participação de quem
organiza. O sigilo vale até o jogo **terminar** (não até o apito) e vale para
**todo papel**, admin incluído. Qualquer vazamento aqui não gera erro — gera
vantagem silenciosa.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| PP-7-01 | Jogo não iniciado esconde palpite alheio | caminho feliz | alta |
| PP-7-02 | Jogo em andamento continua escondendo | borda | alta |
| PP-7-03 | Jogo terminado revela todos | caminho feliz | alta |
| PP-7-04 | Admin não vê antes | autorização | alta |
| PP-7-05 | Bypass pela API antes do fim | segurança | alta |
| PP-7-06 | Não participante é recusado | autorização | alta |
| PP-7-07 | O próprio palpite é sempre visível ao dono | caminho feliz | alta |
| PP-7-08 | Revelado e vazio ≠ em segredo | borda | média |
| PP-7-09 | Sem cache local de palpite alheio | segurança | alta |
| PP-7-10 | Status de palpite do admin não vaza placar | segurança | alta |

---

### PP-7-01 — Jogo não iniciado esconde palpite alheio
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** jogo com kickoff no futuro; dois participantes com palpite.
**Passos:**
1. `GET /pools/:id/matches/:matchId/predictions` como participante comum.
**Resultado esperado:** `{ revealed: false, predictions: [] }` — lista vazia
**na origem**, não filtrada na tela.

### PP-7-02 — Jogo em andamento continua escondendo
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** `status = IN_PLAY` (bola rolando, sem placar final).
**Resultado esperado:** ainda `revealed: false`. A decisão de 03/08 é liberar no
**fim**, não no apito: durante a partida o palpite alheio ainda vale informação
(para aposta paralela, para provocação, para ajustar o próprio comportamento).

### PP-7-03 — Jogo terminado revela todos
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** `status = FINISHED` com placar; 2 participantes com palpite.
**Resultado esperado:** `revealed: true` com os dois palpites, cada um com
`displayName`, placar e `points`.

### PP-7-04 — Admin não vê antes
**Tipo:** autorização · **Prioridade:** alta
**Pré-condições:** criador do bolão (admin permanente); jogo não terminado.
**Resultado esperado:** `revealed: false`, igual ao participante comum. Se este
caso falhar, o admin joga com informação privilegiada e o bolão perde sentido.

### PP-7-05 — Bypass pela API antes do fim
**Tipo:** segurança · **Prioridade:** alta
**Passos:**
1. Chamar o endpoint direto (sem app), com token válido, em jogo não terminado.
2. Inspecionar o corpo da resposta byte a byte.
**Resultado esperado:** nenhum placar de terceiro no payload. Se o servidor
mandasse e a tela escondesse, o critério não estaria cumprido — qualquer um lê
a API.

### PP-7-06 — Não participante é recusado
**Tipo:** autorização · **Prioridade:** alta
**Pré-condições:** conta autenticada que **não** participa do bolão.
**Resultado esperado:** 403. Nem sigilo nem revelação: quem não está no bolão
não tem o que ver.

### PP-7-07 — O próprio palpite é sempre visível ao dono
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** jogo não terminado, participante com palpite salvo.
**Passos:**
1. Abrir a rodada.
**Resultado esperado:** o próprio placar aparece preenchido no campo. O sigilo é
sobre palpite **alheio** — esconder o próprio faria o participante repalpitar
por insegurança.

### PP-7-08 — Revelado e vazio ≠ em segredo
**Tipo:** borda · **Prioridade:** média
**Pré-condições:** jogo terminado em que **ninguém** palpitou.
**Resultado esperado:** tela mostra "Ninguém palpitou neste jogo", **não**
"Ainda em segredo". Confundir os dois faz o app parecer que esconde algo.

### PP-7-09 — Sem cache local de palpite alheio
**Tipo:** segurança · **Prioridade:** alta
**Passos:**
1. Abrir a tela de palpites de um jogo terminado (revelado).
2. Sair da tela; colocar o aparelho em modo avião.
3. Reabrir a mesma tela.
**Resultado esperado:** estado de erro de rede — **não** a lista servida de
cache. Cache de palpite de terceiro é o mesmo vazamento por outro caminho: o
jogo pode voltar a "não terminado" por correção da fonte.

### PP-7-10 — Status de palpite do admin não vaza placar
**Tipo:** segurança · **Prioridade:** alta
**Pré-condições:** admin; rodada com palpites de todos.
**Passos:**
1. `GET /pools/:id/members/prediction-status/:matchday`.
**Resultado esperado:** só `estado` (`NENHUM`/`PARCIAL`/`COMPLETO`) e a
contagem. **Nenhum** `homeScore`/`awayScore` no payload. É a única visão em que
o admin recebe dado agregado sobre palpite alheio, e por isso a mais fácil de
vazar por engano ao "melhorar" a tela.
