client = Mockery::mock(Client::class); $this->cache = Mockery::mock(Cache::class); $this->logger = Mockery::mock(Logger::class); } public function testBuildUri(): void { $api = new ConcreteApiClient($this->client, $this->cache, $this->logger); self::assertEquals('http://foo.com/get/param?key=bar', $api->buildUrl('get/param')); self::assertEquals('http://foo.com/get/param?baz=moo&key=bar', $api->buildUrl('/get/param?baz=moo')); self::assertEquals('http://baz.com/?key=bar', $api->buildUrl('http://baz.com/')); } /** @return array */ public function provideRequestData(): array { return [ ['get', '{"foo":"bar"}'], ['post', '{"foo":"bar"}'], ['put', '{"foo":"bar"}'], ['delete', '{"foo":"bar"}'], ]; } /** @dataProvider provideRequestData */ public function testRequest(string $method, string $responseBody): void { /** @var Client $client */ $client = Mockery::mock(Client::class, [ $method => new Response(200, [], $responseBody), ]); $api = new ConcreteApiClient($client, $this->cache, $this->logger); self::assertSame((array) json_decode($responseBody), (array) $api->$method('/')); } }