first commit
This commit is contained in:
90
tests/Unit/HttpClientTest.php
Normal file
90
tests/Unit/HttpClientTest.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Apoloz\VideoExtractor\Tests\Unit;
|
||||
|
||||
use Apoloz\VideoExtractor\Http\HttpClient;
|
||||
use Apoloz\VideoExtractor\Tests\TestCase;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class HttpClientTest extends TestCase
|
||||
{
|
||||
public function test_converts_cp1251_body_to_utf8_from_header(): void
|
||||
{
|
||||
// Cyrillic "Трамп" encoded as Windows-1251 bytes.
|
||||
$cp1251 = "\xd2\xf0\xe0\xec\xef";
|
||||
|
||||
Http::fake([
|
||||
'example.com/*' => Http::response(
|
||||
$cp1251,
|
||||
200,
|
||||
['Content-Type' => 'application/json; charset=windows-1251'],
|
||||
),
|
||||
]);
|
||||
|
||||
$client = new HttpClient();
|
||||
$response = $client->get('https://example.com/test');
|
||||
|
||||
self::assertSame('Трамп', $client->bodyUtf8($response));
|
||||
}
|
||||
|
||||
public function test_force_charset_overrides_header_detection(): void
|
||||
{
|
||||
// "Алена" encoded as Windows-1251 bytes, but the server declares UTF-8.
|
||||
$cp1251 = "\xc0\xeb\xe5\xed\xe0";
|
||||
|
||||
Http::fake([
|
||||
'example.com/*' => Http::response(
|
||||
$cp1251,
|
||||
200,
|
||||
['Content-Type' => 'application/json; charset=utf-8'],
|
||||
),
|
||||
]);
|
||||
|
||||
$client = new HttpClient();
|
||||
$response = $client->get('https://example.com/test');
|
||||
|
||||
// Forcing cp1251 recovers correct Cyrillic regardless of the header.
|
||||
self::assertSame('Алена', $client->bodyUtf8($response, 'Windows-1251'));
|
||||
}
|
||||
|
||||
public function test_leaves_utf8_body_untouched(): void
|
||||
{
|
||||
Http::fake([
|
||||
'example.com/*' => Http::response('Привет', 200, ['Content-Type' => 'application/json; charset=utf-8']),
|
||||
]);
|
||||
|
||||
$client = new HttpClient();
|
||||
$response = $client->get('https://example.com/test');
|
||||
|
||||
self::assertSame('Привет', $client->bodyUtf8($response));
|
||||
}
|
||||
|
||||
public function test_returns_body_verbatim_when_no_charset(): void
|
||||
{
|
||||
Http::fake([
|
||||
'example.com/*' => Http::response('plain ascii', 200, ['Content-Type' => 'text/html']),
|
||||
]);
|
||||
|
||||
$client = new HttpClient();
|
||||
$response = $client->get('https://example.com/test');
|
||||
|
||||
self::assertSame('plain ascii', $client->bodyUtf8($response));
|
||||
}
|
||||
|
||||
public function test_detects_challenge_redirect(): void
|
||||
{
|
||||
// VK answers 429 on the challenge URL itself; in Http::fake the
|
||||
// effective URI mirrors the request URL, so we hit it directly.
|
||||
Http::fake([
|
||||
'vk.com/challenge.html*' => Http::response('challenge', 429),
|
||||
]);
|
||||
|
||||
$client = new HttpClient();
|
||||
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$this->expectExceptionMessage('JS challenge');
|
||||
$client->get('https://vk.com/challenge.html?hash429=abc');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user