diff --git a/src/CoMagic/CallApiClient.php b/src/CoMagic/CallApiClient.php index c858139..bc090fc 100644 --- a/src/CoMagic/CallApiClient.php +++ b/src/CoMagic/CallApiClient.php @@ -12,7 +12,7 @@ class CallApiClient { private string $version = 'v4.0'; private ?string $accessToken = null; - private ?string $accessTokenExpires = null; + private ?int $accessTokenExpires = null; private ?string $login = null; private ?string $password = null; private ?Client $client = null; @@ -40,6 +40,11 @@ public function __construct(CallApiConfig $config, ?Client $client = null) '/' . $this->version; } + public function getAccessToken(): ?string + { + return $this->accessToken; + } + private function refreshAccessToken(): void { // Check if access token is not expired @@ -50,7 +55,7 @@ private function refreshAccessToken(): void return; } - $data = $this->doRequest( + $response = $this->doRequest( 'login.user', [ 'login' => $this->login, @@ -58,8 +63,8 @@ private function refreshAccessToken(): void ] ); - $this->accessToken = $data->access_token; - $this->accessTokenExpires = $data->expire_at; + $this->accessToken = $response->access_token; + $this->accessTokenExpires = $response->expire_at; } /** @@ -113,7 +118,7 @@ private function doRequest(string $method, array $params) $responseBody = json_decode($response->getBody()->getContents()); if (isset($responseBody->result)) { - $this->metadata = $responseBody->result->metadata; + $this->metadata = $responseBody->result->metadata ?? null; } if (isset($responseBody->error)) { diff --git a/tests/CallApiClientTest.php b/tests/CallApiClientTest.php index 6778282..329ba0e 100644 --- a/tests/CallApiClientTest.php +++ b/tests/CallApiClientTest.php @@ -25,6 +25,71 @@ public function testCanBeCreated(): void ); } + public function testCanObtainAccessTokenByLoginAndPassword(): void + { + $config = new CallApiConfig('login', 'password'); + $httpClient = $this->createMock(Client::class); + + $expectedNewAccessToken = 'new-access-token'; + $expectedBaseUri = rtrim($config->getEntryPoint(), '/') . '/v4.0'; + $expectedHttpLoginPayload = [ + 'jsonrpc' => '2.0', + 'id' => time(), + 'method' => 'login.user', + 'params' => [ + 'login' => $config->getLogin(), + 'password' => $config->getPassword(), + ], + ]; + $expectedHttpListCallsPayload = [ + 'jsonrpc' => '2.0', + 'id' => time(), + 'method' => 'list.calls', + 'params' => [ + 'access_token' => $expectedNewAccessToken, + ], + ]; + $httpClient->expects($this->exactly(2)) + ->method('post') + ->with( + $expectedBaseUri, + $this->logicalOr( + $this->equalTo(['json' => $expectedHttpLoginPayload]), + $this->equalTo(['json' => $expectedHttpListCallsPayload]) + ) + ) + ->willReturnOnConsecutiveCalls( + new Response( + 200, + [], + json_encode([ + 'result' => [ + 'data' => [ + 'access_token' => $expectedNewAccessToken, + 'expire_at' => time() + 3600, + ], + ], + ]) + ), + new Response( + 200, + [], + json_encode(['result' => ['data' => []]]) + ) + ); + + $client = new CallApiClient($config, $httpClient); + + $this->assertNull($client->getAccessToken()); + + $client->listCalls(); + + $this->assertEquals( + $expectedNewAccessToken, + $client->getAccessToken() + ); + } + /** @dataProvider apiCallsProvider */ public function testCanDoApiCalls(