Http::response([ 'status_code' => 200, 'response_body_base64' => base64_encode('привет'), ]), ]); $client = new XfetchClient('test-key'); expect($client->html('https://2gis.ru/x'))->toBe('привет'); }); 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('x')], 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); }); it('htmlBatch грузит несколько страниц и возвращает карту url=>html', function () { Http::fake(['xf4.ru/*' => fn ($request) => Http::response([ 'response_body_base64' => base64_encode('HTML:'.$request['url']), ])]); $client = new XfetchClient('k', concurrency: 2); $urls = ['https://a.ru', 'https://b.ru', 'https://c.ru']; $out = $client->htmlBatch($urls); expect($out)->toHaveKeys($urls) ->and($out['https://a.ru'])->toBe('HTML:https://a.ru') ->and($out['https://b.ru'])->toBe('HTML:https://b.ru') ->and($out['https://c.ru'])->toBe('HTML:https://c.ru'); Http::assertSentCount(3); }); it('htmlBatch ретраит пустой ответ в пачке и берёт удачный', function () { Http::fake(['xf4.ru/*' => Http::sequence() ->push(['response_body_base64' => ''], 200) // 1-я попытка пустая (флак) ->push(['response_body_base64' => base64_encode('OK')], 200), // ретрай удачен ]); $client = new XfetchClient('k', retries: 2, concurrency: 4); $out = $client->htmlBatch(['https://a.ru']); expect($out['https://a.ru'])->toBe('OK'); }); it('htmlBatch без ключа не ходит в сеть', function () { Http::fake(); $out = (new XfetchClient(null))->htmlBatch(['https://a.ru', 'https://b.ru']); expect($out)->toBe(['https://a.ru' => '', 'https://b.ru' => '']); Http::assertNothingSent(); });