# Plano de testes — `MG-1` Projeto Firebase e emuladores local

**Story:** `docs/stories/MG-1-firebase-local.md`

Story de infraestrutura, mas com risco real: se o ambiente de teste não for
confiável, **todas** as stories seguintes constroem sobre chão falso. O pior modo
de falha aqui não é "não sobe" — é "sobe, mas falando com projeto real", ou "as
rules parecem fechadas e não estão".

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| MG-1-01 | Emulador do Firestore sobe e compila as rules | caminho feliz | alta |
| MG-1-02 | Auth e Functions sobem junto | caminho feliz | alta |
| MG-1-03 | Build das Functions passa | caminho feliz | alta |
| MG-1-04 | JDK keg-only é resolvido sem intervenção | borda | alta |
| MG-1-05 | Sem JDK algum, a mensagem diz o que fazer | negativo | alta |
| MG-1-06 | Projeto não-demo é recusado | segurança | alta |
| MG-1-07 | Projeto real exige autorização explícita | segurança | alta |
| MG-1-08 | As rules começam fechadas para todos | segurança | alta |
| MG-1-09 | Teste de rule tem como semear dado | infra de teste | alta |
| MG-1-10 | Credenciais e estado local fora do versionamento | segurança | alta |

---

### MG-1-01 — Emulador do Firestore sobe e compila as rules
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** `emulators:exec` executa e sai com código 0. Rule com erro
de sintaxe faz o emulador recusar a subir — é a primeira validação de graça.

### MG-1-02 — Auth e Functions sobem junto
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** os três emuladores nas portas fixas do `firebase.json`.
Porta variável quebra teste que aponta para `127.0.0.1:8080`.

### MG-1-03 — Build das Functions passa
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** `tsc` limpo, com `strict` e `noUncheckedIndexedAccess`.

### MG-1-04 — JDK keg-only é resolvido sem intervenção
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** com o OpenJDK do Homebrew instalado mas fora do `PATH`, o
emulador sobe. **Este é o caso que a story previu e que falhou de verdade** na
primeira tentativa.

### MG-1-05 — Sem JDK algum, a mensagem diz o que fazer
**Tipo:** negativo · **Prioridade:** alta
**Resultado esperado:** erro citando `brew install openjdk`, o fato de ser
keg-only e `JAVA_HOME`. A mensagem original do emulador ("Unable to locate a Java
Runtime") não menciona nada disso e manda a pessoa para java.com.

### MG-1-06 — Projeto não-demo é recusado
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** recusa antes de subir. Teste que fala com projeto real
grava lixo em produção e queima cota — e ninguém descobre no mesmo dia.

### MG-1-07 — Projeto real exige autorização explícita
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** com `PERMITIR_PROJETO_REAL=true`, passa. A trava protege
do acidente, não do intencional.

### MG-1-08 — As rules começam fechadas para todos
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** leitura e escrita negadas para autenticado e anônimo.
Abrir primeiro e fechar depois é como um vazamento entra em produção.

### MG-1-09 — Teste de rule tem como semear dado
**Tipo:** infra de teste · **Prioridade:** alta
**Resultado esperado:** `withSecurityRulesDisabled` grava o cenário, e a leitura
pela rule continua negada. Sem isso, `MG-2` e `MG-3` não conseguem testar leitura.

### MG-1-10 — Credenciais e estado local fora do versionamento
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** `node_modules`, `functions/lib`, `.firebase`, logs de
debug e qualquer `*serviceAccount*.json` ignorados.
