mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 23:01:29 +00:00
101 lines
4.1 KiB
PHP
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);
|
|
}
|
|
}
|