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); });