37 lines
1.5 KiB
PHP
37 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\SalesAdAudienceFirm;
|
|
use App\Models\SalesAdAudiencePlatform;
|
|
use App\Services\Sales\PlatformWarmingDecider;
|
|
use Carbon\CarbonImmutable;
|
|
use Tests\TestCase;
|
|
|
|
// Модели вне контейнера Laravel не могут выставить datetime-cast атрибут
|
|
// (setAttribute → fromDateTime → getConnection() падает без резолвера
|
|
// соединений — резолвер регистрируется только при загрузке приложения).
|
|
// Файл сам просит контейнер, не трогая общий tests/Pest.php.
|
|
uses(TestCase::class);
|
|
|
|
it('одна фирма: на площадке с большим сроком active, с меньшим — stopped(ready_for_manager)', function () {
|
|
$now = CarbonImmutable::parse('2026-07-22 12:00:00');
|
|
|
|
$firm = new SalesAdAudienceFirm(['firm_name' => 'X']);
|
|
$firm->warmup_started_at = \Illuminate\Support\Carbon::parse('2026-07-18 12:00:00'); // 4 дня назад
|
|
|
|
$decider = new PlatformWarmingDecider();
|
|
|
|
$long = new SalesAdAudiencePlatform(['platform' => 'yandex']);
|
|
$long->warmup_days = 5;
|
|
|
|
$short = new SalesAdAudiencePlatform(['platform' => 'vk']);
|
|
$short->warmup_days = 3;
|
|
|
|
expect($decider->decide($firm, $long, null, $now)['state'])->toBe('active');
|
|
|
|
$shortDecision = $decider->decide($firm, $short, null, $now);
|
|
expect($shortDecision['state'])->toBe('stopped');
|
|
expect($shortDecision['reason'])->toBe('ready_for_manager');
|
|
});
|