lib/nntp (XOVER client, Xref, GROUP), lib/headers (subjects, file keys, segments from overview lines; the yEnc path stays behind for phase 2), lib/release (identity, random names, now in lib), lib/files (aggregator, volume names), lib/rules (posting tools, owner by priority, release verdicts), lib/chunks (release chunk codec). Their unit tests came along; new ones for codec, rules and volumes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
import { test } from '@japa/runner'
|
|
import { fileKey, parseSubject } from '#lib/headers/index'
|
|
import { parseXrefGroups } from '#lib/nntp/index'
|
|
|
|
test.group('subject / parseSubject', () => {
|
|
test('parses file counter, filename and segment counter', ({ assert }) => {
|
|
assert.deepEqual(parseSubject('. - [09/51] - "obrMkrDeLmbhaouwYO34.part08.rar" yEnc (56/274)'), {
|
|
name: 'obrMkrDeLmbhaouwYO34.part08.rar',
|
|
segment: 56,
|
|
totalSegments: 274,
|
|
fileIndex: 9,
|
|
fileTotal: 51,
|
|
base: '. - [09/51] - "obrMkrDeLmbhaouwYO34.part08.rar" yEnc',
|
|
})
|
|
})
|
|
|
|
test('handles a file size after the segment counter', ({ assert }) => {
|
|
const subject = '[8/9] - "x.tar.zst.vol063+064.par2" yEnc (37/72) 51315352'
|
|
const parsed = parseSubject(subject)!
|
|
assert.equal(parsed.segment, 37)
|
|
assert.equal(parsed.totalSegments, 72)
|
|
assert.equal(parsed.base, '[8/9] - "x.tar.zst.vol063+064.par2" yEnc 51315352')
|
|
})
|
|
|
|
test('ignores counters inside the filename', ({ assert }) => {
|
|
const parsed = parseSubject('"Show (1/2) Special.mkv" yEnc (3/10)')!
|
|
assert.equal(parsed.name, 'Show (1/2) Special.mkv')
|
|
assert.equal(parsed.segment, 3)
|
|
assert.equal(parsed.totalSegments, 10)
|
|
})
|
|
|
|
test('the base is equal for all segments of one file', ({ assert }) => {
|
|
const a = parseSubject('[1/9] - "a.tar.zst" yEnc (253/1000) 716554110')!
|
|
const b = parseSubject('[1/9] - "a.tar.zst" yEnc (254/1000) 716554110')!
|
|
assert.equal(a.base, b.base)
|
|
})
|
|
|
|
test('returns null for obfuscated or invalid subjects', ({ assert }) => {
|
|
assert.isNull(parseSubject('GZFDJc0hB3Y0FwwAznkk'))
|
|
assert.isNull(parseSubject('"name.rar" yEnc'))
|
|
assert.isNull(parseSubject('"name.rar" yEnc (0/5)'))
|
|
assert.isNull(parseSubject('"name.rar" yEnc (6/5)'))
|
|
assert.isNull(parseSubject('"" yEnc (1/5)'))
|
|
})
|
|
})
|
|
|
|
test.group('subject / fileKey', () => {
|
|
test('differs per poster and per segment count, is stable otherwise', ({ assert }) => {
|
|
const key = fileKey('poster@a', '"x.rar" yEnc', 10)
|
|
assert.lengthOf(key, 40)
|
|
assert.equal(key, fileKey('poster@a', '"x.rar" yEnc', 10))
|
|
assert.notEqual(key, fileKey('poster@b', '"x.rar" yEnc', 10))
|
|
assert.notEqual(key, fileKey('poster@a', '"x.rar" yEnc', 11))
|
|
})
|
|
})
|
|
|
|
test.group('nntp / parseXrefGroups', () => {
|
|
test('extracts crossposted groups', ({ assert }) => {
|
|
assert.deepEqual(
|
|
parseXrefGroups('news.eweka.nl alt.binaries.nl:35801424104 alt.binaries.test:27275430913'),
|
|
['alt.binaries.nl', 'alt.binaries.test']
|
|
)
|
|
assert.deepEqual(parseXrefGroups(undefined), [])
|
|
})
|
|
})
|