2026-08-07 — marvelousdb: pruebas de las ultimas rondas

Contexto: el usuario pidio anadir pruebas de las ultimas rondas de features.

Lo que se anadio

  1. test/unit.test.js (11 tests) — funciones puras exportadas desde api.js (module.exports ahora incluye slugify, strHash, characterLore, extractQuotes, battleNarrative, fightStats, detectTier):

    • slugify: casos raros (“U.S. Agent” → u-s-agent, comillas, parentesis, longitud max 60, idempotencia).
    • strHash: determinismo y dispersion (el orden de los ids importa).
    • characterLore: primer parrafo real de la bio; generado estable sin bio; distinto entre personajes.
    • extractQuotes: 2 quotes deterministas, limpias de markup wiki, rango de longitud; vacio sin texto; distinto por id.
    • battleNarrative: report completo (win), draw, victoria de B, quotes como “last words”, onomatopeyas, determinismo deepStrictEqual.
    • detectTier: structured manda, ruido narrativo ignorado, identidad divina en lore (“is an Asgardian…”), human por defecto.
    • fightStats: determinismo con luckOverride, caps (powers ⇐ 6, score minimo 1 aun con luck -1 y bio vacia).
  2. test/web.test.js (11 tests) — e2e con child processes (API + web reales, puertos efimeros, espera por health):

    • Home con nav (VS Battle, Coverage).
    • /coverage renderiza el dashboard.
    • /vs con ambos buscadores.
    • /vs/:pair arcade: BATTLE REPORT, winner/loser tags, clases winner/ defeated, linea “used X!”, cierre narrativo.
    • /vs/:pair da el MISMO resultado que ?a=&b= (URL compartible).
    • Slugs desconocidos → 404.
    • shareUrl embebido: location.origin + ‘/vs/cthulhu-vs-u-s-agent’.
    • Proxy /api: GET health JSON, POST report + DELETE unreport, imagen reportada → placeholder.
    • Personaje sin bio muestra lore generado y ya NO el aviso “no information” (fix: hasData incluye lore en web.js).
    • Boton de reporte presente.

Resultado

  • Suite completa: 49 tests, 0 fallos (27 api + 11 unit + 11 web).
  • Los tests web levantan procesos reales, asi que cubren el proxy y el render de las ultimas rondas (arcade, coverage, reporte, lore).