aeb6164ed2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
2.1 KiB
PHP
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');
|
|
});
|