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>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
<?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 лидов');
|
||||
});
|
||||
Reference in New Issue
Block a user