Files
SkinbaseNova/tests/Feature/Ranking/RankBuildListsDispatchTest.php
2026-04-18 17:02:56 +02:00

86 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Feature\Ranking;
use App\Jobs\RankBuildListsJob;
use App\Jobs\RankBuildScopeListsJob;
use App\Models\ContentType;
use App\Models\RankList;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;
class RankBuildListsDispatchTest extends TestCase
{
use RefreshDatabase;
public function test_dispatcher_fans_out_only_active_category_scopes(): void
{
Queue::fake();
$contentType = ContentType::create([
'name' => 'Wallpapers',
'slug' => 'wallpapers',
]);
$activeCategoryIds = [
(int) $contentType->categories()->create([
'name' => 'Abstract',
'slug' => 'abstract',
'is_active' => true,
])->id,
(int) $contentType->categories()->create([
'name' => 'Nature',
'slug' => 'nature',
'is_active' => true,
])->id,
];
$contentType->categories()->create([
'name' => 'Hidden',
'slug' => 'hidden',
'is_active' => false,
]);
(new RankBuildListsJob)->handle();
Queue::assertPushed(RankBuildScopeListsJob::class, 4);
Queue::assertPushed(RankBuildScopeListsJob::class, fn (RankBuildScopeListsJob $job) => $job->scopeType === 'global' && $job->scopeId === 0);
Queue::assertPushed(RankBuildScopeListsJob::class, fn (RankBuildScopeListsJob $job) => $job->scopeType === 'content_type' && $job->scopeId === (int) $contentType->id);
foreach ($activeCategoryIds as $categoryId) {
Queue::assertPushed(RankBuildScopeListsJob::class, fn (RankBuildScopeListsJob $job) => $job->scopeType === 'category' && $job->scopeId === $categoryId);
}
Queue::assertNotPushed(RankBuildScopeListsJob::class, fn (RankBuildScopeListsJob $job) => $job->scopeType === 'category' && ! in_array($job->scopeId, $activeCategoryIds, true));
}
public function test_scope_job_upserts_rows_even_when_scope_has_no_candidates(): void
{
$contentType = ContentType::create([
'name' => 'Photography',
'slug' => 'photography',
]);
$category = $contentType->categories()->create([
'name' => 'Macro',
'slug' => 'macro',
'is_active' => true,
]);
app()->call([new RankBuildScopeListsJob('category', (int) $category->id), 'handle']);
$rows = RankList::query()
->where('scope_type', 'category')
->where('scope_id', $category->id)
->where('model_version', config('ranking.model_version'))
->orderBy('list_type')
->get();
$this->assertCount(3, $rows);
$this->assertSame(['best', 'new_hot', 'trending'], $rows->pluck('list_type')->all());
$this->assertTrue($rows->every(fn (RankList $row) => $row->artwork_ids === []));
}
}