Files
portal/app/tests/Feature/Autopodbor/AutopodborQueueThrottleTest.php
T

41 lines
1.8 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Jobs\Autopodbor\RunAutopodborResolveJob;
use App\Jobs\Autopodbor\RunAutopodborSearchJob;
use App\Jobs\Autopodbor\RunAutopodborStudyJob;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Queue;
// Масштаб: лимиты внешних сервисов — на КЛЮЧ (общий на всех клиентов). Джобы автоподбора идут на
// ВЫДЕЛЕННУЮ очередь autopodbor — число её воркеров = глобальный потолок одновременных подборов.
// Плюс защита от нахлёста (WithoutOverlapping) на случай ретрая/повторного dispatch.
it('поиск уходит на выделенную очередь autopodbor', function () {
Queue::fake();
RunAutopodborSearchJob::dispatch(123);
Queue::assertPushedOn('autopodbor', RunAutopodborSearchJob::class);
});
it('поиск защищён от нахлёста — middleware WithoutOverlapping по runId', function () {
$mw = (new RunAutopodborSearchJob(123))->middleware();
expect($mw)->toHaveCount(1)
->and($mw[0])->toBeInstanceOf(WithoutOverlapping::class);
});
it('шаг 2 (изучение) и резолв — на той же очереди и защищены от нахлёста', function () {
Queue::fake();
RunAutopodborStudyJob::dispatch(7);
RunAutopodborResolveJob::dispatch(8);
Queue::assertPushedOn('autopodbor', RunAutopodborStudyJob::class);
Queue::assertPushedOn('autopodbor', RunAutopodborResolveJob::class);
expect((new RunAutopodborStudyJob(7))->middleware()[0])->toBeInstanceOf(WithoutOverlapping::class)
->and((new RunAutopodborResolveJob(8))->middleware()[0])->toBeInstanceOf(WithoutOverlapping::class);
});