# Plano de testes — `AC-1` Cadastro com e-mail, senha e nome de exibição

**Story:** `docs/stories/AC-1-cadastro-com-email.md`

O cadastro é a primeira tela de quem chega por convite — e **não há recuperação de
senha** nesta versão, então errar aqui custa a conta em definitivo. Dois riscos:
perder o que a pessoa digitou (ela não digita de novo) e vazar existência de conta
na recusa de e-mail duplicado.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| AC-1-01 | Cadastro válido cria a conta e identifica | caminho feliz | alta |
| AC-1-02 | Senha e hash nunca voltam na resposta | segurança | alta |
| AC-1-03 | E-mail duplicado aponta para o login | segurança | alta |
| AC-1-04 | E-mail malformado é recusado | validação | alta |
| AC-1-05 | Senha curta é recusada sem ecoar o valor | segurança | alta |
| AC-1-06 | Campo fora do contrato é recusado | segurança | alta |
| AC-1-07 | E-mail é normalizado para minúsculas | borda | alta |
| AC-1-08 | Validação por campo antes de chamar a API | UI | alta |
| AC-1-09 | O mínimo de senha do app é o do servidor | UI | alta |
| AC-1-10 | Falha de rede não apaga o que foi digitado | UI | alta |
| AC-1-11 | A tela avisa que não há recuperação de senha | UI | alta |
| AC-1-12 | Vindo de convite, o cadastro leva ao bolão | UI | alta |

---

### AC-1-01 — Cadastro válido cria a conta e identifica
**Tipo:** caminho feliz · **Prioridade:** alta

### AC-1-02 — Senha e hash nunca voltam na resposta
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** nem `password`, nem `passwordHash`. Hash em resposta é
material para ataque offline.

### AC-1-03 — E-mail duplicado aponta para o login
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** recusa dizendo para entrar, **sem** confirmar nada além do
necessário. Aqui a informação vaza inevitavelmente (e-mail único), então o texto
tem de ser útil sem virar oráculo de enumeração.

### AC-1-04 — E-mail malformado é recusado
**Tipo:** validação · **Prioridade:** alta

### AC-1-05 — Senha curta é recusada sem ecoar o valor
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** 400 e a senha **não** aparece na mensagem. Resposta de erro
costuma ir para log — e senha em log é senha comprometida.

### AC-1-06 — Campo fora do contrato é recusado
**Tipo:** segurança · **Prioridade:** alta
**Resultado esperado:** 400 para campo extra (ex.: `role`). Ignorar em silêncio é o
que faz uma tentativa de escalar privilégio parecer que funcionou.

### AC-1-07 — E-mail é normalizado para minúsculas
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** `Ana@X.com` e `ana@x.com` são a mesma conta. Sem isso a
pessoa cria conta duplicada sem entender e perde o bolão em que entrou.

### AC-1-08 — Validação por campo antes de chamar a API
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** erro no campo, sem ida ao servidor.

### AC-1-09 — O mínimo de senha do app é o do servidor
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** os dois limites iguais. Divergir gera recusa sem
explicação.

### AC-1-10 — Falha de rede não apaga o que foi digitado
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** e-mail e nome continuam na tela depois do erro. Em conexão
ruim, apagar o formulário é o que faz a pessoa desistir do convite.

### AC-1-11 — A tela avisa que não há recuperação de senha
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** aviso explícito. É a consequência da `AC-4` cancelada:
esquecer a senha custa a conta, e a pessoa precisa saber **antes** de escolher.

### AC-1-12 — Vindo de convite, o cadastro leva ao bolão
**Tipo:** UI · **Prioridade:** alta
**Resultado esperado:** a tela diz que o convite continua valendo, e ao concluir a
pessoa cai no bolão do convite — não numa tela inicial genérica.
