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); } }