| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 | <?php/* * This file is part of the overtrue/socialite. * * (c) overtrue <i@overtrue.me> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */use Mockery as m;use Overtrue\Socialite\AccessTokenInterface;use Overtrue\Socialite\Providers\AbstractProvider;use Overtrue\Socialite\User;use PHPUnit\Framework\TestCase;use Symfony\Component\HttpFoundation\Request;class OAuthTest extends TestCase{    public function tearDown()    {        m::close();    }    public function testAbstractProviderBackwardCompatible()    {        $request = Request::create('foo');        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('put')->once();        $provider = new OAuthTwoTestProviderStub($request, 'client_id', 'client_secret', 'redirect');        $this->assertSame('client_id', $provider->getConfig()['client_id']);        $this->assertSame('client_secret', $provider->getConfig()['client_secret']);        $this->assertSame('redirect', $provider->getConfig()['redirect']);        $response = $provider->redirect();        $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response);        $this->assertSame('http://auth.url', $response->getTargetUrl());    }    public function testRedirectGeneratesTheProperSymfonyRedirectResponse()    {        $request = Request::create('foo');        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('put')->once();        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect',        ]        );        $response = $provider->redirect();        $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response);        $this->assertSame('http://auth.url', $response->getTargetUrl());    }    public function testRedirectUrl()    {        $request = Request::create('foo', 'GET', ['state' => str_repeat('A', 40), 'code' => 'code']);        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',        ]        );        $this->assertNull($provider->getRedirectUrl());        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect_uri',        ]        );        $this->assertSame('redirect_uri', $provider->getRedirectUrl());        $provider->setRedirectUrl('overtrue.me');        $this->assertSame('overtrue.me', $provider->getRedirectUrl());        $provider->withRedirectUrl('http://overtrue.me');        $this->assertSame('http://overtrue.me', $provider->getRedirectUrl());    }    public function testUserReturnsAUserInstanceForTheAuthenticatedRequest()    {        $request = Request::create('foo', 'GET', ['state' => str_repeat('A', 40), 'code' => 'code']);        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('get')->once()->with('state')->andReturn(str_repeat('A', 40));        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect_uri',        ]        );        $provider->http = m::mock('StdClass');        $provider->http->shouldReceive('post')->once()->with(            'http://token.url',            [                'headers' => ['Accept' => 'application/json'],                'form_params' => [                    'client_id' => 'client_id',                    'client_secret' => 'client_secret',                    'code' => 'code',                    'redirect_uri' => 'redirect_uri',                ],            ]        )->andReturn($response = m::mock('StdClass'));        $response->shouldReceive('getBody')->once()->andReturn('{"access_token":"access_token"}');        $user = $provider->user();        $this->assertInstanceOf('Overtrue\Socialite\User', $user);        $this->assertSame('foo', $user->getId());    }    /**     * @expectedException \Overtrue\Socialite\InvalidStateException     */    public function testExceptionIsThrownIfStateIsInvalid()    {        $request = Request::create('foo', 'GET', ['state' => str_repeat('B', 40), 'code' => 'code']);        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('get')->once()->with('state')->andReturn(str_repeat('A', 40));        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect',        ]        );        $user = $provider->user();    }    /**     * @expectedException \Overtrue\Socialite\AuthorizeFailedException     * @expectedExceptionMessage Authorize Failed: {"error":"scope is invalid"}     */    public function testExceptionisThrownIfAuthorizeFailed()    {        $request = Request::create('foo', 'GET', ['state' => str_repeat('A', 40), 'code' => 'code']);        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('get')->once()->with('state')->andReturn(str_repeat('A', 40));        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect_uri',        ]        );        $provider->http = m::mock('StdClass');        $provider->http->shouldReceive('post')->once()->with(            'http://token.url',            [                'headers' => ['Accept' => 'application/json'],                'form_params' => [                    'client_id' => 'client_id',                    'client_secret' => 'client_secret',                    'code' => 'code',                    'redirect_uri' => 'redirect_uri',                ],            ]        )->andReturn($response = m::mock('StdClass'));        $response->shouldReceive('getBody')->once()->andReturn('{"error":"scope is invalid"}');        $user = $provider->user();    }    /**     * @expectedException \Overtrue\Socialite\InvalidStateException     */    public function testExceptionIsThrownIfStateIsNotSet()    {        $request = Request::create('foo', 'GET', ['state' => 'state', 'code' => 'code']);        $request->setSession($session = m::mock('Symfony\Component\HttpFoundation\Session\SessionInterface'));        $session->shouldReceive('get')->once()->with('state');        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect',        ]        );        $user = $provider->user();    }    public function testDriverName()    {        $request = Request::create('foo', 'GET', ['state' => 'state', 'code' => 'code']);        $provider = new OAuthTwoTestProviderStub(            $request, [            'client_id' => 'client_id',            'client_secret' => 'client_secret',            'redirect' => 'redirect',        ]        );        $this->assertSame('OAuthTwoTest', $provider->getName());    }}class OAuthTwoTestProviderStub extends AbstractProvider{    public $http;    protected function getAuthUrl($state)    {        return 'http://auth.url';    }    protected function getTokenUrl()    {        return 'http://token.url';    }    protected function getUserByToken(AccessTokenInterface $token)    {        return ['id' => 'foo'];    }    protected function mapUserToObject(array $user)    {        return new User(['id' => $user['id']]);    }    /**     * Get a fresh instance of the Guzzle HTTP client.     *     * @return \GuzzleHttp\Client     */    protected function getHttpClient()    {        if ($this->http) {            return $this->http;        }        return $this->http = m::mock('StdClass');    }}
 |