Files
portal/app/tests/Feature/Services/SnapshotHelperTimeOfDayTest.php
T

55 lines
2.5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Models\Project;
use App\Models\SupplierProject;
use App\Models\Tenant;
use App\Services\LeadRouter;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Tests\Concerns\SharesSupplierPdo;
/**
* Регрессия на мигающие тесты доставки лидов.
*
* Роутер выбирает дату слепка по часам: после 21:00 МСК — завтра, до — сегодня
* (LeadRouter::activeSnapshotDate, вечерний переворот заливки). Помощник
* createRoutingSnapshotFromProject раньше клал снимок ВСЕГДА на сегодня, поэтому
* после 21:00 МСК роутер искал завтрашний снимок, не находил и возвращал 0 —
* весь пласт тестов доставки падал только по вечерам. Здесь фиксируем инвариант:
* помощник обязан класть снимок на ту же дату, что спросит роутер, в любой час.
*/
uses(DatabaseTransactions::class);
uses(SharesSupplierPdo::class);
beforeEach(function (): void {
DB::statement("SELECT set_config('app.current_tenant_id', '0', true)");
});
afterEach(function (): void {
Carbon\Carbon::setTestNow();
});
it('находит проект по слепку и после 21:00 МСК (когда роутер смотрит на завтра)', function (): void {
// 22:00 МСК — роутер уже ищет завтрашний слепок. Именно этот час валил 48 тестов.
Carbon\Carbon::setTestNow(Carbon\Carbon::parse('2026-07-21 22:00', 'Europe/Moscow'));
$tenant = Tenant::factory()->create(['balance_leads' => 100, 'balance_rub' => '1000.00']);
$sp = SupplierProject::query()->create([
'platform' => 'B1', 'signal_type' => 'site', 'unique_key' => 'r.ru',
'subject_code' => 82, 'current_limit' => 0, 'sync_status' => 'ok',
]);
$project = Project::factory()->create([
'tenant_id' => $tenant->id, 'is_active' => true,
'daily_limit_target' => 10, 'delivered_today' => 0, 'delivery_days_mask' => 127,
]);
linkProjectToSupplier($project, $sp);
createRoutingSnapshotFromProject($project);
$matched = app(LeadRouter::class)->matchEligibleProjects($sp);
expect($matched)->toHaveCount(1)
->and($matched->first()->id)->toBe($project->id);
});