78 lines
2.8 KiB
PHP
78 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use ElixForms\Common\HttpClient;
|
|
use GuzzleHttp\Client;
|
|
use GuzzleHttp\Handler\MockHandler;
|
|
use GuzzleHttp\HandlerStack;
|
|
use GuzzleHttp\Middleware;
|
|
use GuzzleHttp\Psr7\Response;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
final class HttpClientTest extends TestCase
|
|
{
|
|
public function testGetUsesQueryHeadersAuthenticationAndTimeout(): void
|
|
{
|
|
$history = [];
|
|
$stack = HandlerStack::create(new MockHandler([new Response(200, [], '{"ok":true}')]));
|
|
$stack->push(Middleware::history($history));
|
|
|
|
$client = new HttpClient(
|
|
['Accept' => 'application/json', 'X-Default' => 'default'],
|
|
new Client(['handler' => $stack])
|
|
);
|
|
$client->setBasicAuth('user', 'secret')->setTimeout(5);
|
|
|
|
$result = $client->get(
|
|
'https://example.test/resource',
|
|
['term' => 'Mario Rossi'],
|
|
['X-Default' => 'override']
|
|
);
|
|
|
|
self::assertSame('{"ok":true}', $result);
|
|
self::assertCount(1, $history);
|
|
self::assertSame('GET', $history[0]['request']->getMethod());
|
|
self::assertSame('term=Mario%20Rossi', $history[0]['request']->getUri()->getQuery());
|
|
self::assertSame('application/json', $history[0]['request']->getHeaderLine('Accept'));
|
|
self::assertSame('override', $history[0]['request']->getHeaderLine('X-Default'));
|
|
self::assertSame(['user', 'secret'], $history[0]['options']['auth']);
|
|
self::assertSame(5, $history[0]['options']['timeout']);
|
|
self::assertSame(5, $history[0]['options']['connect_timeout']);
|
|
}
|
|
|
|
public function testPostEncodesArrayAsFormData(): void
|
|
{
|
|
$history = [];
|
|
$stack = HandlerStack::create(new MockHandler([new Response(200, [], 'saved')]));
|
|
$stack->push(Middleware::history($history));
|
|
$client = new HttpClient([], new Client(['handler' => $stack]));
|
|
|
|
self::assertSame('saved', $client->post('https://example.test/resource', ['name' => 'Mario Rossi']));
|
|
self::assertSame('POST', $history[0]['request']->getMethod());
|
|
self::assertSame('name=Mario+Rossi', (string)$history[0]['request']->getBody());
|
|
}
|
|
|
|
public function testHttpErrorsAreExposedWithoutResponseBody(): void
|
|
{
|
|
$client = new HttpClient([], new Client([
|
|
'handler' => HandlerStack::create(new MockHandler([
|
|
new Response(503, [], 'sensitive upstream response'),
|
|
])),
|
|
]));
|
|
|
|
$this->expectException(\RuntimeException::class);
|
|
$this->expectExceptionMessage('Richiesta fallita con codice di stato HTTP 503.');
|
|
|
|
$client->get('https://example.test/resource');
|
|
}
|
|
|
|
public function testTimeoutMustBePositive(): void
|
|
{
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
(new HttpClient())->setTimeout(0);
|
|
}
|
|
}
|