Files
portal/app/tests/Feature/Bot/ClientFactsTest.php
T

97 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\PricingTier;
use App\Models\Project;
use App\Models\Tenant;
use App\Models\User;
use App\Services\Bot\ClientFacts;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
/** Две ступени: 1-я — 300 заявок по 50 ₽, 2-я — «всё свыше» по 40 ₽. */
function tiers(): void
{
PricingTier::factory()->create(['tier_no' => 1, 'leads_in_tier' => 300, 'price_per_lead_kopecks' => 5000]);
PricingTier::factory()->create(['tier_no' => 2, 'leads_in_tier' => null, 'price_per_lead_kopecks' => 4000]);
}
it('называет баланс, сколько это заявок и на сколько дней хватит', function () {
tiers();
$tenant = Tenant::factory()->create(['balance_rub' => '1000.00', 'delivered_in_month' => 0]);
Project::factory()->create(['tenant_id' => $tenant->id, 'is_active' => true, 'daily_limit_target' => 10]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
$card = app(ClientFacts::class)->card((int) $user->id);
// 1000 ₽ по 50 ₽ = 20 заявок; заказ 10/день → на 2 дня.
expect($card)->toContain('1 000 ₽')
->and($card)->toContain('20 заявок')
->and($card)->toContain('на 2 дня');
});
it('честно говорит, что тратить нечего, когда активных проектов нет', function () {
tiers();
$tenant = Tenant::factory()->create(['balance_rub' => '1000.00', 'delivered_in_month' => 0]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
expect(app(ClientFacts::class)->card((int) $user->id))
->toContain('активных проектов нет');
});
it('предупреждает о заморозке заказа из-за нулевого баланса', function () {
tiers();
$tenant = Tenant::factory()->create([
'balance_rub' => '0.00',
'delivered_in_month' => 0,
'frozen_by_balance_at' => now(),
]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
expect(app(ClientFacts::class)->card((int) $user->id))
->toContain('Заказ заморожен');
});
it('отдаёт null, когда такого пользователя нет', function () {
expect(app(ClientFacts::class)->card(999999))->toBeNull();
});
it('называет ступень, цену заявки и сколько заявок до следующей ступени', function () {
tiers();
$tenant = Tenant::factory()->create(['balance_rub' => '1000.00', 'delivered_in_month' => 180]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
$card = app(ClientFacts::class)->card((int) $user->id);
expect($card)->toContain('Ступень: 1-я, 50 ₽ за заявку')
->and($card)->toContain('получено в этом месяце 180')
->and($card)->toContain('до следующей ступени — 120');
});
it('на последней ступени говорит, что выше ступеней нет', function () {
tiers();
$tenant = Tenant::factory()->create(['balance_rub' => '1000.00', 'delivered_in_month' => 500]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
$card = app(ClientFacts::class)->card((int) $user->id);
expect($card)->toContain('Ступень: 2-я, 40 ₽ за заявку')
->and($card)->toContain('это последняя ступень');
});
it('склоняет слова по-русски: одна заявка, один день', function () {
tiers();
// 50 ₽ по цене 50 ₽ = ровно 1 заявка; заказ 1/день → 1 день.
$tenant = Tenant::factory()->create(['balance_rub' => '50.00', 'delivered_in_month' => 0]);
Project::factory()->create(['tenant_id' => $tenant->id, 'is_active' => true, 'daily_limit_target' => 1]);
$user = User::factory()->create(['tenant_id' => $tenant->id]);
$card = app(ClientFacts::class)->card((int) $user->id);
expect($card)->toContain('1 заявка')
->and($card)->toContain('на 1 день')
->and($card)->not->toContain('дня(дней)');
});