import { test } from "node:test"; import assert from "node:assert/strict"; import { isoConDesplazamiento, estadoCitaCrm } from "./calendars.ts"; // La suite corre con la zona del proceso FIJADA a otra distinta de la del // negocio, para que un cálculo que se ancle a la del proceso falle aquí. process.env.TZ = "UTC"; test("isoConDesplazamiento escribe la hora de pared del negocio con su desplazamiento", () => { // 2026-09-03 11:00 en México = 17:00Z const d = new Date("2026-09-03T17:00:00Z"); assert.equal(isoConDesplazamiento(d, "America/Mexico_City"), "2026-09-03T11:00:00-06:00"); }); test("isoConDesplazamiento no usa la zona del proceso", () => { const d = new Date("2026-09-03T17:00:00Z"); assert.equal(isoConDesplazamiento(d, "UTC"), "2026-09-03T17:00:00+00:00"); // Misma entrada, dos zonas, dos horas de pared distintas. assert.notEqual( isoConDesplazamiento(d, "UTC"), isoConDesplazamiento(d, "America/Mexico_City") ); }); test("isoConDesplazamiento: la medianoche se escribe 00, no 24", () => { // 00:00 del 4 de septiembre en México = 06:00Z const d = new Date("2026-09-04T06:00:00Z"); assert.equal(isoConDesplazamiento(d, "America/Mexico_City"), "2026-09-04T00:00:00-06:00"); }); test("isoConDesplazamiento: una cita de la tarde cae en el día correcto", () => { // 19:00 de México del día 3 = 01:00Z del día 4. El día de pared es el 3. const d = new Date("2026-09-04T01:00:00Z"); assert.equal(isoConDesplazamiento(d, "America/Mexico_City"), "2026-09-03T19:00:00-06:00"); }); test("estadoCitaCrm traduce los estados de la plataforma a los del CRM", () => { assert.equal(estadoCitaCrm("scheduled"), "confirmed"); assert.equal(estadoCitaCrm("completed"), "showed"); assert.equal(estadoCitaCrm("no_show"), "noshow"); assert.equal(estadoCitaCrm("cancelled"), "cancelled"); }); test("estadoCitaCrm: un estado que no conocemos no inventa, cae en confirmed", () => { assert.equal(estadoCitaCrm("lo-que-sea"), "confirmed"); });