d07fec8c0b
Портал писал «кабинет показал статус словом, которого разборщик не знает» — и самого слова в записи не было: readCampaignStats отдавал наверх только разобранный статус, а сырой текст ряда выбрасывал. 08.08.2026 из-за этого слово потерялось трижды подряд, и узнать его удалось единственным способом — сходив в кабинет глазами. Сборка ответа вынесена в чистую otvetPoRyadu: сам поход в кабинет тестом не поймать, а сборку — можно. Текст ряда обрезается до 300 знаков, в журнал не должен уехать роман. Заодно RobotResult читает признак stopped — он понадобится режиму остановки. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
69 lines
2.3 KiB
PHP
69 lines
2.3 KiB
PHP
<?php
|
|
|
|
use App\Services\ClientTg\RobotResult;
|
|
|
|
it('пробрасывает строковый actualCostRub из JSON робота', function () {
|
|
$r = RobotResult::fromRobotJson([
|
|
'ok' => true,
|
|
'matched' => 437,
|
|
'actualCostRub' => '201.60',
|
|
]);
|
|
|
|
expect($r->actualCostRub)->toBe('201.60');
|
|
expect($r->ok)->toBeTrue();
|
|
});
|
|
|
|
it('приводит числовой actualCostRub к строке', function () {
|
|
$r = RobotResult::fromRobotJson([
|
|
'ok' => true,
|
|
'actualCostRub' => 201.6,
|
|
]);
|
|
|
|
expect($r->actualCostRub)->toBe('201.6');
|
|
expect($r->actualCostRub)->not->toBeNull();
|
|
});
|
|
|
|
it('без поля actualCostRub оставляет null и не ломает остальные поля', function () {
|
|
$r = RobotResult::fromRobotJson([
|
|
'ok' => true,
|
|
'matched' => 12,
|
|
'campaignId' => '555',
|
|
]);
|
|
|
|
expect($r->actualCostRub)->toBeNull();
|
|
expect($r->ok)->toBeTrue();
|
|
expect($r->matched)->toBe(12);
|
|
expect($r->campaignId)->toBe('555');
|
|
});
|
|
|
|
it('failed() не выставляет actualCostRub', function () {
|
|
$r = RobotResult::failed('таймаут');
|
|
|
|
expect($r->actualCostRub)->toBeNull();
|
|
expect($r->ok)->toBeFalse();
|
|
expect($r->reason)->toBe('таймаут');
|
|
});
|
|
|
|
it('конструктор без actualCostRub даёт null по умолчанию', function () {
|
|
$r = new RobotResult(ok: true);
|
|
|
|
expect($r->actualCostRub)->toBeNull();
|
|
});
|
|
|
|
test('сырое слово кабинета доезжает до портала', function () {
|
|
// 🔴 Без него запись «кабинет показал незнакомое слово» приходит БЕЗ самого слова.
|
|
$r = RobotResult::fromRobotJson([
|
|
'ok' => true,
|
|
'campaignId' => '2237821',
|
|
'status' => null,
|
|
'rowText' => '06.08 Telegram по своей базе Посмотреть настройки Приостановлена',
|
|
]);
|
|
|
|
expect($r->rowText)->toContain('Приостановлена');
|
|
});
|
|
|
|
test('признак остановки читается', function () {
|
|
expect(RobotResult::fromRobotJson(['ok' => true, 'stopped' => true])->stopped)->toBeTrue();
|
|
expect(RobotResult::fromRobotJson(['ok' => true])->stopped)->toBeFalse();
|
|
});
|