import { chromium, webkit } from "@playwright/test"; const BASE = "https://fspm-demo.urieljareth.org"; let fallas = 0; const ok = (c, m) => { console.log(`${c ? " ok " : "FALLA "} ${m}`); if (!c) fallas++; }; for (const [nombre, motor, viewport] of [ ["chromium 1440", chromium, { width: 1440, height: 900 }], ["webkit 375", webkit, { width: 375, height: 780 }], ]) { console.log(`\n=== ${nombre} ===`); const nav = await motor.launch(); const pag = await nav.newPage({ viewport, locale: "es-MX" }); // sitio público await pag.goto(BASE + "/", { waitUntil: "domcontentloaded" }); ok((await pag.locator("h1").count()) === 1, "el inicio tiene un solo h1"); ok((await pag.locator('a[href^="/admin"]').count()) === 0, "el panel no está enlazado"); // la página no se corre de lado const corre = await pag.evaluate(() => { window.scrollTo(800, 0); const m = window.scrollX; window.scrollTo(0, 0); return m; }); ok(corre <= 2, `el inicio no se desplaza en horizontal (se corrió ${corre}px)`); // catálogo filtrado por escenario await pag.goto(BASE + "/catalogo?escenario=gasolineras", { waitUntil: "domcontentloaded" }); ok((await pag.locator("h1").count()) === 1, "el catálogo filtrado carga"); // Acceso rápido al panel. Se espera `load` y un margen antes de pulsar: el // botón dispara una acción de servidor y hasta que React no hidrata, el clic // no hace nada. Con la latencia del dominio público esa carrera se pierde, y // la primera versión de esta verificación culpó a Cloudflare por eso. await pag.goto(BASE + "/admin/login", { waitUntil: "load" }); const perfil = pag.getByRole("button").filter({ hasText: /administrador/i }).first(); ok(await perfil.isVisible().catch(() => false), "el acceso rápido lista perfiles"); await pag.waitForTimeout(2500); await perfil.click(); await pag.waitForURL(/\/admin(?!\/login)/, { timeout: 30000 }).catch(() => {}); ok(!/\/admin\/login/.test(pag.url()), `entró al panel (${pag.url().replace(BASE, "")})`); // y la sesión persiste en otra página: eso es la cookie Secure funcionando await pag.goto(BASE + "/admin/oportunidades", { waitUntil: "load" }); ok(!/\/admin\/login/.test(pag.url()), "la sesión persiste entre páginas"); const cuerpo = (await pag.locator("body").textContent()) ?? ""; ok(/OPP-\d{4}-\d{4}/.test(cuerpo), "el listado muestra oportunidades reales"); await nav.close(); } console.log(fallas === 0 ? "\nTODO EN VERDE EN PRODUCCION" : `\n${fallas} FALLAS EN PRODUCCION`); process.exit(fallas === 0 ? 0 : 1);