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]>
62 lines
1.6 KiB
TypeScript
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",
|
|
},
|
|
});
|