'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { resolvePeriod, businessDaysWindowBefore, parseDate, formatDate } = require('../src/v2/period'); const { loadConfig } = require('../src/v2/config'); const config = loadConfig(); // Ancoras reais usadas na missao (agosto/2026): // 17/08 = segunda, 18/08 = terca, 19/08 = quarta, 20/08 = quinta, // 21/08 = sexta, 22/08 = sabado, 23/08 = domingo, 24/08 = segunda. function d(dia) { return new Date(2026, 7, dia); } test('terca (18/08) cobre o relatorio diario de segunda (17/08)', () => { const r = resolvePeriod('', d(18), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-17'); assert.equal(r.data_fim, '2026-08-17'); }); test('quarta (19/08) cobre o relatorio diario de terca (18/08)', () => { const r = resolvePeriod('', d(19), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-18'); assert.equal(r.data_fim, '2026-08-18'); }); test('quinta (20/08) cobre o relatorio diario de quarta (19/08)', () => { const r = resolvePeriod('', d(20), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-19'); assert.equal(r.data_fim, '2026-08-19'); }); test('sexta (21/08) cobre o relatorio diario de quinta (20/08)', () => { const r = resolvePeriod('', d(21), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-20'); assert.equal(r.data_fim, '2026-08-20'); }); test('segunda (24/08) cobre o relatorio semanal consolidado de 17/08 a 23/08', () => { const r = resolvePeriod('', d(24), config); assert.equal(r.tipo_periodo, 'semanal'); assert.equal(r.data_inicio, '2026-08-17'); assert.equal(r.data_fim, '2026-08-23'); assert.equal(r.periodo_label, '2026-08-17 a 2026-08-23'); }); test('sabado/domingo nao fazem parte do calendario operacional (nao ha schedule nesses dias, mas a funcao deve continuar pura)', () => { // Sabado (22/08): getDay() = 6, cai no "senao" (diario) porque so segunda e tratada // como especial. Isso e esperado: o Schedule Trigger real (cron 1-5) nunca dispara // aos sabados/domingos, entao este caso nunca ocorre em producao/DEV. const r = resolvePeriod('', d(22), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-21'); }); test('data_alvo manual (YYYY-MM-DD) forca modo diario manual, independente do dia da semana atual', () => { const r = resolvePeriod('2026-08-20', d(24), config); assert.equal(r.tipo_periodo, 'manual_diario'); assert.equal(r.data_inicio, '2026-08-20'); assert.equal(r.data_fim, '2026-08-20'); }); test('data_alvo manual aceita formato dd/mm/aa', () => { const r = resolvePeriod('20/08/26', d(24), config); assert.equal(r.data_inicio, '2026-08-20'); }); test('data_alvo manual aceita formato dd/mm/aaaa', () => { const r = resolvePeriod('20/08/2026', d(24), config); assert.equal(r.data_inicio, '2026-08-20'); }); test('data_alvo invalida (texto livre) cai no modo automatico', () => { const r = resolvePeriod('data invalida', d(19), config); assert.equal(r.tipo_periodo, 'diario'); assert.equal(r.data_inicio, '2026-08-18'); }); test('parseDate rejeita string vazia', () => { assert.equal(parseDate(''), null); assert.equal(parseDate(undefined), null); }); test('businessDaysWindowBefore conta somente dias uteis (pula fim de semana)', () => { // antes de 24/08 (segunda): 5 dias uteis = 21,20,19,18,17 (sex,qui,qua,ter,seg) const janela = businessDaysWindowBefore(d(24), 5); assert.equal(formatDate(janela.start), '2026-08-17'); assert.equal(formatDate(janela.end), '2026-08-21'); assert.equal(janela.businessDays, 5); }); test('baseline diario expoe janela rolling e last5BusinessDays sem usar datas incorretas', () => { const r = resolvePeriod('', d(19), config); // periodo = 18/08 (terca) assert.equal(r.baseline.immediatePrevious.start, r.baseline.immediatePrevious.end); assert.ok(r.baseline.rolling.start < r.baseline.rolling.end || r.baseline.rolling.start <= r.baseline.rolling.end); assert.ok(r.baseline.last5BusinessDays.end < r.data_inicio); assert.ok(r.baseline.rolling.end < r.data_inicio); }); test('baseline semanal expoe janela de 4 semanas anteriores sem sobrepor o periodo atual', () => { const r = resolvePeriod('', d(24), config); // periodo = 17 a 23/08 assert.equal(r.baseline.immediatePrevious.start, '2026-08-10'); assert.equal(r.baseline.immediatePrevious.end, '2026-08-16'); assert.equal(r.baseline.last4Weeks.start, '2026-07-20'); assert.equal(r.baseline.last4Weeks.end, '2026-08-16'); assert.ok(r.baseline.last4Weeks.end < r.data_inicio); });