You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Testes/Persistência: extrair mapeamento puro de persistMatch (results→matches/scores) e cobrir com Vitest #50
A frota já cobriu a escrita do resultado (sanitizeResults, #31) e está extraindo as métricas puras (#32, em revisão). Falta a última fronteira que a spec do chapêu aponta: a persistência que alimenta o leaderboard global.
persistMatch mapeia os results já sanitizados → linhas de matches e scores (src/app/api/rooms/[code]/route.ts:103-141). O mapeamento tem lógica real e hoje zero teste:
ordena por place com fallback || 99 e elege winner = ranked[0];
winner_wpm: winner ? Math.round(winner.wpm) || 0 : null — o || 0 transforma Math.round(0)/NaN em 0 (comportamento sutil que merece contrato);
persistMatch passa a ser um wrapper fino que chama os builders e faz apenas os dois insert no Supabase — sem lógica de mapeamento inline.
Suite Vitest src/lib/room.test.ts (ou arquivo novo) cobrindo os builders.
Acceptance criteria (verificáveis)
pnpm test verde com casos que provam: winner = menor place (com empate/place ausente caindo no fallback), winner_wpm/wpm/accuracy/errors arredondados e nunca NaN, place 0/negativo → null, finished coerção booleana, e results vazio → buildMatchRow retorna null e nenhuma linha de score.
persistMatch não contém mais aritmética de mapeamento inline (só orquestra os builders + insert).
pnpm typecheck e pnpm build verdes; node scripts/validate-persistence.mjs verde.
Nenhuma mudança de comportamento observável em produção (refactor puro + testes).
Dica de abordagem
Espelhe o padrão do #32/#31: extrair função pura → testar contrato. O fixture de RoomRow/ResultRow já existe no topo de room.test.ts (legit()/ROOM) — reutilize. Não precisa de fake do Supabase para os builders (são puros); o wrapper continua best-effort com o try/catch atual.
Resolvida na PR #55: buildMatchRow/buildScoreRows extraídos para src/lib/room.ts (puros, finished_at por parâmetro), persistMatch virou wrapper fino e a suite subiu de 20 → 36 testes cobrindo vencedor/arredondamentos/NaN/place/vazio. Refactor puro, sem mudança de comportamento. Gate verde: typecheck + build + test + validate-persistence (33/33) + validate-metrics (37/37).
Activity
caioross commentedon Jul 22, 2026
Resolvida na PR #55:
buildMatchRow/buildScoreRowsextraídos parasrc/lib/room.ts(puros,finished_atpor parâmetro),persistMatchvirou wrapper fino e a suite subiu de 20 → 36 testes cobrindo vencedor/arredondamentos/NaN/place/vazio. Refactor puro, sem mudança de comportamento. Gate verde: typecheck + build + test + validate-persistence (33/33) + validate-metrics (37/37).merge origin/main into #50: reencosta os builders na main atual
refactor(persistencia): extrai buildMatchRow/buildScoreRows de persis…