import { test } from '@japa/runner' import db from '@adonisjs/lucid/services/db' import testUtils from '@adonisjs/core/services/test_utils' import DeferredService, { deferredName, isDeferred } from '#services/DeferredService' const header = (id: string, name: string, extra: Record = {}) => ({ 'message-id': `<${id.padEnd(32, '0')}@ngPost>`, 'subject': `"${name}" yEnc`, 'from': 'pKeUimunULJZz@ngPost.com', ':bytes': '740000', 'date': 'Mon, 28 Sep 2026 10:00:00 +0000', ...extra, }) test.group('DeferredService', (group) => { group.each.setup(() => testUtils.db().withGlobalTransaction()) test('recognises deferred uploads by message-id and a quoted name', ({ assert }) => { assert.equal(deferredName('[026/109] "HFIX7fbQAuH4PZsvGMw7Pz.part025.rar" yEnc'), 'HFIX7fbQAuH4PZsvGMw7Pz.part025.rar') assert.isNull(deferredName('no quotes here')) assert.isTrue(isDeferred(header('ab', 'x.part1.rar'))) assert.isFalse(isDeferred({ ...header('ab', 'x'), 'message-id': '' })) }) test('articles without a name in the subject are kept as article ranges', async ({ assert }) => { const hex = (id: string, n: number) => ({ articleNumber: n, header: { ...header(id, 'x'), subject: id.padEnd(32, 'f') } }) const files = await DeferredService.record('alt.binaries.test', [hex('a', 100), hex('b', 180), hex('c', 90_000), hex('d', 150)]) assert.equal(files, 0) const ranges = await db.from('deferred_ranges').orderBy('first_article') assert.deepEqual( ranges.map((r) => [Number(r.first_article), Number(r.last_article), r.article_count]), [[100, 180, 3], [90_000, 90_000, 1]] ) assert.lengthOf(await db.from('deferred_files'), 0) }) test('aggregates articles per file, across batches, counting only the first group', async ({ assert }) => { await DeferredService.record('alt.binaries.test', [ { articleNumber: 105, header: header('b', 'a.part1.rar') }, { articleNumber: 101, header: header('a', 'a.part1.rar') }, { articleNumber: 102, header: header('c', 'b.par2', { ':bytes': '1000' }) }, ]) await DeferredService.record('alt.binaries.test', [{ articleNumber: 110, header: header('d', 'a.part1.rar') }]) // A crosspost seen in another group doesn't count twice. await DeferredService.record('alt.binaries.misc', [{ articleNumber: 9, header: header('a', 'a.part1.rar') }]) const rows = await db.from('deferred_files').orderBy('name') assert.lengthOf(rows, 2) const [a, b] = rows assert.include(a, { name: 'a.part1.rar', group_name: 'alt.binaries.test', article_count: 3, status: 'pending' }) assert.equal(Number(a.first_article), 101) assert.equal(Number(a.last_article), 110) assert.equal(a.first_message_id, 'a'.padEnd(32, '0') + '@ngPost') assert.equal(Number(a.bytes), 3 * 740000) assert.include(b, { name: 'b.par2', article_count: 1 }) }) test('only claims files that stopped growing', async ({ assert }) => { await DeferredService.record('alt.binaries.test', [{ articleNumber: 1, header: header('a', 'new.rar') }]) assert.lengthOf(await DeferredService.claim(10), 0) await db.from('deferred_files').update({ last_seen_at: new Date(Date.now() - 24 * 60 * 60 * 1000) }) const claimed = await DeferredService.claim(10) assert.lengthOf(claimed, 1) assert.equal(claimed[0].status, 'processing') assert.lengthOf(await DeferredService.claim(10), 0) }) })