# Execução — `PR-3` Ranking geral do bolão

**Plano:** `PR-3-plano.md` · **Data:** 07/08/2026
**Ambiente:** backend local (`test/ranking.e2e-spec.ts`,
`src/ranking/pr-3-plano.spec.ts` — criado nesta execução), Flutter em teste de
widget (`test/ranking_page_test.dart`).

**Resultado: 12/12 ✅** — nenhum defeito novo; 3 casos novos, entre eles o de
**N+1**, que não tinha como ser verificado olhando o resultado.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| PR-3-01 | ✅ | e2e "ranking geral ordena pelos pontos apurados" |
| PR-3-02 | ✅ | widget "marca a linha de quem está olhando" |
| PR-3-03 | ✅ | e2e "CV-2-03 a posição seguinte a um empate é 3º, não 2º" |
| PR-3-04 | ✅ | widget "mostra o critério do desempate também para quem lidera" |
| PR-3-05 | ✅ | e2e "participante sem palpite nenhum aparece com zero" |
| PR-3-06 | ✅ | e2e "paginação limita as linhas devolvidas" + widget "PR-3 FE-3 rola para buscar a página seguinte" |
| PR-3-07 | ✅ | e2e "PR-3 paginação do ranking recusa faixa inválida" |
| PR-3-08 | ✅ | e2e "quem saiu do bolão fica fora do ranking ativo" |
| PR-3-09 | ✅ | e2e "quem não participa não vê ranking nem extrato" |
| PR-3-10 | ✅ **novo** | widget "PR-3-10 ninguém pontuou…" e "PR-3-10b ranking sem nenhuma linha…" |
| PR-3-11 | ✅ **novo** | unidade "PR-3-11 o número de consultas não cresce com o número de participantes" |
| PR-3-12 | ✅ | widget "posição de dois dígitos com empate não estoura o layout" + "fonte grande" |

## `PR-3-11` — como testar N+1 sem instrumentar o banco

Asserir o **resultado** do ranking nunca pega N+1: a lista sai idêntica, só mais
devagar. O caso monta o serviço com um Prisma falso que **conta chamadas** e roda
o ranking com 3 e com 60 participantes:

- mesmo número de consultas nos dois casos;
- e o número é pequeno (≤ 4): uma leitura de membros com o nome vindo no `join`,
  uma agregação `groupBy`, e as checagens fixas da requisição.

Se alguém acrescentar uma busca de nome por linha, o teste fica vermelho na hora —
e o mesmo vale para o ranking da rodada (`PR-4-10`).

## Observações

- **`PR-3-10` cobre dois estados que se parecem e significam coisas diferentes:**
  "todos com zero" (o bolão existe, a apuração não começou) e "lista vazia" (não
  há nem participante para mostrar). Os dois com texto próprio; lista de zeros sem
  explicação parece defeito de apuração.
- Os dois defeitos históricos desta story estão travados por caso: **participante
  invisível além de 50** (`PR-3-06`) e **`limit=0` respondendo 200 com lista
  vazia** (`PR-3-07`), que a tela lia como "ninguém pontuou".
