const { test } = require('node:test'); const assert = require('node:assert'); const { normalizeLogMode, resolveLogFileName, formatDateStamp, formatSessionStamp } = require('../lib/log-mode'); // --- normalizeLogMode --- test('normalizeLogMode: default for empty/null/undefined is "single"', () => { assert.equal(normalizeLogMode(), 'single'); assert.equal(normalizeLogMode(null), 'single'); assert.equal(normalizeLogMode({}), 'single'); }); test('normalizeLogMode: explicit logMode wins for all three valid values', () => { assert.equal(normalizeLogMode({ logMode: 'single' }), 'single'); assert.equal(normalizeLogMode({ logMode: 'daily' }), 'daily'); assert.equal(normalizeLogMode({ logMode: 'session' }), 'session'); }); test('regression: legacy sessionLog:true maps to "daily", NOT "session"', () => { // The legacy boolean field was named after a misnomer — it actually toggled // per-day logging. Mapping it to "session" would silently flip every existing // per-day user onto per-session, which is exactly the bug the migration trap // exists to prevent. assert.equal(normalizeLogMode({ sessionLog: true }), 'daily'); }); test('normalizeLogMode: sessionLog:false / missing maps to "single"', () => { assert.equal(normalizeLogMode({ sessionLog: false }), 'single'); }); test('normalizeLogMode: explicit logMode beats the legacy sessionLog field', () => { // Once a user picks a mode in 3.3.35+, the legacy boolean must NOT override. assert.equal(normalizeLogMode({ logMode: 'session', sessionLog: true }), 'session'); assert.equal(normalizeLogMode({ logMode: 'single', sessionLog: true }), 'single'); }); test('normalizeLogMode: invalid logMode strings fall through to single (or legacy if present)', () => { assert.equal(normalizeLogMode({ logMode: 'lolnope' }), 'single'); assert.equal(normalizeLogMode({ logMode: '' }), 'single'); assert.equal(normalizeLogMode({ logMode: 'lolnope', sessionLog: true }), 'daily'); }); // --- resolveLogFileName --- test('resolveLogFileName: single mode → bare basename + ext', () => { assert.equal( resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'single' }), 'fileuploader.log' ); }); test('resolveLogFileName: daily mode → fileuploader-YYYY-MM-DD.log', () => { const d = new Date(2026, 4, 28); // May 28, 2026 — month is 0-indexed assert.equal( resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'daily', date: d }), 'fileuploader-2026-05-28.log' ); }); test('resolveLogFileName: session mode → fileuploader-session-.log', () => { assert.equal( resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'session', sessionId: '2026-05-28_22-44-52-12345' }), 'fileuploader-session-2026-05-28_22-44-52-12345.log' ); }); test('resolveLogFileName: session mode with missing sessionId falls back to single (never emits malformed name)', () => { assert.equal( resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'session' }), 'fileuploader.log' ); }); test('resolveLogFileName: unknown mode is treated as single', () => { assert.equal( resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'lolnope' }), 'fileuploader.log' ); }); // --- format helpers --- test('formatDateStamp: zero-pads month and day', () => { assert.equal(formatDateStamp(new Date(2026, 0, 3)), '2026-01-03'); assert.equal(formatDateStamp(new Date(2026, 11, 31)), '2026-12-31'); }); test('formatSessionStamp: produces YYYY-MM-DD_HH-MM-SS-pid', () => { const d = new Date(2026, 4, 28, 7, 9, 5); assert.equal(formatSessionStamp(d, 12345), '2026-05-28_07-09-05-12345'); }); test('formatSessionStamp: omits the pid suffix when none provided', () => { const d = new Date(2026, 4, 28, 22, 44, 52); assert.equal(formatSessionStamp(d), '2026-05-28_22-44-52'); });