# Plano de testes — `MG-2` Modelo no Firestore e regras de participação

**Story:** `docs/stories/MG-2-modelo-firestore.md`

Aqui a autorização deixa de ser código de aplicação e passa a ser **regra do
banco**. O risco não é a rule recusar demais — isso aparece na hora. É a rule
permitir de menos em silêncio: um `match` que não cobre o caminho usado pela tela
cai no `deny` genérico, e o app "só não funciona"; ou o contrário, um caminho
aberto que ninguém testou.

Cada caso corresponde a uma regra que hoje vive num service do NestJS e tem e2e
equivalente — os IDs de origem estão citados.

| ID | Título | Tipo | Origem |
| -- | ------ | ---- | ------ |
| MG-2-01 | Participante ativo lê o bolão | caminho feliz | `CC-6-05` |
| MG-2-02 | Quem não participa não lê | autorização | `CC-6-05` |
| MG-2-03 | Quem saiu perde o acesso na hora | regra de negócio | `CV-4-04` |
| MG-2-04 | Anônimo não lê nada | autorização | `CC-10-04` |
| MG-2-05 | Participante lista participantes | caminho feliz | `CC-7-01` |
| MG-2-06 | Quem não participa não lista participantes | autorização | `CC-7-03` |
| MG-2-07 | Admin altera as regras do bolão | caminho feliz | `CC-2-08` |
| MG-2-08 | Participante comum não altera o bolão | autorização | `CC-2-10` |
| MG-2-09 | Nem o admin troca quem é o criador | segurança | `CC-8-04` |
| MG-2-10 | Ninguém apaga o bolão | regra de negócio | `CV-6` |
| MG-2-11 | Participante não se promove a admin | segurança | `CC-8-03` |
| MG-2-12 | Promover é Function, não escrita direta | segurança | `CC-8-05` |
| MG-2-13 | Remover é Function, não escrita direta | segurança | `CC-9-04` |
| MG-2-14 | Autenticado cria bolão sendo o criador | caminho feliz | `CC-1-02` |
| MG-2-15 | Não se cria bolão no nome de outro | segurança | — |
| MG-2-16 | Bolão não nasce encerrado nem travado | borda | `CC-3`, `CV-1` |
| MG-2-17 | O criador cria o próprio vínculo, como admin | caminho feliz | `CC-1-02` |
| MG-2-18 | E não se inscreve em bolão de outro | segurança | `CC-5-05` |
| MG-2-19 | Ranking inteiro em uma consulta | eficiência | `PR-3-11` |
| MG-2-20 | Quem não participa não lê o ranking | autorização | `PR-3-09` |
| MG-2-21 | Cliente não escreve na classificação | segurança | `PR-1` |
| MG-2-22 | Jogo é legível por quem está autenticado | caminho feliz | `PP-1-01` |
| MG-2-23 | Cliente não mexe no jogo | segurança | `PP-3-02` |
| MG-2-24 | Perfil é do dono, e ninguém enumera contas | segurança | `AC-1-03` |
| MG-2-25 | Palpite segue fechado até `MG-3` | segurança | `PP-7` |
| MG-2-26 | Meus bolões em uma consulta | eficiência | `CC-10-01` |
| MG-2-27 | Não listo os bolões de outra pessoa | autorização | `CC-10-03` |
| MG-2-28 | Não me coloco num bolão pelo índice | segurança | `CC-5-05` |

---

Os casos de autorização (02, 03, 04, 06, 08, 09, 11, 12, 13, 15, 18, 20, 21, 23,
24, 25, 27, 28) verificam **recusa**. É a maioria de propósito: no NestJS a recusa
era uma linha de service com teste e2e; aqui ela é a ausência de uma cláusula em
rule, e ausência não aparece lendo o arquivo.

Os de eficiência (19, 26) não medem tempo — verificam **forma**: que a leitura é
uma consulta só, porque no Firestore custo e correção são o mesmo problema. Somar
pontos de todos os palpites a cada abertura de tela funcionaria e estouraria o
free tier antes do fim do campeonato.

`MG-2-25` existe para travar o que **ainda não** foi feito: palpite fechado até
`MG-3` trazer sigilo e prazo. Sem esse caso, abrir a coleção "só para destravar o
app" passaria sem ninguém notar.
