getStatusCode->returns(201); $responseHandle->getBody->returns(Utils::streamFor($returnedBody)); $responseHandle->getHeaderLine->with('content-type')->returns($contentType); $responseMock = $responseHandle->get(); $clientHandle = Phony::mock(Client::class); $clientHandle->request->returns($responseMock); $clientMock = $clientHandle->get(); $ucrmApi = new UcrmApi($clientMock, self::TEST_APP_KEY); $endpoint = 'clients'; $data = [ 'firstName' => 'John', 'lastName' => 'Doe', ]; $result = $ucrmApi->post($endpoint, $data); self::assertSame($expectedResult, $result); $clientHandle->request->calledWith( 'POST', $endpoint, [ 'json' => $data, 'headers' => [ 'x-auth-app-key' => self::TEST_APP_KEY, ], ] ); } /** * @param mixed[]|string $expectedResult * * @dataProvider responseProvider */ public function testPatch(string $contentType, string $returnedBody, $expectedResult): void { $responseHandle = Phony::mock(Response::class); $responseHandle->getStatusCode->returns(200); $responseHandle->getBody->returns(Utils::streamFor($returnedBody)); $responseHandle->getHeaderLine->with('content-type')->returns($contentType); $responseMock = $responseHandle->get(); $clientHandle = Phony::mock(Client::class); $clientHandle->request->returns($responseMock); $clientMock = $clientHandle->get(); $ucrmApi = new UcrmApi($clientMock, self::TEST_APP_KEY); $endpoint = 'clients'; $data = [ 'firstName' => 'John', 'lastName' => 'Doe', ]; $result = $ucrmApi->patch($endpoint, $data); self::assertSame($expectedResult, $result); $clientHandle->request->calledWith( 'PATCH', $endpoint, [ 'json' => $data, 'headers' => [ 'x-auth-app-key' => self::TEST_APP_KEY, ], ] ); } public function testDelete(): void { $responseHandle = Phony::mock(Response::class); $responseHandle->getStatusCode->returns(200); $responseMock = $responseHandle->get(); $clientHandle = Phony::mock(Client::class); $clientHandle->request->returns($responseMock); $clientMock = $clientHandle->get(); $ucrmApi = new UcrmApi($clientMock, self::TEST_APP_KEY); $endpoint = 'clients'; $ucrmApi->delete($endpoint); $clientHandle->request->calledWith( 'DELETE', $endpoint, [ 'headers' => [ 'x-auth-app-key' => self::TEST_APP_KEY, ], ] ); } /** * @param mixed[]|string $expectedResult * * @dataProvider responseProvider */ public function testGet(string $contentType, string $returnedBody, $expectedResult): void { $responseHandle = Phony::mock(Response::class); $responseHandle->getStatusCode->returns(200); $responseHandle->getBody->returns(Utils::streamFor($returnedBody)); $responseHandle->getHeaderLine->with('content-type')->returns($contentType); $responseMock = $responseHandle->get(); $clientHandle = Phony::mock(Client::class); $clientHandle->request->returns($responseMock); $clientMock = $clientHandle->get(); $ucrmApi = new UcrmApi($clientMock, self::TEST_APP_KEY); $endpoint = 'clients'; $query = [ 'order' => 'client.id', 'direction' => 'DESC', ]; $result = $ucrmApi->get($endpoint, $query); self::assertSame($expectedResult, $result); $clientHandle->request->calledWith( 'GET', $endpoint, [ 'query' => $query, 'headers' => [ 'x-auth-app-key' => self::TEST_APP_KEY, ], ] ); } /** * @return mixed[] */ public function responseProvider(): array { return [ [ 'contentType' => 'text/plain', 'returnedBody' => 'lorem ipsum dolor', 'expectedResult' => 'lorem ipsum dolor', ], [ 'contentType' => 'application/json', 'returnedBody' => '["lorem", "ipsum"]', 'expectedResult' => ['lorem', 'ipsum'], ], [ 'contentType' => 'application/json', 'returnedBody' => '', 'expectedResult' => '', ], ]; } }