51 lines
2.8 KiB
JavaScript
51 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs/promises');
|
|
const os = require('node:os');
|
|
const path = require('node:path');
|
|
const { recordSource, recordFailure, ledgerRows } = require('../lib/source-ledger');
|
|
const { ScraperService } = require('../service');
|
|
|
|
test('a URL lead, a parsed catalog, and rights remain separate states', () => {
|
|
const ledger = {};
|
|
const item = { id: 'job', source: 'weebcentral', seriesId: 'series', url: 'https://weebcentral.com/series/series', title: 'Example' };
|
|
assert.equal(recordSource(ledger, item).catalog, 'unverified');
|
|
const row = recordSource(ledger, item, { catalogTotal: 0, availability: { reason: 'unrecognized-labels', coverage: 'unknown' },
|
|
observedAt: '2026-10-13T12:00:00Z' });
|
|
assert.equal(row.catalog, 'found');
|
|
assert.equal(row.adapter, 'unsupported-labels');
|
|
assert.equal(row.rights, 'unverified');
|
|
assert.equal(row.hostedCount, 0);
|
|
recordFailure(ledger, item, { kind: 'adapter', message: 'Parser could not read labels' });
|
|
assert.equal(ledger['weebcentral:series'].lastFailure.kind, 'adapter');
|
|
assert.equal(ledgerRows(ledger).length, 1);
|
|
});
|
|
|
|
test('a catalog observation survives completed queue cleanup and service restart', async t => {
|
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), 'mc-source-ledger-'));
|
|
const dataRoot = path.join(root, 'data'), libraryRoot = path.join(root, 'library');
|
|
await fs.mkdir(dataRoot);
|
|
await fs.writeFile(path.join(dataRoot, 'queue.json'), JSON.stringify({ paused: true, queue: [],
|
|
settings: { autoUpdateEnabled: false } }));
|
|
const adapter = { id: 'fixture', label: 'Fixture', match: url => ({ source: 'fixture', id: url.split('/').at(-1), url, title: 'Example' }) };
|
|
const options = { dataRoot, libraryRoot, adapters: [adapter], adapterFor: url => ({ adapter, info: adapter.match(url) }) };
|
|
let service = await new ScraperService(options).init();
|
|
t.after(async () => { await service.close(); await fs.rm(root, { recursive: true, force: true }); });
|
|
const item = await service.enqueue({ url: 'https://example.test/series', inspect: true });
|
|
assert.equal(service.state.sourceLedger['fixture:series'].catalog, 'unverified');
|
|
await service.recordCatalog(item, { title: 'Canonical Example', chapters: [{ id: 'one' }],
|
|
availability: { language: 'en', coverage: 'unknown' } });
|
|
item.kind = 'download'; item.status = 'complete';
|
|
await service.clearCompleted();
|
|
await service.close();
|
|
service = await new ScraperService(options).init();
|
|
const [row] = (await service.publicState()).sourceLedger;
|
|
assert.equal(service.state.queue.length, 0);
|
|
assert.equal(row.sourceTitle, 'Canonical Example');
|
|
assert.equal(row.adapter, 'compatible');
|
|
assert.equal(row.hostedCount, 1);
|
|
assert.equal(row.rights, 'unverified');
|
|
});
|