2026-07-01 09:18:09 +03:00
|
|
|
<?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;
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
// Масштаб: два шага разнесены по РАЗНЫМ очередям (разные процессы-воркеры), чтобы не толкались.
|
|
|
|
|
// Шаг 1 «собрать поле» с ИИ (поиск + резолв по имени) → очередь autopodbor-find.
|
|
|
|
|
// Шаг 2 «изучение / дайте источники» — тупой слой → очередь autopodbor-study.
|
|
|
|
|
// Так быстрый шаг 2 одного клиента не стоит за тяжёлым шагом 1 другого.
|
2026-07-01 09:18:09 +03:00
|
|
|
// Плюс защита от нахлёста (WithoutOverlapping) на случай ретрая/повторного dispatch.
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
it('шаг 1 (поиск) уходит на очередь autopodbor-find', function () {
|
2026-07-01 09:18:09 +03:00
|
|
|
Queue::fake();
|
|
|
|
|
|
|
|
|
|
RunAutopodborSearchJob::dispatch(123);
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
Queue::assertPushedOn('autopodbor-find', RunAutopodborSearchJob::class);
|
2026-07-01 09:18:09 +03:00
|
|
|
});
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
it('резолв по имени — тоже шаг 1, на очереди autopodbor-find', function () {
|
|
|
|
|
Queue::fake();
|
|
|
|
|
|
|
|
|
|
RunAutopodborResolveJob::dispatch(8);
|
2026-07-01 09:18:09 +03:00
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
Queue::assertPushedOn('autopodbor-find', RunAutopodborResolveJob::class);
|
2026-07-01 09:18:09 +03:00
|
|
|
});
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
it('шаг 2 (изучение) уходит на ОТДЕЛЬНУЮ очередь autopodbor-study', function () {
|
2026-07-01 09:18:09 +03:00
|
|
|
Queue::fake();
|
2026-07-05 15:28:51 +03:00
|
|
|
|
2026-07-01 09:18:09 +03:00
|
|
|
RunAutopodborStudyJob::dispatch(7);
|
|
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
Queue::assertPushedOn('autopodbor-study', RunAutopodborStudyJob::class);
|
|
|
|
|
});
|
2026-07-01 09:18:09 +03:00
|
|
|
|
2026-07-05 15:28:51 +03:00
|
|
|
it('все три задания защищены от нахлёста — middleware WithoutOverlapping по runId', function () {
|
|
|
|
|
expect((new RunAutopodborSearchJob(123))->middleware())->toHaveCount(1)
|
|
|
|
|
->and((new RunAutopodborSearchJob(123))->middleware()[0])->toBeInstanceOf(WithoutOverlapping::class)
|
|
|
|
|
->and((new RunAutopodborStudyJob(7))->middleware()[0])->toBeInstanceOf(WithoutOverlapping::class)
|
2026-07-01 09:18:09 +03:00
|
|
|
->and((new RunAutopodborResolveJob(8))->middleware()[0])->toBeInstanceOf(WithoutOverlapping::class);
|
|
|
|
|
});
|