# Plano de testes — `CC-4` Gerar e compartilhar o link de convite

**Story:** `docs/stories/CC-4-gerar-link-de-convite.md`

O convite é o **controle de acesso** ao bolão e ao mesmo tempo o funil de
entrada. Erra para os dois lados: token frouxo deixa estranho entrar; recusa mal
explicada faz o convidado desistir e o bolão não sair do papel. Os casos abaixo
cobrem os dois eixos, e o eixo "o que a pessoa realmente cola no campo".

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| CC-4-01 | Admin gera convite com validade de 1 dia | caminho feliz | alta |
| CC-4-02 | Convidado entra pelo link e cai no bolão certo | caminho feliz | alta |
| CC-4-03 | Token não fica em texto no banco | segurança | alta |
| CC-4-04 | Cada bolão tem token próprio | segurança | alta |
| CC-4-05 | Participante comum não gera nem invalida | autorização | alta |
| CC-4-06 | Gerar novo invalida o anterior na hora | caminho feliz | alta |
| CC-4-07 | Invalidado ≠ expirado ≠ inexistente | mensagem | alta |
| CC-4-08 | Bolão já começado recusa a geração | borda | alta |
| CC-4-09 | Bolão encerrado recusa entrada e geração | borda | alta |
| CC-4-10 | Invalidar sem convite ativo não estoura | borda | média |
| CC-4-11 | Reabrir o link não duplica participação | borda | alta |
| CC-4-12 | Colar o **link** em vez do código funciona | usabilidade | alta |
| CC-4-13 | Link colado no meio de uma frase funciona | usabilidade | média |
| CC-4-14 | Ação de convite não aparece para participante comum | autorização | alta |

---

### CC-4-01 — Admin gera convite com validade de 1 dia
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** token e `expiresAt` a ~24 h. A validade é decisão de
03/08 e está registrada como risco na story: prazo curto devolve trabalho manual
ao admin.

### CC-4-02 — Convidado entra pelo link e cai no bolão certo
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** vínculo criado com papel `MEMBER` no bolão do token, e a
resposta traz o nome do bolão (o app precisa dele para dizer onde a pessoa
entrou).

### CC-4-03 — Token não fica em texto no banco
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** só o hash persiste. Consequência aceita e registrada:
o servidor não consegue devolver o código, então o app guarda o dele localmente.

### CC-4-04 — Cada bolão tem token próprio
**Tipo:** segurança · **Prioridade:** alta
**Passos:** gerar convite em dois bolões do mesmo admin; entrar com o token do
segundo.
**Resultado esperado:** tokens diferentes e a entrada cai **no bolão do token**.
Um token que servisse para o bolão errado colocaria pessoas no bolão de outro.

### CC-4-05 — Participante comum não gera nem invalida
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** 403 nas duas ações, mesmo com a UI escondendo o botão.

### CC-4-06 — Gerar novo invalida o anterior na hora
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** o token antigo passa a ser recusado imediatamente. É o
que dá sentido a "o link caiu no lugar errado".

### CC-4-07 — Invalidado ≠ expirado ≠ inexistente
**Tipo:** mensagem · **Prioridade:** alta
**Resultado esperado:** 404 para inexistente/substituído, 410 para expirado com
"peça um novo ao administrador". Motivo distinguível é requisito: "erro" genérico
faz o convidado voltar ao WhatsApp e desistir.

### CC-4-08 — Bolão já começado recusa a geração
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** 409 com motivo. Defeito real de 06/08: o app entregava o
código, o admin mandava no grupo, e quem descobria o erro era o convidado.

### CC-4-09 — Bolão encerrado recusa entrada e geração
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** 410 nos dois casos.

### CC-4-10 — Invalidar sem convite ativo não estoura
**Tipo:** borda · **Prioridade:** média
**Resultado esperado:** responde sem erro (idempotente). O admin que toca duas
vezes em "invalidar" não pode ver falha.

### CC-4-11 — Reabrir o link não duplica participação
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** `jaParticipava: true`, um único vínculo. Reabrir link no
WhatsApp é comportamento normal, não erro.

### CC-4-12 — Colar o **link** em vez do código funciona
**Tipo:** usabilidade · **Prioridade:** alta
**Passos:** no diálogo "Cole o código", colar `bolao://bolao.app/convite/<token>`.
**Resultado esperado:** entra no bolão.
**Por que importa:** o que circula no grupo é o link — colar o link é a pessoa
usando o que recebeu, não errando. Antes da correção o servidor não achava o
hash e respondia "convite inválido ou já substituído": diagnóstico **errado**
sobre um convite válido, no ponto mais frágil do funil.

### CC-4-13 — Link colado no meio de uma frase funciona
**Tipo:** usabilidade · **Prioridade:** média
**Resultado esperado:** `"entra aqui: bolao://bolao.app/convite/<token> valeu"`
resolve para o token. Copiar a mensagem inteira é comum em celular.

### CC-4-14 — Ação de convite não aparece para participante comum
**Tipo:** autorização · **Prioridade:** alta
**Resultado esperado:** sem entrada de menu. Oferecer e responder 403 ensina o
participante a tocar em coisa que não funciona.
