/** * Comprueba que la consola de cuentas se pinta de verdad y que el token NO * aparece en ningún sitio del DOM. * * Un typecheck limpio y un build correcto no dicen nada sobre si la pantalla * renderiza: eso hay que mirarlo. * * node platform/scripts/admin-ui-check.mjs */ import { chromium } from "playwright"; const BASE = process.env.UI_BASE_URL || "http://localhost:5176"; const EMAIL = "plataforma@agendamax.mx"; const PASS = "demo1234"; let fallos = 0; const check = (nombre, ok, detalle = "") => { console.log(` ${ok ? "✔" : "✖"} ${nombre}${detalle ? ` — ${detalle}` : ""}`); if (!ok) fallos++; }; const navegador = await chromium.launch(); const pagina = await navegador.newPage(); const erroresConsola = []; pagina.on("console", (m) => m.type() === "error" && erroresConsola.push(m.text())); pagina.on("pageerror", (e) => erroresConsola.push(String(e))); try { await pagina.goto(`${BASE}/login`, { waitUntil: "networkidle" }); await pagina.fill('input[type="email"]', EMAIL); await pagina.fill('input[type="password"]', PASS); await pagina.click('button[type="submit"]'); await pagina.waitForURL(/\/admin/, { timeout: 15000 }); check("entra como administración de plataforma", true, pagina.url()); await pagina.goto(`${BASE}/admin/cuentas`, { waitUntil: "networkidle" }); await pagina.waitForSelector("table", { timeout: 15000 }); const texto = await pagina.innerText("body"); check("se pinta la tabla de cuentas", /Cuentas de la plataforma/.test(texto)); check("aparece el negocio real", /Yola Franco Spa/.test(texto)); check("muestra la huella del token", /token …f89621|token \.\.\.f89621/.test(texto), "huella visible"); // Lo que NO puede pasar bajo ningún concepto. const html = await pagina.content(); check("el token completo NO está en el DOM", !/pit-/i.test(html) && !html.includes("f89621f"), ""); // El modal de vínculo: el campo del token debe ser de contraseña y venir vacío. await pagina.click("text=Cambiar token"); await pagina.waitForSelector("#cr-tok", { timeout: 8000 }); const tipo = await pagina.getAttribute("#cr-tok", "type"); const valor = await pagina.inputValue("#cr-tok"); check("el campo del token es de contraseña", tipo === "password", `type=${tipo}`); check("y viene vacío: no hay token que traer", valor === "", `valor=«${valor}»`); const locId = await pagina.inputValue("#cr-loc"); check("la subcuenta sí se prerrellena", locId === "Pk89Wa23QaxvkOfKgwjZ", locId); // Etiquetas asociadas a su control. const sinLabel = await pagina.$$eval("#cr-tok, #cr-loc", (els) => els.filter((el) => !document.querySelector(`label[for="${el.id}"]`)).map((el) => el.id) ); check("cada campo tiene su etiqueta asociada", sinLabel.length === 0, sinLabel.join(", ")); check("sin errores de consola", erroresConsola.length === 0, erroresConsola.slice(0, 2).join(" | ")); await pagina.screenshot({ path: "screenshots/admin-cuentas.png", fullPage: true }); console.log("\n captura en screenshots/admin-cuentas.png"); } finally { await navegador.close(); } console.log(`\n${fallos === 0 ? "Todo en verde" : `${fallos} comprobaciones fallaron`}`); process.exit(fallos === 0 ? 0 : 1);