# Plano de testes — `CC-3` Travar as regras no primeiro palpite

**Story:** `docs/stories/CC-3-travar-regras-no-primeiro-palpite.md`

Por que esta story concentra risco: regra alterada no meio do campeonato é o
pior cenário do épico — muda a pontuação de palpite que já foi feito. O
travamento é o que torna o bolão confiável, e ele acontece num momento exato:
**o primeiro palpite registrado**.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| CC-3-01 | Alterar regras antes de qualquer palpite | caminho feliz | alta |
| CC-3-02 | Primeiro palpite trava as regras | caminho feliz | alta |
| CC-3-03 | Alterar depois do primeiro palpite é recusado | caminho feliz | alta |
| CC-3-04 | Bypass pela API com regras travadas | segurança | alta |
| CC-3-05 | Participante comum não altera nem destravado | autorização | alta |
| CC-3-06 | Palpites seguintes não movem o momento do travamento | borda | alta |
| CC-3-07 | Travamento durante a edição na tela | concorrência | alta |
| CC-3-08 | Tela mostra o estado do travamento | caminho feliz | média |
| CC-3-09 | Admin travado recebe o caminho de saída | borda | média |

---

### CC-3-01 — Alterar regras antes de qualquer palpite
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** bolão recém-criado, `rulesLockedAt` nulo.
**Dados de teste:** `20 / 10 / 5`.
**Resultado esperado:** HTTP 200, regras persistidas, `rulesLockedAt` segue
nulo.

### CC-3-02 — Primeiro palpite trava as regras
**Tipo:** caminho feliz · **Prioridade:** alta
**Passos:**
1. Registrar o primeiro palpite do bolão.
2. Ler as regras.
**Resultado esperado:** `rulesLockedAt` preenchido com o momento do palpite. O
travamento acontece na **mesma transação** do palpite: se o palpite entra e o
travamento não, existe janela para alterar a regra do palpite já feito.

### CC-3-03 — Alterar depois do primeiro palpite é recusado
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** HTTP 409 com mensagem sobre travamento; regras
inalteradas no banco.

### CC-3-04 — Bypass pela API com regras travadas
**Tipo:** segurança · **Prioridade:** alta
**Passos:**
1. `PATCH /pools/:id/rules` direto, como admin, com o bolão travado.
**Resultado esperado:** 409. A tela esconder o botão não é proteção.

### CC-3-05 — Participante comum não altera nem destravado
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** 403, independente do travamento. Autorização e
travamento são barreiras distintas e as duas têm que existir.

### CC-3-06 — Palpites seguintes não movem o momento do travamento
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Registrar o 1º palpite; guardar `rulesLockedAt`.
2. Registrar mais 3 palpites, de participantes diferentes.
3. Reler `rulesLockedAt`.
**Resultado esperado:** valor **idêntico** ao do passo 1. O `updateMany` com
`rulesLockedAt: null` é o que garante isso — sobrescrever moveria a data e
apagaria a evidência de quando a regra congelou.

### CC-3-07 — Travamento durante a edição na tela
**Tipo:** concorrência · **Prioridade:** alta
**Pré-condições:** admin com o editor de regras aberto; outro participante
palpita nesse intervalo.
**Passos:**
1. Salvar as regras.
**Resultado esperado:** a tela **explica** que alguém palpitou e as regras
travaram, volta ao modo leitura mostrando as regras que valem, e a explicação
**continua visível**.
_A explicação sumia no instante em que a tela voltava para leitura (06/08) —
exatamente quando precisava ser lida._

### CC-3-08 — Tela mostra o estado do travamento
**Tipo:** caminho feliz · **Prioridade:** média
**Resultado esperado:** destravado → "podem ser alteradas pelo administrador,
travam no primeiro palpite", com cadeado aberto. Travado → "estão travadas: o
primeiro palpite já foi registrado", com cadeado fechado. Saber se ainda dá para
mudar é o que encerra a discussão antes de ela começar.

### CC-3-09 — Admin travado recebe o caminho de saída
**Tipo:** borda · **Prioridade:** média
**Pré-condições:** admin, regras travadas.
**Resultado esperado:** texto dizendo que o caminho é encerrar este bolão e
abrir outro. Sem caminho, o admin tenta burlar — ou pede para alguém mexer no
banco.
