c03e2b319b
- DadataBalanceProvider: эндпоинт profile/balance требует X-Secret вместе с Token (был HTTP 401 на проде при первом сборе); добавлен заголовок при наличии secret. - BalanceHealth: отрицательный баланс больше не даёт «−1 дн.» (кламп max(0, days)). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
26 lines
1.8 KiB
PHP
26 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Services\Dashboard\BalanceHealth;
|
|
|
|
it('красный при низком балансе ИЛИ малом числе дней', function () {
|
|
// balance 1000, spend 500/д → days=2 → red (дней<3)
|
|
expect(BalanceHealth::evaluate(1000, 500, 5000, 15000))->toMatchArray(['days_left' => 2, 'light' => 'red']);
|
|
// balance 4000 (< red_floor 5000), spend 100 → days 40, но баланс<red → red
|
|
expect(BalanceHealth::evaluate(4000, 100, 5000, 15000)['light'])->toBe('red');
|
|
// balance 12000 (< amber 15000), days большой → amber
|
|
expect(BalanceHealth::evaluate(12000, 100, 5000, 15000)['light'])->toBe('amber');
|
|
// balance 100000, spend 100 → days 1000, выше порогов → green
|
|
expect(BalanceHealth::evaluate(100000, 100, 5000, 15000)['light'])->toBe('green');
|
|
// нет данных о расходе → days_left null, светофор только по порогам
|
|
expect(BalanceHealth::evaluate(100000, null, 5000, 15000))->toMatchArray(['days_left' => null, 'light' => 'green']);
|
|
// граница: ровно 7 дней — НЕ amber (порог «< 7»); 6 дней — amber
|
|
expect(BalanceHealth::evaluate(700, 100, 0, 0)['light'])->toBe('green');
|
|
expect(BalanceHealth::evaluate(600, 100, 0, 0)['light'])->toBe('amber');
|
|
// отрицательный баланс (YC в минусе) → red
|
|
expect(BalanceHealth::evaluate(-540, null, 1000, 5000))->toMatchArray(['days_left' => null, 'light' => 'red']);
|
|
// отрицательный баланс + известный расход → days_left КЛАМПИТСЯ к 0 (не «−1 дн.»)
|
|
expect(BalanceHealth::evaluate(-591.76, 600, 1000, 5000))->toMatchArray(['days_left' => 0, 'light' => 'red']);
|
|
});
|