Files
ArtPlayer/refactor/scripts/version-registry.test.mjs

52 lines
2.9 KiB
JavaScript

import assert from 'node:assert/strict'
// eslint-disable-next-line test/no-import-node-test -- Release version reuse and registry failure boundaries.
import test from 'node:test'
import { observePackage, versionObservation } from './version-registry.mjs'
test('Registry version planning rejects active and unpublished version reuse', () => {
assert.equal(versionObservation(200, { name: 'test', versions: { '2.0.0': {} } }, '2.0.0').targetState, 'published')
const unpublished = versionObservation(200, { name: 'test', time: { unpublished: { versions: ['2.0.0'] } } }, '2.0.0')
assert.equal(unpublished.targetState, 'previously-used')
assert.deepEqual(unpublished.majorConflicts, ['2.0.0'])
assert.equal(versionObservation(200, { name: 'test', versions: {}, time: { '2.0.0': '2025-01-01' } }, '2.0.0').targetState, 'previously-used')
})
test('A different stable release in the target major prevents silently using an older major plan', () => {
const value = versionObservation(200, { name: 'test', versions: { '2.1.0': {}, '3.0.0': {}, '2.0.0-rc.1': {} } }, '2.0.0')
assert.equal(value.targetState, 'not-observed')
assert.deepEqual(value.majorConflicts, ['2.1.0', '3.0.0'])
assert.deepEqual(value.prereleasesInTargetMajor, ['2.0.0-rc.1'])
})
test('Missing names and empty version histories never establish ownership or reservation', () => {
const missing = versionObservation(404, { error: 'Not found' }, '2.0.0')
assert.equal(missing.nameState, 'not-found')
assert.equal(missing.targetState, 'not-observed')
assert.equal(missing.ownershipVerified, false)
assert.equal(versionObservation(200, { name: 'test', versions: {} }, '2.0.0').ownershipVerified, false)
})
test('Registry authentication, throttling, server failures and malformed responses are not availability evidence', () => {
for (const status of [401, 403, 429, 500])
assert.throws(() => versionObservation(status, { error: 'Not found' }, '2.0.0'), /not an absence/)
for (const data of [null, [], {}, { name: 'test' }])
assert.throws(() => versionObservation(200, data, '2.0.0'))
assert.throws(() => versionObservation(404, { error: 'Forbidden' }, '2.0.0'))
})
test('Live probe uses only the public registry and verifies response identity', async () => {
const urls = []
const fetcher = async (url, options) => {
urls.push(url)
assert.equal(options.redirect, 'error')
assert.equal(options.headers.authorization, undefined)
return new Response(JSON.stringify({ name: 'artplayer', versions: { '5.4.0': {} } }), { status: 200 })
}
const result = await observePackage('artplayer', '6.0.0', fetcher)
assert.deepEqual(urls, ['https://registry.npmjs.org/artplayer'])
assert.equal(result.targetState, 'not-observed')
assert.match(result.responseSha256, /^[a-f0-9]{64}$/)
await assert.rejects(observePackage('../private', '6.0.0', fetcher), /Unexpected package/)
await assert.rejects(observePackage('other', '6.0.0', fetcher), /different package/)
})