46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
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');
|
|
});
|