Files
portal/app/tests/Unit/Autopodbor/AutopodborBudgetGateTest.php
T

50 lines
2.1 KiB
PHP

<?php
use App\Models\PricingTier;
use App\Services\Autopodbor\AutopodborBudgetGate;
use Illuminate\Database\Eloquent\Collection;
function tiersFixture(): Collection
{
return new Collection([
new PricingTier([
'tier_no' => 1,
'leads_in_tier' => null,
'price_per_lead_kopecks' => 6000,
'is_active' => true,
]),
]);
}
it('разрешает пакет, когда денег хватает и пакету, и резерву проектов', function () {
$gate = new AutopodborBudgetGate;
$d = $gate->evaluateBatch('1000.00', 0, 10, tiersFixture(), 20, '10.00');
expect($d->allowed)->toBeTrue();
expect($d->maxAffordable)->toBeGreaterThanOrEqual(20);
});
it('запрещает пакет и считает M, когда пакет роняет проекты', function () {
$gate = new AutopodborBudgetGate;
// баланс 650; проектам нужно 10*60=600; свободно 50 → влезает 5 по 10.
$d = $gate->evaluateBatch('650.00', 0, 10, tiersFixture(), 20, '10.00');
expect($d->allowed)->toBeFalse();
expect($d->maxAffordable)->toBe(5);
expect((float) $d->topupRub)->toBeGreaterThan(0.0);
});
it('committed=0 (нет активных проектов) — весь баланс доступен пакету', function () {
$gate = new AutopodborBudgetGate;
$d = $gate->evaluateBatch('100.00', 0, 0, tiersFixture(), 10, '10.00');
expect($d->allowed)->toBeTrue();
expect($d->maxAffordable)->toBe(10);
});
it('price=0 (бесплатный сбор) — пакет разрешён независимо от баланса и резерва', function () {
$gate = new AutopodborBudgetGate;
// Нулевой баланс и активные проекты в резерве — но цена сбора 0, списывать нечего.
$d = $gate->evaluateBatch('0.00', 0, 10, tiersFixture(), 25, '0.00');
expect($d->allowed)->toBeTrue();
expect($d->maxAffordable)->toBe(25);
expect($d->topupRub)->toBe('0.00');
});