switch to Guzzle module for HTTP calls

This commit is contained in:
2026-07-22 13:05:17 +02:00
parent 01b22f9c2d
commit 1cf674a31c
6 changed files with 2627 additions and 80 deletions
+77
View File
@@ -0,0 +1,77 @@
<?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);
}
}