28 lines
1.8 KiB
TypeScript
28 lines
1.8 KiB
TypeScript
import { expect, test } from 'bun:test';
|
|
import { checkReferenceReleases, type ReleaseObservation, type ReleaseSource } from '../src/lib/server/reference-release';
|
|
test('source metadata check uses only HEAD and detects independent changes with opaque ETags', async () => {
|
|
const previous: Partial<Record<ReleaseSource, ReleaseObservation>> = {};
|
|
let count = 0;
|
|
const fetcher = (async (_url: unknown, init?: RequestInit) => {
|
|
expect(init?.method).toBe('HEAD'); expect(init?.redirect).toBe('error'); count++;
|
|
return new Response(null, { headers: { etag: '"opaque-not-a-checksum"', 'content-length': '1000', 'last-modified': 'Fri, 18 Sep 2026 12:00:00 GMT' } });
|
|
}) as typeof fetch;
|
|
const first = await checkReferenceReleases({ fetch: fetcher });
|
|
for (const result of first) {
|
|
expect(result.status).toBe('checked');
|
|
if (result.status === 'checked') {
|
|
expect(result.observation.integrity).toBe('not_downloaded'); expect(result.observation.changed).toBe(true);
|
|
previous[result.source] = result.observation;
|
|
}
|
|
}
|
|
const second = await checkReferenceReleases({ fetch: fetcher, previous });
|
|
expect(count).toBe(4);
|
|
expect(second.every(r => r.status === 'checked' && !r.observation.changed)).toBe(true);
|
|
});
|
|
test('one metadata failure does not hide the other source, and 304 requires known metadata', async () => {
|
|
const results = await checkReferenceReleases({ fetch: (async (url: unknown) => String(url).includes('hoboleaks') ? new Response(null, { status: 503 }) : new Response(null, { headers: { etag: 'ref-v2' } })) as typeof fetch });
|
|
expect(results.map(r => r.status)).toEqual(['checked', 'failed']);
|
|
const unknown304 = await checkReferenceReleases({ fetch: (async (_url: unknown) => new Response(null, { status: 304 })) as typeof fetch });
|
|
expect(unknown304.every(r => r.status === 'failed')).toBe(true);
|
|
});
|