← back to Sample Followup Sweep

test/sweep-dow.test.cjs

52 lines

'use strict';
// TK-12091 day-of-week-aware window unit test.
// Rule: hi=today-10 always; TUE widens lo to today-13 (4-day catch-up), Wed/Thu/Fri strict single day.
const assert = require('node:assert');
const { sweep } = require('../lib/sweep');

const D = (s) => new Date(s + 'T12:00:00');           // local noon, avoids TZ edge
const dstr = (d) => d.toISOString().slice(0, 10);
const before = (base, n) => { const d = new Date(base); d.setDate(d.getDate() - n); return dstr(d); }; // n days BEFORE
const row = (entered) => ({ mfr: 'M' + entered, entered });
const pick = (today, rows) => sweep(rows, {}, today).followUp.map(r => r.entered).sort();

assert.equal(D('2026-09-22').getDay(), 2, '2026-09-22 must be Tuesday');
assert.equal(D('2026-09-23').getDay(), 3, '2026-09-23 must be Wednesday');
assert.equal(D('2026-09-18').getDay(), 5, '2026-09-18 must be Friday');

// (a) TUESDAY run picks up Sat/Sun/Mon/Tue landing cohorts = Entered today-13..today-10, excludes -14 and -9
{
  const t = D('2026-09-22');
  const rows = [9,10,11,12,13,14].map(n => row(before(t, n)));
  const got = pick(t, rows);
  const want = [13,12,11,10].map(n => before(t, n)).sort();
  assert.deepEqual(got, want, `(a) Tuesday window wrong: got ${got}`);
  console.log('(a) PASS — Tuesday picks Sat(-13),Sun(-12),Mon(-11),Tue(-10):', got.join(', '), '| excluded -14 & -9');
}

// (b) WED/THU/FRI run picks ONLY today-10, nothing older
for (const [label, day] of [['WED','2026-09-23'],['THU','2026-09-24'],['FRI','2026-09-25']]) {
  const t = D(day);
  const rows = [9,10,11,12,13].map(n => row(before(t, n)));
  const got = pick(t, rows);
  const want = [before(t, 10)];
  assert.deepEqual(got, want, `(b) ${label} must pick ONLY today-10: got ${got}`);
  console.log(`(b) PASS — ${label} picks ONLY today-10:`, got.join(', '));
}

// (c) Fri -> Tue -> Wed sequence: every Entered date selected exactly once (no gap, no dup)
{
  const fri = D('2026-09-18'), tue = D('2026-09-22'), wed = D('2026-09-23');
  const cand = []; for (let n = 5; n <= 15; n++) cand.push(before(wed, n));  // 09/08 .. 09/18
  const rows = cand.map(row);
  const counts = {};
  for (const t of [fri, tue, wed]) for (const e of pick(t, rows)) counts[e] = (counts[e] || 0) + 1;
  const selected = Object.keys(counts).sort();
  const expected = ['2026-09-08','2026-09-09','2026-09-10','2026-09-11','2026-09-12','2026-09-13'];
  assert.deepEqual(selected, expected, `(c) selected set wrong: ${selected}`);
  const dups = Object.entries(counts).filter(([, c]) => c !== 1);
  assert.equal(dups.length, 0, `(c) double-chase found: ${JSON.stringify(dups)}`);
  console.log('(c) PASS — Fri->Tue->Wed selects each Entered once, no gap/dup:', selected.join(', '));
}
console.log('\nALL 3 ASSERTIONS PASSED');