feat: add docker pipeline and preview fixes

This commit is contained in:
2026-05-06 12:59:50 +08:00
commit 9ba85b01f3
44 changed files with 13894 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
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');
});