# Execução — `CC-6` Ver as regras do bolão a qualquer momento

**Plano:** `CC-6-plano.md` · **Data:** 06/08/2026
**Ambiente:** backend local (`test/regras.e2e-spec.ts`), Flutter em teste de
widget (`test/regras_avisos_test.dart`, `test/regras_edicao_test.dart`,
`test/bolao_page_test.dart`).

**Resultado: 12/12 ✅** — nenhum defeito de produto; 5 casos novos, dos quais 3
cobrem o cache offline, que não tinha teste nenhum.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| CC-6-01 | ✅ | widget "mostra a tabela de pontos e a ordem do desempate" |
| CC-6-02 | ✅ | widget "explica que empate não tem faixa de saldo" |
| CC-6-03 | ✅ | widget "diz que as regras travaram, quando travaram" |
| CC-6-04 | ✅ | widget "regras ainda abertas avisam que travam no primeiro palpite" |
| CC-6-05 | ✅ | e2e "quem não participa não lê as regras" |
| CC-6-06 | ✅ | widget "participante comum não recebe a ação de editar" |
| CC-6-07 | ✅ **novo** | widget "CC-6-07 sem rede, mostra a regra guardada com a idade" |
| CC-6-08 | ✅ | widget "falha de rede mostra o motivo com retry" |
| CC-6-09 | ✅ **novo** | widget "CC-6-09 cache é por bolão — B não mostra a regra de A" |
| CC-6-10 | ✅ **novo** | widget "CC-6-10 com rede, a regra nova substitui a guardada" |
| CC-6-11 | ✅ **novo** | widget "CC-6-11 o menu do bolão leva às regras sem sair do fluxo" |
| CC-6-12 | ✅ **novo** | widget "CC-6-12 mostra data e hora no fuso do aparelho" |

## Observações

- **O cache é por bolão (`regras.<poolId>`) e isso importa mais do que parece.**
  Regra de outro bolão na tela é pior que tela de erro: o participante decide o
  palpite pela tabela errada e só descobre na apuração. Passou sem alteração.
- **CC-6-10 fecha o risco registrado na story** (regra em cache que envelhece
  depois de o admin alterar): com rede a tela mostra a nova **e** regrava o
  cache, então a próxima leitura offline já é a nova.
- **Duas armadilhas do teste, não do produto:**
  1. Reabrir a tela com `pumpWidget` **reusa o `State`** (mesmo tipo de widget na
     mesma posição), então `initState` não roda e a segunda carga nunca acontece.
     Sem desmontar entre as aberturas, o teste mediria a primeira carga e passaria
     por engano. Resolvido com um helper `_desmontar`.
  2. O bloco de prazo e o de travamento ficam **abaixo do fold** na `ListView`,
     que constrói sob demanda — rolar antes de asserir também prova que o texto é
     alcançável na tela real.
- `1d 23h` e não `2d` no "fecha em": faltam dois dias **menos** o tempo gasto até
  a asserção. Arredondar para cima faria a tela prometer prazo que já passou.
