diff --git a/src/Client.php b/src/Client.php index deb0f48b..9a8a4752 100644 --- a/src/Client.php +++ b/src/Client.php @@ -17,6 +17,7 @@ use MeiliSearch\Endpoints\Tasks; use MeiliSearch\Endpoints\Version; use Psr\Http\Client\ClientInterface; +use Psr\Http\Message\RequestFactoryInterface; class Client { @@ -35,9 +36,13 @@ class Client private Tasks $tasks; private Dumps $dumps; - public function __construct(string $url, string $apiKey = null, ClientInterface $httpClient = null) - { - $this->http = new Http\Client($url, $apiKey, $httpClient); + public function __construct( + string $url, + string $apiKey = null, + ClientInterface $httpClient = null, + RequestFactoryInterface $requestFactory = null + ) { + $this->http = new Http\Client($url, $apiKey, $httpClient, $requestFactory); $this->index = new Indexes($this->http); $this->health = new Health($this->http); $this->version = new Version($this->http); diff --git a/src/Http/Client.php b/src/Http/Client.php index 6c692a30..84c1dc6c 100644 --- a/src/Http/Client.php +++ b/src/Http/Client.php @@ -13,6 +13,7 @@ use MeiliSearch\Exceptions\JsonDecodingException; use MeiliSearch\Exceptions\JsonEncodingException; use MeiliSearch\Http\Serialize\Json; +use MeiliSearch\MeiliSearch; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Client\NetworkExceptionInterface; @@ -34,15 +35,20 @@ class Client implements Http /** * Client constructor. */ - public function __construct(string $url, string $apiKey = null, ClientInterface $httpClient = null) - { + public function __construct( + string $url, + string $apiKey = null, + ClientInterface $httpClient = null, + RequestFactoryInterface $reqFactory = null + ) { $this->baseUrl = $url; $this->apiKey = $apiKey; $this->http = $httpClient ?? Psr18ClientDiscovery::find(); - $this->requestFactory = Psr17FactoryDiscovery::findRequestFactory(); + $this->requestFactory = $reqFactory ?? Psr17FactoryDiscovery::findRequestFactory(); $this->streamFactory = Psr17FactoryDiscovery::findStreamFactory(); $this->headers = array_filter([ 'Authorization' => sprintf('Bearer %s', $this->apiKey), + 'User-Agent' => MeiliSearch::qualifiedVersion(), ]); $this->json = new Json(); } diff --git a/tests/Http/ClientTest.php b/tests/Http/ClientTest.php index a8b1f63c..83ed1a56 100644 --- a/tests/Http/ClientTest.php +++ b/tests/Http/ClientTest.php @@ -9,9 +9,11 @@ use MeiliSearch\Exceptions\JsonDecodingException; use MeiliSearch\Exceptions\JsonEncodingException; use MeiliSearch\Http\Client; +use MeiliSearch\MeiliSearch; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Http\Client\ClientInterface; +use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\StreamInterface; @@ -191,6 +193,35 @@ public function testInvalidResponseContentTypeThrowsException(): void $client->get('/'); } + public function testClientHasDefaultUserAgent(): void + { + $httpClient = $this->createHttpClientMock(200, '{}'); + $reqFactory = $this->createMock(RequestFactoryInterface::class); + $requestStub = $this->createMock(RequestInterface::class); + + $requestStub->expects($this->any()) + ->method('withAddedHeader') + ->withConsecutive( + [ + $this->equalTo('Authorization'), + $this->equalTo('Bearer masterKey'), + ], + [ + $this->equalTo('User-Agent'), + $this->equalTo(MeiliSearch::qualifiedVersion()), + ], + ) + ->willReturnOnConsecutiveCalls($requestStub, $requestStub); + + $reqFactory->expects($this->any()) + ->method('createRequest') + ->willReturn($requestStub); + + $client = new \MeiliSearch\Client('http://localhost:7070', 'masterKey', $httpClient, $reqFactory); + + $client->health(); + } + public function testParseResponseReturnsNullForNoContent(): void { $response = $this->createMock(ResponseInterface::class);