project-nomad/admin/tests/unit/zim_download_resolution.spe...

128 lines
4.2 KiB
TypeScript

import * as assert from 'node:assert/strict'
import { test } from 'node:test'
import { resolveZimDownload } from '../../app/utils/zim_download_resolution.js'
const manifestResource = {
id: 'wikipedia_en_all_mini',
version: '2025-12',
title: 'Wikipedia',
description: 'Compact Wikipedia',
url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2025-12.zim',
size_mb: 11_400,
}
test('live catalog result replaces stale manifest download metadata', () => {
const resolved = resolveZimDownload(manifestResource, {
version: '2026-06',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-06.zim',
size_bytes: 12_531_944_448,
})
assert.deepEqual(resolved, {
url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-06.zim',
version: '2026-06',
sizeBytes: 12_531_944_448,
})
})
test('missing catalog result falls back to static manifest metadata', () => {
assert.deepEqual(resolveZimDownload(manifestResource, null), {
url: manifestResource.url,
version: manifestResource.version,
sizeBytes: manifestResource.size_mb * 1024 * 1024,
})
})
test('catalog result with unknown size keeps the manifest size estimate', () => {
const resolved = resolveZimDownload(manifestResource, {
version: '2026-06',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-06.zim',
size_bytes: 0,
})
assert.equal(resolved.sizeBytes, manifestResource.size_mb * 1024 * 1024)
})
test('older catalog result does not replace newer manifest metadata', () => {
const resolved = resolveZimDownload(manifestResource, {
version: '2025-09',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2025-09.zim',
size_bytes: 10_000,
})
assert.equal(resolved.url, manifestResource.url)
assert.equal(resolved.version, manifestResource.version)
})
test('non-padded catalog months are compared numerically', () => {
const resource = {
...manifestResource,
version: '2026-2',
url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-2.zim',
}
const resolved = resolveZimDownload(resource, {
version: '2026-10',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim',
size_bytes: 13_000,
})
assert.equal(
resolved.url,
'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim'
)
assert.equal(resolved.version, '2026-10')
})
// ---- Gated, self-hosted content ----
//
// Resources we host behind the entitlement Worker are pinned to the manifest URL.
// They are not in the openzim catalog, so a catalog match can only ever be a
// resource-id collision, and following it would swap our content for a third
// party's AND drop the Authorization header.
const gatedResource = {
id: 'field-manuals',
version: '2026-07',
title: 'US Military Field Manuals',
description: 'Public-domain US military field manuals',
url: 'https://nomad-packs-worker.chris-556.workers.dev/content/field-manuals_2026-07.zim',
size_mb: 2_000,
auth: 'nomad_app_key' as const,
}
test('gated resource ignores a newer catalog result and stays on the manifest URL', () => {
const resolved = resolveZimDownload(gatedResource, {
version: '2026-12',
download_url: 'https://download.kiwix.org/zim/other/field-manuals_2026-12.zim',
size_bytes: 9_999_999,
})
assert.deepEqual(resolved, {
url: gatedResource.url,
version: gatedResource.version,
sizeBytes: gatedResource.size_mb * 1024 * 1024,
})
})
test('gated resource resolves normally with no catalog result', () => {
assert.deepEqual(resolveZimDownload(gatedResource, null), {
url: gatedResource.url,
version: gatedResource.version,
sizeBytes: gatedResource.size_mb * 1024 * 1024,
})
})
test('absent auth leaves catalog precedence untouched', () => {
const resolved = resolveZimDownload(manifestResource, {
version: '2026-06',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-06.zim',
size_bytes: 12_531_944_448,
})
assert.equal(
resolved.url,
'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-06.zim'
)
})