68 lines
3.4 KiB
TypeScript
68 lines
3.4 KiB
TypeScript
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<string, string> = {}) => ({
|
|
'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': '<part1of5.abc@nyuu>' }))
|
|
})
|
|
|
|
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)
|
|
})
|
|
})
|