Files
portal/app/tests/Feature/ClientTg/TariffServiceTest.php
T
Дмитрий 298afb835a feat(телеграм-модуль): ядро клиентского модуля Telegram-рекламы — таблицы, модели, цена, аудитория, кошелёк
Сессия 1 плана docs/superpowers/plans/2026-07-27-client-telegram-ads-module.md.
Бэкенд-ядро — зеркало готового СМС-модуля. Робота ещё нет — он в Сессии 2.

- 8 таблиц client_tg_* с RLS tenant_isolation и GRANT crm_app_user; справочные
  tariffs/settings без RLS с guarded-GRANT. rls-reviewer PASS 8 из 8.
- 7 моделей ClientTg + связи campaign->phones.
- Ступенчатая цена TelegramTariffService — ₽ за показ по объёму; тариф = потолок,
  точную стоимость считает МТС.
- Сборка аудитории TelegramAudienceService — сделки за период / своя база / свой
  список, нормализация телефона, стоп-лист и дедуп; отдаёт кандидатов, реальный
  охват узнаёт робот после загрузки в МТС.
- Канал кошелька telegram: перенесён общий AdWallet со свежей версии портала
  — модели, сервис, миграции; списание и заморозка по каналу telegram под тестами,
  charge не бросает и не уходит в минус, нехватка средств ловится freeze до списания.

Проверки: 26 из 26 Pest зелёные, larastan 0, gitleaks чисто.
db/CHANGELOG_schema.md v8.86 — номер предварительный, ветка отстаёт от main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 16:15:17 +03:00

35 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\ClientTg\TelegramTariffService;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
it('ступень выбирается по объёму показов (границы)', function () {
$p = app(TelegramTariffService::class);
expect($p->pricePerImpressionRub(0))->toBe('0.45') // volume floored to >=1
->and($p->pricePerImpressionRub(999))->toBe('0.45')
->and($p->pricePerImpressionRub(1000))->toBe('0.42')
->and($p->pricePerImpressionRub(4999))->toBe('0.42')
->and($p->pricePerImpressionRub(5000))->toBe('0.40')
->and($p->pricePerImpressionRub(9999))->toBe('0.40')
->and($p->pricePerImpressionRub(10000))->toBe('0.38')
->and($p->pricePerImpressionRub(49999))->toBe('0.38')
->and($p->pricePerImpressionRub(50000))->toBe('0.36')
->and($p->pricePerImpressionRub(500000))->toBe('0.36');
});
it('смета = объём показов × цена ступени', function () {
$p = app(TelegramTariffService::class);
// 500 показов → ступень 0.45 → 225.00
expect($p->estimateRub(500))->toBe('225.00')
// 1000 показов → ступень 0.42 → 420.00
->and($p->estimateRub(1000))->toBe('420.00')
// 5000 показов → ступень 0.40 → 2000.00
->and($p->estimateRub(5000))->toBe('2000.00')
// 0 показов → 0.00
->and($p->estimateRub(0))->toBe('0.00');
});