import { test } from "node:test"; import assert from "node:assert/strict"; import { estadoOportunidad, nombreOportunidad } from "./opportunities.ts"; test("el estado de la cita se mapea al de la oportunidad", () => { assert.equal(estadoOportunidad("scheduled"), "open", "en espera → open"); assert.equal(estadoOportunidad("completed"), "won", "completada → won"); assert.equal(estadoOportunidad("cancelled"), "lost", "cancelada → lost"); }); test("no vino también es una pérdida para el embudo", () => { // El matiz de POR QUÉ se perdió (no vino / canceló la clienta / canceló el // spa) vive en AgendaMax: el CRM aplana los tres en `lost`. assert.equal(estadoOportunidad("no_show"), "lost"); }); test("un estado desconocido no cierra la oportunidad", () => { // Cerrar por error es peor que dejar abierto: `won` mete ingreso inventado en // los reportes del CRM y `lost` mata una cita viva. assert.equal(estadoOportunidad("cualquier_cosa"), "open"); }); test("el nombre de la oportunidad es SERVICIO + CLIENTA", () => { assert.equal( nombreOportunidad("Extensiones de pestañas", "Mariana López"), "Extensiones de pestañas — Mariana López" ); }); test("el nombre se recorta para no romper el límite del CRM", () => { const n = nombreOportunidad("S".repeat(200), "C".repeat(200)); assert.equal(n.length, 255); });