Files
fspm-web/playwright.config.ts
Uriel JarethandClaude Opus 5 01b817d098 feat: sitio comercial FSPM con micro CRM interno
Sitio público orientado a venta consultiva e implementación de las
recomendaciones de la auditoría de marca y mercado:

- Inicio con tres rutas (industria, riesgo, cumplimiento) y clasificador
  de riesgo en el héroe, contra el hallazgo de que el visitante tenía que
  inferir qué solución le correspondía.
- Cinco páginas por segmento prioritario y catálogo comparable por clase
  de fuego, capacidad y agente.
- Los claims sin evidencia por modelo quedan aislados y se presentan como
  compromiso de documentación, nunca como característica del producto.
- SEO técnico completo: metadatos por página, sitemap derivado de los
  datos, JSON-LD, iconos y tarjeta social generadas.

Micro CRM:

- Captura por formulario embebido y por widget de WhatsApp que registra
  antes de abrir la conversación.
- Atribución de primer toque que sobrevive a la navegación.
- Deduplicación de contacto; un mismo contacto acumula oportunidades.
- Motor de asignación por reglas con reparto por turno de respaldo.
- Panel con dos roles de alcance distinto, tablero analítico, bitácora,
  pedidos y reglas. No enlazado desde el sitio público y con noindex.

Empaquetado en Docker multietapa con la base de demostración horneada en
la imagen y el volumen de datos separado, para que los leads capturados
sobrevivan a los redespliegues.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-28 00:07:20 -06:00

62 lines
1.6 KiB
TypeScript

import { defineConfig, devices } from "@playwright/test";
/**
* Configuración de pruebas de extremo a extremo.
*
* WebKit está incluido a propósito y no es opcional: es el motor de Safari e iOS,
* donde más se rompe la responsividad, y el cliente lo pidió explícitamente.
* Una prueba que solo pasa en Chromium no prueba responsividad.
*/
const PUERTO = 3100;
const BASE = `http://127.0.0.1:${PUERTO}`;
export default defineConfig({
testDir: "./tests",
fullyParallel: true,
forbidOnly: true,
retries: 1,
workers: 3,
timeout: 45_000,
expect: { timeout: 8_000 },
reporter: [
["list"],
["json", { outputFile: "tests/reporte/resultado.json" }],
["html", { outputFolder: "tests/reporte/html", open: "never" }],
],
use: {
baseURL: BASE,
locale: "es-MX",
timezoneId: "America/Mexico_City",
trace: "retain-on-failure",
screenshot: "only-on-failure",
video: "off",
},
projects: [
{
name: "escritorio-chromium",
use: { ...devices["Desktop Chrome"], viewport: { width: 1440, height: 900 } },
},
{
name: "escritorio-webkit",
use: { ...devices["Desktop Safari"], viewport: { width: 1440, height: 900 } },
},
{
name: "movil-webkit",
use: { ...devices["iPhone 13"] },
},
{
name: "movil-chico",
use: { ...devices["Desktop Chrome"], viewport: { width: 320, height: 640 }, isMobile: false },
},
],
webServer: {
command: `npm run start -- --port ${PUERTO}`,
url: `${BASE}/api/salud`,
reuseExistingServer: true,
timeout: 180_000,
stdout: "pipe",
stderr: "pipe",
},
});