Files
portal/app/tests/Unit/Services/Project/ProjectRuleMessagesTest.php
T
Дмитрий be08239634 feat/projects: единый источник текстов правил сбора для клиента (Эпик 6.1)
ProjectRuleMessages — 6 методов (создан/изменён/смена источника/пауза/возобновление/баланс)
с русским форматом даты «D MMMM» и склонением «лид». Единственный источник текстов:
in-app уведомления (6.2) и баннеры (6.3) тянут отсюда, не дублируют строки. 6/6 тестов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 18:56:47 +03:00

52 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Project\ProjectRuleMessages;
use Carbon\CarbonImmutable;
/**
* Эпик 6 Task 6.1 — единый источник текстов правил сбора для клиента.
*/
function ruleMessages(): ProjectRuleMessages
{
return app(ProjectRuleMessages::class);
}
it('формирует текст «вступит в силу» с датой из appliesFrom', function (): void {
$msg = ruleMessages()->changesApplyFrom(CarbonImmutable::parse('2026-06-27 21:00', 'Europe/Moscow'));
expect($msg)->toContain('27 июня');
});
it('формат даты — род. падеж «D MMMM» по МСК', function (): void {
expect(ruleMessages()->formatDate(CarbonImmutable::parse('2026-01-01 12:00', 'Europe/Moscow')))->toBe('1 января');
expect(ruleMessages()->formatDate(CarbonImmutable::parse('2026-05-09 00:00', 'Europe/Moscow')))->toBe('9 мая');
expect(ruleMessages()->formatDate(CarbonImmutable::parse('2026-12-31 23:00', 'Europe/Moscow')))->toBe('31 декабря');
});
it('текст смены источника объясняет хвост старого источника', function (): void {
$msg = ruleMessages()->sourceChanged(CarbonImmutable::parse('2026-06-27 21:00', 'Europe/Moscow'));
expect($msg)->toContain('по старому источнику')
->and($msg)->toContain('27 июня')
->and($msg)->toContain('дальше — по новому');
});
it('текст паузы объясняет grace-хвост как норму', function (): void {
$msg = ruleMessages()->projectPaused(CarbonImmutable::parse('2026-06-27 21:00', 'Europe/Moscow'));
expect($msg)->toContain('18:00')
->and($msg)->toContain('это нормально');
});
it('текст создания/возобновления — когда пойдут первые лиды', function (): void {
$d = CarbonImmutable::parse('2026-06-26 21:00', 'Europe/Moscow');
expect(ruleMessages()->projectCreated($d))->toContain('Первые лиды пойдут с 26 июня');
expect(ruleMessages()->projectResumed($d))->toContain('Лиды пойдут с 26 июня');
});
it('текст баланса склоняет слово «лид» по числу', function (): void {
expect(ruleMessages()->balanceRunningOut(21))->toContain('21 лид.');
expect(ruleMessages()->balanceRunningOut(3))->toContain('3 лида');
expect(ruleMessages()->balanceRunningOut(11))->toContain('11 лидов');
expect(ruleMessages()->balanceRunningOut(105))->toContain('105 лидов');
});