provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([ 'clientId' => 'mock_client_id', 'clientSecret' => 'mock_secret', 'redirectUri' => 'none', ]); } public function tearDown() { m::close(); parent::tearDown(); } public function testAuthorizationUrl() { $url = $this->provider->getAuthorizationUrl(); $uri = parse_url($url); parse_str($uri['query'], $query); $this->assertArrayHasKey('client_id', $query); $this->assertArrayHasKey('redirect_uri', $query); $this->assertArrayHasKey('state', $query); $this->assertArrayHasKey('scope', $query); $this->assertArrayHasKey('response_type', $query); $this->assertArrayHasKey('approval_prompt', $query); $this->assertNotNull($this->provider->getState()); } public function testScopes() { $scopeSeparator = ','; $options = ['scope' => [uniqid(), uniqid()]]; $query = ['scope' => implode($scopeSeparator, $options['scope'])]; $url = $this->provider->getAuthorizationUrl($options); $encodedScope = $this->buildQueryString($query); $this->assertContains($encodedScope, $url); } public function testGetAuthorizationUrl() { $url = $this->provider->getAuthorizationUrl(); $uri = parse_url($url); $this->assertEquals('/oauth20_authorize.srf', $uri['path']); } public function testGetBaseAccessTokenUrl() { $params = []; $url = $this->provider->getBaseAccessTokenUrl($params); $uri = parse_url($url); $this->assertEquals('/oauth20_token.srf', $uri['path']); } public function testSettingAuthEndpoints() { $customAuthUrl = uniqid(); $customTokenUrl = uniqid(); $customResourceOwnerUrl = uniqid(); $token = m::mock('League\OAuth2\Client\Token\AccessToken'); $this->provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([ 'clientId' => 'mock_client_id', 'clientSecret' => 'mock_secret', 'redirectUri' => 'none', 'urlAuthorize' => $customAuthUrl, 'urlAccessToken' => $customTokenUrl, 'urlResourceOwnerDetails' => $customResourceOwnerUrl ]); $authUrl = $this->provider->getAuthorizationUrl(); $this->assertContains($customAuthUrl, $authUrl); $tokenUrl = $this->provider->getBaseAccessTokenUrl([]); $this->assertContains($customTokenUrl, $tokenUrl); $resourceOwnerUrl = $this->provider->getResourceOwnerDetailsUrl($token); $this->assertContains($customResourceOwnerUrl, $resourceOwnerUrl); } public function testGetAccessToken() { $response = m::mock('Psr\Http\Message\ResponseInterface'); $response->shouldReceive('getBody')->andReturn('{"access_token":"mock_access_token","authentication_token":"","code":"","expires_in":3600,"refresh_token":"mock_refresh_token","scope":"","state":"","token_type":""}'); $response->shouldReceive('getHeader')->andReturn(['content-type' => 'json']); $client = m::mock('GuzzleHttp\ClientInterface'); $client->shouldReceive('send')->times(1)->andReturn($response); $this->provider->setHttpClient($client); $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']); $this->assertEquals('mock_access_token', $token->getToken()); $this->assertLessThanOrEqual(time() + 3600, $token->getExpires()); $this->assertGreaterThanOrEqual(time(), $token->getExpires()); $this->assertEquals('mock_refresh_token', $token->getRefreshToken()); $this->assertNull($token->getResourceOwnerId()); } public function testUserData() { $email = uniqid(); $firstname = uniqid(); $lastname = uniqid(); $name = uniqid(); $userId = rand(1000,9999); $urls = uniqid(); $postResponse = m::mock('Psr\Http\Message\ResponseInterface'); $postResponse->shouldReceive('getBody')->andReturn('{"access_token":"mock_access_token","authentication_token":"","code":"","expires_in":3600,"refresh_token":"mock_refresh_token","scope":"","state":"","token_type":""}'); $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']); $userResponse = m::mock('Psr\Http\Message\ResponseInterface'); $userResponse->shouldReceive('getBody')->andReturn('{"id": '.$userId.', "name": "'.$name.'", "first_name": "'.$firstname.'", "last_name": "'.$lastname.'", "emails": {"preferred": "'.$email.'"}, "link": "'.$urls.'"}'); $userResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']); $client = m::mock('GuzzleHttp\ClientInterface'); $client->shouldReceive('send') ->times(2) ->andReturn($postResponse, $userResponse); $this->provider->setHttpClient($client); $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']); $user = $this->provider->getResourceOwner($token); $this->assertEquals($email, $user->getEmail()); $this->assertEquals($email, $user->toArray()['emails']['preferred']); $this->assertEquals($firstname, $user->getFirstname()); $this->assertEquals($firstname, $user->toArray()['first_name']); $this->assertEquals($lastname, $user->getLastname()); $this->assertEquals($lastname, $user->toArray()['last_name']); $this->assertEquals($name, $user->getName()); $this->assertEquals($name, $user->toArray()['name']); $this->assertEquals($userId, $user->getId()); $this->assertEquals($userId, $user->toArray()['id']); $this->assertEquals($urls.'/cid-'.$userId, $user->getUrls()); $this->assertEquals($urls.'/cid-'.$userId, $user->toArray()['link'].'/cid-'.$user->toArray()['id']); } /** * @expectedException League\OAuth2\Client\Provider\Exception\IdentityProviderException **/ public function testExceptionThrownWhenErrorObjectReceived() { $message = uniqid(); $postResponse = m::mock('Psr\Http\Message\ResponseInterface'); $postResponse->shouldReceive('getBody')->andReturn('{"error": {"code": "request_token_expired", "message": "'.$message.'"}}'); $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']); $postResponse->shouldReceive('getStatusCode')->andReturn(500); $client = m::mock('GuzzleHttp\ClientInterface'); $client->shouldReceive('send') ->times(1) ->andReturn($postResponse); $this->provider->setHttpClient($client); $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']); } }