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

82 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Bot\AnswerGuard;
/**
* Сторож ответа (финальное сравнение моделей 12.07.2026). Умная модель звучит живо, но
* срывается: обещает «Нет, не оштрафуют», «мы гарантируем», выдумывает цены. Промпт её
* не держит — держим кодом: запрещённое вырезаем ДО отправки клиенту.
*/
it('вырезает юридические гарантии', function () {
$guard = app(AnswerGuard::class);
$answer = $guard->clean(
'Человек дал согласие оператору. Нет, вас не оштрафуют. Пишите на support@liderra.ru.',
context: 'Человек дал согласие оператору.'
);
expect($answer)->not->toContain('не оштрафуют')
->and($answer)->toContain('Человек дал согласие оператору')
->and($answer)->toContain('support@liderra.ru');
});
it('вырезает «мы гарантируем» и «не нарушаем закон»', function () {
$guard = app(AnswerGuard::class);
expect($guard->clean('Мы гарантируем, что человек живой. Контакт свежий.', context: 'Контакт свежий.'))
->not->toContain('гарантируем')
->and($guard->clean('Нет, мы не нарушаем закон. Данные передают операторы.', context: 'Данные передают операторы.'))
->not->toContain('не нарушаем');
});
it('вырезает цену, которой нет в наших статьях', function () {
// Живая выдумка модели: «при 100+ заявках цена 450 ₽». Такого порога у нас нет.
$guard = app(AnswerGuard::class);
$answer = $guard->clean(
'Цена падает с объёмом. При 100 заявках она станет 450 ₽. Точную цену видно на плитке баланса.',
context: 'Цена зависит от объёма: ступени от 500 ₽. Точную цену видно на плитке баланса.'
);
expect($answer)->not->toContain('450')
->and($answer)->toContain('Точную цену видно на плитке баланса');
});
it('цену ИЗ статьи не трогает', function () {
$guard = app(AnswerGuard::class);
$answer = $guard->clean(
'Подбор конкурентов стоит 300 ₽.',
context: 'Цена подбора — 300 ₽ за запуск.'
);
expect($answer)->toContain('300');
});
it('если после чистки ничего не осталось — отдаёт пусто, бот позовёт специалиста', function () {
$guard = app(AnswerGuard::class);
expect($guard->clean('Нет, вас не оштрафуют.', context: 'Что-то про заявки.'))->toBe('');
});
it('режет количество заявок, которого нет в материалах', function () {
$guard = new App\Services\Bot\AnswerGuard;
$context = 'ДАННЫЕ ЭТОГО КЛИЕНТА: Заявки: сегодня 12, вчера 18.';
$text = 'Сегодня пришло 12 заявок. Завтра придёт 30 заявок.';
$clean = $guard->clean($text, $context);
expect($clean)->toContain('12 заявок')
->and($clean)->not->toContain('30 заявок');
});
it('пропускает число дней, взятое из карточки фактов', function () {
$guard = new App\Services\Bot\AnswerGuard;
$context = 'Баланс: 3 400 ₽ ≈ 40 заявок, при текущем заказе хватит примерно на 5 дней.';
expect($guard->clean('Денег хватит примерно на 5 дней.', $context))
->toContain('на 5 дней');
});