import test from 'node:test'; import assert from 'node:assert/strict'; import { buildResolvedFilesetId, computeCanonicalBlockSize, normalizeCompressionMethod, toZipEntryName } from '../src/lib/duplicati.js'; import { normalizeApiPath, toApiPath } from '../src/lib/paths.js'; import { duplicatiTicksToIso, unixSecondsToIso } from '../src/lib/time.js'; test('db paths normalize to API paths', () => { assert.equal(toApiPath('C:\\Users\\me\\movie.mp4'), '/C:/Users/me/movie.mp4'); assert.equal(normalizeApiPath('/movies/demo.mp4/'), '/movies/demo.mp4'); }); test('hashes convert to duplicati zip entry names', () => { assert.equal(toZipEntryName('abc+/def='), 'abc-_def='); }); test('compression methods normalize from zip numeric codes', () => { assert.equal(normalizeCompressionMethod(8), 'deflate'); assert.equal(normalizeCompressionMethod('0'), 'store'); }); test('resolved fileset id is deterministic', () => { assert.equal(buildResolvedFilesetId('2026-05-05T08:00:00.000Z'), 'fs_2026-05-05T08:00:00.000Z'); }); test('canonical block size chooses the dominant chunk size', () => { assert.equal( computeCanonicalBlockSize([ { logicalSize: 102400 }, { logicalSize: 102400 }, { logicalSize: 4096 } ]), 102400 ); }); test('timestamps convert from unix seconds and .NET ticks', () => { assert.equal(unixSecondsToIso(0), '1970-01-01T00:00:00.000Z'); assert.equal(duplicatiTicksToIso('621355968000000000'), '1970-01-01T00:00:00.000Z'); });