41 lines
1.8 KiB
PHP
41 lines
1.8 KiB
PHP
|
|
<?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);
|
||
|
|
});
|