# Plano de testes — `MG-3` Sigilo do palpite e prazo nas rules

**Story:** `docs/stories/MG-3-sigilo-e-prazo-nas-rules.md`

São as duas regras que, quebradas, **corrompem o bolão**: palpite alheio visível
antes do fim do jogo, e palpite aceito depois do apito. No NestJS eram um filtro e
uma comparação dentro de um service, cobertas por e2e. Aqui viram cláusula de rule
e um campo desnormalizado — e o risco muda de natureza: cláusula ausente não
aparece lendo o arquivo, e campo desnormalizado depende de **alguém virar**.

Por isso o plano tem três frentes, e a terceira é a que não existia antes:

1. **Rules** — o que o banco aceita e recusa (casos 01 a 26).
2. **Function** — a transição que libera o sigilo (27 a 30).
3. **Revisão** — a auditoria de disputa, e quando ela **não** deve registrar
   (31 a 34).

| ID | Título | Tipo | Origem |
| -- | ------ | ---- | ------ |
| MG-3-01 | Leio o meu palpite antes do jogo | caminho feliz | `PP-1-02` |
| MG-3-02 | Não leio palpite de outro em jogo não terminado | segurança | `PP-7-01` |
| MG-3-03 | Nem o admin — sigilo não tem exceção de papel | segurança | `PP-7-02` |
| MG-3-04 | Jogo em andamento continua secreto | segurança | `PP-7-03` |
| MG-3-05 | Jogo terminado libera para todos | caminho feliz | `PP-7-04` |
| MG-3-06 | Quem não participa não lê palpite | autorização | `PP-7-06` |
| MG-3-07 | Consulta exige o filtro que prova o acesso | segurança | novo |
| MG-3-08 | Consulta de jogo não terminado falha inteira | segurança | novo |
| MG-3-09 | Os meus palpites da rodada eu listo | caminho feliz | `PP-1-02` |
| MG-3-10 | Palpito com prazo aberto | caminho feliz | `PP-1-01` |
| MG-3-11 | Não palpito depois do apito | regra de negócio | `PP-5-02` |
| MG-3-12 | Altero enquanto o prazo está aberto | caminho feliz | `PP-2-01` |
| MG-3-13 | Não altero depois do apito | regra de negócio | `PP-2-06` |
| MG-3-14 | Bolão encerrado não aceita palpite | regra de negócio | `CV-1` |
| MG-3-15 | Bolão arquivado é somente leitura | regra de negócio | `CV-6-06` |
| MG-3-16 | Não palpito no nome de outro | segurança | `PP-2-08` |
| MG-3-17 | Id fora do padrão é recusado | segurança | novo |
| MG-3-18 | Placar inválido é recusado | validação | `PP-1-04` |
| MG-3-19 | Não escrevo a minha própria pontuação | segurança | `PR-1` |
| MG-3-20 | Não libero o sigilo do meu palpite | segurança | novo |
| MG-3-21 | Não transfiro palpite de dono | segurança | `PP-2-08` |
| MG-3-22 | Palpite não se apaga | regra de negócio | `PP-2-03` |
| MG-3-23 | Quem não participa não palpita | autorização | `PP-1-09` |
| MG-3-24 | Leio o histórico do meu palpite | caminho feliz | `PP-2-03` |
| MG-3-25 | Não leio o histórico de outro | segurança | `PP-7` |
| MG-3-26 | Ninguém escreve revisão pelo cliente | segurança | novo |
| MG-3-27 | O apito não libera nada | regra de negócio | `PP-7-03` |
| MG-3-28 | Terminar sem placar não libera | borda | `PR-1-12` |
| MG-3-29 | Terminar com placar libera o jogo todo | caminho feliz | `PP-7-04` |
| MG-3-30 | Sem a Function, secreto a mais — nunca exposto antes | segurança | novo |
| MG-3-31 | Mudar o valor guarda a versão anterior | regra de negócio | `PP-2-03` |
| MG-3-32 | Reenviar o mesmo valor não cria revisão | borda | `PP-2-04` |
| MG-3-33 | Apuração escrevendo pontos não cria revisão | borda | novo |
| MG-3-34 | Duas mudanças, duas revisões | regra de negócio | `PP-2-03` |

---

## Os casos que não existiam no backend antigo

**`MG-3-07` e `MG-3-08` — consulta que prova o próprio acesso.** No NestJS o
service filtrava; aqui, *rules não são filtros*. Uma consulta que não constranja os
campos que a rule usa é recusada, mesmo que todos os documentos fossem legíveis.
Isso muda o que o **app** precisa pedir, e sem esse par de casos a descoberta cairia
em `MG-7` como "o Firestore não deixa".

**`MG-3-20` — não libero o meu próprio sigilo.** Só existe porque o sigilo agora é
um campo dentro do palpite. Se o cliente pudesse escrever `matchFinished: true`,
revelaria o próprio palpite quando quisesse — e, pior, num jogo em andamento isso
tem valor competitivo.

**`MG-3-30` — a Function não rodando.** É o caso que justifica o desenho inteiro.
Verifica que a falha é **segura**: palpite secreto além do necessário, nunca exposto
antes. O inverso seria grave, e o teste mostra por que não pode acontecer — só a
Function escreve o campo, e só no fim com placar.

**`MG-3-33` — apuração não gera revisão.** A apuração escreve no mesmo documento do
palpite (`points`, `band`). Se isso registrasse revisão, todo jogo apurado poluiria
o histórico de disputa. É a mesma família do defeito real de `PP-2-04`, por outro
caminho.
