Files
newznab-tmux-NNTmux/tests/Unit/AdditionalProcessing/AdditionalWorkPlannerTest.php
T
2026-08-11 10:43:22 +02:00

101 lines
4.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\AdditionalProcessing;
use App\Services\AdditionalProcessing\AdditionalWorkPlanner;
use App\Services\AdditionalProcessing\DTO\ArchiveCandidate;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
class AdditionalWorkPlannerTest extends TestCase
{
use CreatesProcessingConfiguration;
#[Test]
public function it_builds_one_ordered_plan_for_direct_and_archive_candidates(): void
{
$planner = new AdditionalWorkPlanner($this->makeConfig([
'processThumbnails' => true,
'processJPGSample' => true,
'processMediaInfo' => true,
'processAudioInfo' => true,
]));
$plan = $planner->plan([
['title' => 'release.part02.rar', 'segments' => ['<part-2>', '<shared>']],
['title' => '"sample.mkv" yEnc', 'segments' => ['<sample>', '<sample-2>']],
['title' => '"cover.jpg" yEnc', 'segments' => ['<cover>']],
['title' => '"track.FLAC" yEnc', 'segments' => ['<audio>']],
['title' => 'release.part01.rar', 'segments' => ['<part-1>', '<shared>', '<part-1>']],
], 'alt.binaries.test');
$this->assertSame(['<sample>', '<sample-2>'], $plan->sampleMessageIds);
$this->assertSame(['<cover>'], $plan->jpgMessageIds);
$this->assertSame('<sample>', $plan->mediaInfoMessageId);
$this->assertSame('<audio>', $plan->audioInfoMessageId);
$this->assertSame('FLAC', $plan->audioInfoExtension);
$this->assertTrue($plan->hasCompressedFile());
$this->assertSame(
['release.part02.rar', 'release.part01.rar'],
array_map(static fn (ArchiveCandidate $candidate): string => $candidate->title, $plan->archiveCandidates),
);
$this->assertFalse($plan->archiveCandidates[0]->likelyFirstVolume);
$this->assertTrue($plan->archiveCandidates[1]->likelyFirstVolume);
$this->assertSame(
['release.part01.rar', 'release.part02.rar'],
array_map(static fn (ArchiveCandidate $candidate): string => $candidate->title, $plan->prioritizedArchiveCandidates()),
);
$this->assertSame(
['release.part01.rar', 'release.part02.rar'],
array_map(static fn (ArchiveCandidate $candidate): string => $candidate->title, $plan->orderedArchiveCandidates(true)),
);
$this->assertSame(3, $plan->duplicateMessageIdCount);
$this->assertSame([], $plan->unsupportedReasons);
}
#[Test]
public function it_reports_book_floods_and_releases_without_supported_candidates(): void
{
$planner = new AdditionalWorkPlanner($this->makeConfig());
$contents = array_fill(0, 81, [
'title' => 'book.epub',
'segments' => ['<book>'],
]);
$plan = $planner->plan($contents, 'alt.binaries.books');
$this->assertSame(81, $plan->bookFileCount);
$this->assertTrue($plan->bookFlood);
$this->assertSame(['book-flood', 'no-supported-candidates'], $plan->unsupportedReasons);
}
#[Test]
public function it_selects_jpeg_png_and_webp_image_candidates(): void
{
$planner = new AdditionalWorkPlanner($this->makeConfig(['processJPGSample' => true]));
foreach (['cover.jpg', 'cover.png', 'cover.webp'] as $index => $filename) {
$messageId = '<image-'.$index.'>';
$plan = $planner->plan([
['title' => '"'.$filename.'" yEnc', 'segments' => [$messageId]],
], 'alt.binaries.test');
$this->assertSame([$messageId], $plan->jpgMessageIds, $filename.' should be selected');
}
}
#[Test]
public function it_keeps_a_usable_last_volume_when_the_first_volume_is_missing(): void
{
$planner = new AdditionalWorkPlanner($this->makeConfig());
$plan = $planner->plan([
['title' => 'release.part99.rar', 'segments' => ['<last-volume>']],
], 'alt.binaries.test');
$this->assertFalse($plan->archiveCandidates[0]->likelyFirstVolume);
$this->assertSame(['<last-volume>'], $plan->orderedArchiveCandidates(true)[0]->messageIds);
}
}