Files
portal/app/tests/Unit/Autopodbor/Fetch/XfetchClientTest.php
T
Дмитрий 5851ac48d3 feat(автоподбор): включён настоящий движок шага 2 + ретрай флаки 2ГИС
Провайдер биндит RealCompetitorAgent вместо заглушки: сайт конкурента —
обычный curl плюс локальный Playwright, справочники 2ГИС/Яндекс — через
антибот xfetch. Поиск/резолв шага 1 ещё не реальны — делегируются заглушке
через fallback, поведение поиска не изменилось.

- AutopodborServiceProvider биндит RealCompetitorAgent с CompositeFetcher
- XfetchClient повторяет запрос при пустом флаки-рендере 2ГИС, до 3 раз
- тесты привязки контейнера плюс ретрая; study-тест пинит заглушку явно
- тесты заглушки строят FakeCompetitorAgent напрямую
- бэкенд автоподбора 126/126

НЕ на проде, воркстри avtopodbor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 15:51:31 +03:00

48 lines
2.0 KiB
PHP

<?php
use App\Services\Autopodbor\Agent\Fetch\XfetchClient;
use Illuminate\Support\Facades\Http;
it('декодирует HTML из base64-ответа xfetch', function () {
Http::fake([
'xf4.ru/*' => Http::response([
'status_code' => 200,
'response_body_base64' => base64_encode('<html>привет</html>'),
]),
]);
$client = new XfetchClient('test-key');
expect($client->html('https://2gis.ru/x'))->toBe('<html>привет</html>');
});
it('без ключа не ходит в сеть и возвращает пусто', function () {
Http::fake();
$client = new XfetchClient(null);
expect($client->html('https://2gis.ru/x'))->toBe('');
Http::assertNothingSent();
});
it('повторяет запрос при флаки-пустом рендере 2ГИС и берёт удачный', function () {
Http::fake(['xf4.ru/*' => Http::sequence()
->push(['response_body_base64' => ''], 200) // 1-й рендер пустой (флак)
->push(['response_body_base64' => base64_encode('<a href="tel:+73912920000">x</a>')], 200), // 2-й удачный
]);
$client = new XfetchClient('k', retries: 3);
expect($client->html('https://2gis.ru/x'))->toContain('73912920000');
});
it('после исчерпания ретраев возвращает пусто', function () {
Http::fake(['xf4.ru/*' => Http::response(['response_body_base64' => ''], 200)]);
$client = new XfetchClient('k', retries: 2);
expect($client->html('https://2gis.ru/x'))->toBe('');
Http::assertSentCount(2);
});
it('шлёт url, api_key и render:true на endpoint xfetch', function () {
Http::fake(['xf4.ru/*' => Http::response(['response_body_base64' => base64_encode('ok')])]);
(new XfetchClient('k123'))->html('https://2gis.ru/y');
Http::assertSent(fn ($r) => $r->url() === 'https://xf4.ru/fetch'
&& $r['url'] === 'https://2gis.ru/y'
&& $r['api_key'] === 'k123'
&& $r['render'] === true);
});