# Plano de testes — `PP-4` Rascunho offline com envio automático

**Story:** `docs/stories/PP-4-rascunho-offline.md`

Por que esta story concentra risco: perder palpite digitado é motivo **declarado**
de abandonar o app. O cenário real é o casual digitando a rodada no ônibus, sem
rede, e o app sendo morto pelo sistema depois.

| ID | Título | Tipo | Prioridade |
| -- | ------ | ---- | ---------- |
| PP-4-01 | Digitado offline sobrevive ao fechamento do app | caminho feliz | alta |
| PP-4-02 | Pendente é sinalizado por jogo e no topo | caminho feliz | alta |
| PP-4-03 | Falha sem rede preserva o digitado | caminho feliz | alta |
| PP-4-04 | Fila envia sozinha ao voltar a rede | caminho feliz | alta |
| PP-4-05 | Fila envia só o pendente | borda | alta |
| PP-4-06 | Reenvio idêntico não duplica palpite | borda | alta |
| PP-4-07 | Reenvio idêntico não cria revisão nova | borda | alta |
| PP-4-08 | Prazo fecha durante a fila | borda | alta |
| PP-4-09 | Rascunho corrompido não trava o app | negativo | média |
| PP-4-10 | Rascunho é por bolão e por rodada | borda | alta |
| PP-4-11 | Envio bem-sucedido limpa a marca de pendente | caminho feliz | alta |
| PP-4-12 | Conexão intermitente durante o envio | borda | média |

---

### PP-4-01 — Digitado offline sobrevive ao fechamento do app
**Tipo:** caminho feliz · **Prioridade:** alta
**Pré-condições:** Wi-Fi e dados desligados; rodada com prazo aberto.
**Dados de teste:** `2 x 1` no primeiro jogo.
**Passos:**
1. Digitar o placar.
2. Matar o app (force-stop), ainda sem rede.
3. Reabrir.
**Resultado esperado:** o valor digitado está nos campos e continua marcado como
não enviado.

### PP-4-02 — Pendente é sinalizado por jogo e no topo
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** etiqueta "não enviado" no cartão do jogo **e** faixa
contando quantos estão pendentes. Saber que digitou não é saber que salvou — é
essa confusão que custa a rodada.

### PP-4-03 — Falha sem rede preserva o digitado
**Tipo:** caminho feliz · **Prioridade:** alta
**Passos:**
1. Digitar e tocar em enviar, sem rede.
**Resultado esperado:** o valor permanece na tela e no disco; a mensagem fala de
**conexão** e diz que a fila vai tentar sozinha — não um "erro" que sugere
digitar de novo.

### PP-4-04 — Fila envia sozinha ao voltar a rede
**Tipo:** caminho feliz · **Prioridade:** alta
**Passos:**
1. Com rascunho pendente, religar a rede.
2. Abrir o bolão — **sem** tocar em enviar.
**Resultado esperado:** o palpite chega ao servidor e a marca de pendente
desaparece.

### PP-4-05 — Fila envia só o pendente
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** rascunho com um item pendente e um já confirmado.
**Resultado esperado:** uma única chamada, contendo **apenas** o pendente.
Reenviar o confirmado gastaria rede e poluiria o histórico de revisões.

### PP-4-06 — Reenvio idêntico não duplica palpite
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Enviar `3x3`.
2. Enviar `3x3` de novo, duas vezes.
**Resultado esperado:** um único registro de palpite, com `3x3`.

### PP-4-07 — Reenvio idêntico não cria revisão nova
**Tipo:** borda · **Prioridade:** alta
**Resultado esperado:** a contagem de `prediction_revisions` **não muda** nos
reenvios; muda quando o valor muda de verdade.
_O histórico de revisões existe para responder "eu mudei antes do apito". Inflar
com cópias idênticas destrói a leitura que ele existe para permitir._

### PP-4-08 — Prazo fecha durante a fila
**Tipo:** borda · **Prioridade:** alta
**Pré-condições:** rascunho pendente de jogo que começa em 1 minuto.
**Passos:**
1. Deixar o prazo vencer com o app fechado.
2. Abrir o app com rede.
**Resultado esperado:** o item **não** é reenviado indefinidamente: sai da fila
com `PRAZO_FECHADO`, o campo volta ao valor salvo no servidor, e a mensagem diz
"vale o palpite que estava salvo". Manter na fila sugeriria que ainda vai salvar.

### PP-4-09 — Rascunho corrompido não trava o app
**Tipo:** negativo · **Prioridade:** média
**Pré-condições:** conteúdo inválido gravado na chave do rascunho.
**Resultado esperado:** o app descarta o rascunho e abre normalmente. Rascunho
ilegível não pode impedir o participante de palpitar de novo.

### PP-4-10 — Rascunho é por bolão e por rodada
**Tipo:** borda · **Prioridade:** alta
**Passos:**
1. Digitar na rodada 20 do bolão A.
2. Abrir a rodada 21 do bolão A e a rodada 20 do bolão B.
**Resultado esperado:** nenhum vazamento de valor entre as três. Chave errada aqui
faria o participante enviar palpite de um bolão em outro.

### PP-4-11 — Envio bem-sucedido limpa a marca de pendente
**Tipo:** caminho feliz · **Prioridade:** alta
**Resultado esperado:** etiqueta e faixa desaparecem; o rascunho passa a
`enviado: true` no disco (para o campo continuar preenchido offline).

### PP-4-12 — Conexão intermitente durante o envio
**Tipo:** borda · **Prioridade:** média
**Passos:**
1. Enviar 5 palpites e cortar a rede no meio.
**Resultado esperado:** os que o servidor confirmou saem da fila; os demais
continuam pendentes. Nenhum palpite digitado desaparece da tela em nenhum ponto.
