first commit

This commit is contained in:
zickkeen committed 2024-03-17 11:39:27 +07:00
commit d0e185820a
2710 files changed
+465112

No files matched your search

@@ -0,0 +1,280 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
use ReflectionClass;
use SocialConnect\Common\Http\Client\ClientInterface;
use SocialConnect\OAuth2\AccessToken;
use SocialConnect\Provider\Consumer;
use SocialConnect\Provider\Session\SessionInterface;
use Test\TestCase;
abstract class AbstractProviderTestCase extends TestCase
{
/**
* @return string
*/
abstract protected function getProviderClassName();
/**
* @param mixed $responseData
* @param int $responseCode
* @param bool $mockFromRequest
* @return \PHPUnit_Framework_MockObject_MockObject
*/
protected function mockClientResponse($responseData, $responseCode = 200, $mockFromRequest = false)
{
$mockedHttpClient = $this->getMockBuilder(\SocialConnect\Common\Http\Client\Curl::class)
->getMock();
$response = new \SocialConnect\Common\Http\Response(
$responseCode,
$responseData,
[]
);
if ($mockFromRequest) {
$mockedHttpClient->expects($this->once())
->method('fromRequest')
->willReturn($response);
} else {
$mockedHttpClient->expects($this->once())
->method('request')
->willReturn($response);
}
return $mockedHttpClient;
}
/**
* @param object $object
* @param string $name
* @param array $params
* @return mixed
*/
protected static function callProtectedMethod($object, $name, array $params = [])
{
$class = new ReflectionClass($object);
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method->invokeArgs($object, $params);
}
/**
* @param ClientInterface|null $httpClient
* @return \SocialConnect\OAuth2\AbstractProvider
*/
protected function getProvider(ClientInterface $httpClient = null, SessionInterface $session = null)
{
if (!$httpClient) {
$httpClient = $this->getMockBuilder(\SocialConnect\Common\Http\Client\Curl::class)
->disableOriginalConstructor()
->disableProxyingToOriginalMethods()
->getMock();
}
if (!$session) {
$session = $this->getMockBuilder(\SocialConnect\Provider\Session\Session::class)
->disableOriginalConstructor()
->disableProxyingToOriginalMethods()
->getMock();
}
$className = $this->getProviderClassName();
return new $className(
$httpClient,
$session,
new Consumer(
'unknown',
'unkwown'
),
[
'redirectUri' => 'http://localhost:8000/'
]
);
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage Parameter $code must be a string
*/
public function testGetAccessTokenFail()
{
$this->getProvider()->getAccessToken(null);
}
public function testGetBaseUriReturnString()
{
parent::assertInternalType('string', $this->getProvider()->getBaseUri());
}
public function testGetAuthorizeUriReturnString()
{
parent::assertInternalType('string', $this->getProvider()->getAuthorizeUri());
}
public function testGetRequestTokenUriReturnString()
{
parent::assertInternalType('string', $this->getProvider()->getRequestTokenUri());
}
public function testGetNameReturnString()
{
parent::assertInternalType('string', $this->getProvider()->getName());
}
public function testMakeAuthUrl()
{
$provider = $this->getProvider();
$authUrl = $provider->makeAuthUrl();
parent::assertInternalType('string', $authUrl);
/**
* Auth url must be started from getAuthorizeUri
*/
parent::assertSame(
0,
strpos($authUrl, $provider->getAuthorizeUri())
);
$query = parse_url($authUrl, PHP_URL_QUERY);
parent::assertInternalType('string', $query);
parse_str($query, $queryParameters);
parent::assertInternalType('array', $queryParameters);
parent::assertArrayHasKey('client_id', $queryParameters);
parent::assertArrayHasKey('redirect_uri', $queryParameters);
parent::assertArrayHasKey('response_type', $queryParameters);
parent::assertArrayHasKey('state', $queryParameters);
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidResponse
* @expectedExceptionMessage API response with error code
*/
public function testGetAccessTokenResponseInternalServerErrorFail()
{
$this->getProvider(
$this->mockClientResponse(
null,
500,
true
)
)->getAccessToken('XXXXXXXXXXXX');
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidResponse
* @expectedExceptionMessage API response with error code
*/
public function testGetIdentityInternalServerError()
{
$mockedHttpClient = $this->mockClientResponse(
[],
500
);
$this->getProvider($mockedHttpClient)->getIdentity(
new AccessToken(
[
'access_token' => '123456789'
]
)
);
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidResponse
* @expectedExceptionMessage API response is not a valid JSON object
*/
public function testGetIdentityNotValidJSON()
{
$mockedHttpClient = $this->mockClientResponse(
'NOT VALID JSON',
200
);
$this->getProvider($mockedHttpClient)->getIdentity(
new AccessToken(
[
'access_token' => '123456789'
]
)
);
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidAccessToken
*/
public function testParseTokenNotToken()
{
$this->getProvider()->parseToken(
json_encode([])
);
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidAccessToken
*/
public function testParseTokenNotValidJSON()
{
$this->getProvider()->parseToken(
'lelelelel'
);
}
public function testParseTokenSuccess()
{
$expectedToken = 'XXXXXXXX';
$expectedUserId = 123456;
$accessToken = $this->getProvider()->parseToken(
json_encode(
[
'access_token' => $expectedToken,
'user_id' => $expectedUserId
]
)
);
parent::assertInstanceOf(AccessToken::class, $accessToken);
parent::assertSame($expectedToken, $accessToken->getToken());
parent::assertSame($expectedUserId, $accessToken->getUserId());
}
/**
* @expectedException \SocialConnect\OAuth2\Exception\Unauthorized
*/
public function testAccessDenied()
{
$sessionMock = $this->getMockBuilder(\SocialConnect\Provider\Session\Session::class)
->disableOriginalConstructor()
->disableProxyingToOriginalMethods()
->getMock();
$sessionMock->expects($this->once())
->method('get')
->willReturn(md5(time()));
$provider = $this->getProvider(null, $sessionMock);
$provider->getAccessTokenByRequestParameters(['error' => 'access_denied']);
}
public function testGenerateState()
{
$state = $this->callProtectedMethod($this->getProvider(), 'generateState', []);
parent::assertInternalType('string', $state);
parent::assertEquals(32, mb_strlen($state));
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class AmazonTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Amazon::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class BitbucketTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Bitbucket::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class DigitalOceanTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\DigitalOcean::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class DiscordTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Discord::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class FacebookTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Facebook::class;
}
}
@@ -0,0 +1,38 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
use SocialConnect\OAuth2\AccessToken;
class GitHubTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\GitHub::class;
}
public function testParseTokenSuccess()
{
$expectedToken = 'XXXXXXXX';
$accessToken = $this->getProvider()->parseToken(
http_build_query(
[
'access_token' => $expectedToken
],
null,
'&'
)
);
parent::assertInstanceOf(AccessToken::class, $accessToken);
parent::assertSame($expectedToken, $accessToken->getToken());
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class GitLabTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\GitLab::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class GoogleTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Google::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class InstagramTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Instagram::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Bogdan Popa https://github.com/icex <[email protected]>
*/
namespace Test\OAuth2\Provider;
class LinkedInTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\LinkedIn::class;
}
}
@@ -0,0 +1,40 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
use SocialConnect\OAuth2\AccessToken;
class MailRuTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\MailRu::class;
}
public function testParseTokenSuccess()
{
$expectedToken = 'XXXXXXXX';
$expectedUserId = 123456;
$accessToken = $this->getProvider()->parseToken(
json_encode(
[
'access_token' => $expectedToken,
// MailRU uses x_mailru_vid instead of user_id
'x_mailru_vid' => $expectedUserId
]
)
);
parent::assertInstanceOf(AccessToken::class, $accessToken);
parent::assertSame($expectedToken, $accessToken->getToken());
parent::assertSame($expectedUserId, $accessToken->getUserId());
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class MicrosoftTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Microsoft::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class OdnoklassnikiTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Odnoklassniki::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class RedditTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Reddit::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class SlackTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Slack::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class SteeinTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Steein::class;
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class TwitchTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Twitch::class;
}
}
@@ -0,0 +1,28 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class VimeoTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Vimeo::class;
}
public function testGetIdentityInternalServerError()
{
// Ignore this test for Vimeo
}
public function testGetIdentityNotValidJSON()
{
// Ignore this test for Vimeo
}
}
@@ -0,0 +1,127 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
use SocialConnect\Provider\Consumer;
use SocialConnect\OAuth2\AccessToken;
use SocialConnect\Common\Http\Client\ClientInterface;
use SocialConnect\Provider\Session\SessionInterface;
class VkTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Vk::class;
}
/**
* @param ClientInterface|null $httpClient
* @return \SocialConnect\OAuth2\Provider\Vk
*/
protected function getProvider(ClientInterface $httpClient = null, SessionInterface $session = null)
{
if (!$httpClient) {
$httpClient = $this->getMockBuilder(\SocialConnect\Common\Http\Client\Curl::class)
->disableOriginalConstructor()
->disableProxyingToOriginalMethods()
->getMock();
}
if (!$session) {
$session = $this->getMockBuilder(\SocialConnect\Provider\Session\Session::class)
->disableOriginalConstructor()
->disableProxyingToOriginalMethods()
->getMock();
}
return new \SocialConnect\OAuth2\Provider\Vk(
$httpClient,
$session,
new Consumer(
'unknown',
'unkwown'
),
[
'redirectUri' => 'http://localhost:8000/'
]
);
}
public function testMakeAccessTokenRequest()
{
$expectedCode = 'djsflkSdjflskdfjFlsd9';
$provider = $this->getProvider();
/** @var \SocialConnect\Common\Http\Request $request */
$request = parent::callProtectedMethod(
$provider,
'makeAccessTokenRequest',
[
$expectedCode
]
);
parent::assertInstanceOf(\SocialConnect\Common\Http\Request::class, $request);
parent::assertSame($provider->getRequestTokenUri(), $request->getUri());
}
public function testGetIdentitySuccess()
{
$mockedHttpClient = $this->mockClientResponse(
json_encode(
[
'response' => [
[
'id' => $expectedId = 12321312312312,
'first_name' => $expectedFirstname = 'Dmitry',
'last_name' => $expectedLastname = 'Patsura',
'sex' => 1,
]
]
]
)
);
$result = $this->getProvider($mockedHttpClient)->getIdentity(
new AccessToken(
[
'access_token' => '123456789'
]
)
);
parent::assertInstanceOf(\SocialConnect\Common\Entity\User::class, $result);
parent::assertSame($expectedId, $result->id);
parent::assertSame($expectedFirstname, $result->firstname);
parent::assertSame($expectedLastname, $result->lastname);
parent::assertSame('female', $result->sex);
}
/**
* @expectedException \SocialConnect\Provider\Exception\InvalidResponse
* @expectedExceptionMessage API response is not a valid JSON object
*/
public function testGetIdentityNotData()
{
$mockedHttpClient = $this->mockClientResponse(
[],
200
);
$result = $this->getProvider($mockedHttpClient)->getIdentity(
new AccessToken(
[
'access_token' => '123456789'
]
)
);
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class WordpressTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\WordPress::class;
}
}
@@ -0,0 +1,45 @@
<?php
/**
* SocialConnect project
*
* @author: Bogdan Popa https://github.com/icex <[email protected]>
*/
namespace Test\OAuth2\Provider;
use SocialConnect\OAuth2\AccessToken;
class YahooTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Yahoo::class;
}
/**
* @throws \SocialConnect\Provider\Exception\InvalidAccessToken
*/
public function testParseTokenSuccess()
{
$expectedToken = 'XXXXXXXX';
$expectedUserId = 'ETAPBOZJBRRBKZE6LLUMJYD3JA';
$accessToken = $this->getProvider()->parseToken(
json_encode(
[
'access_token' => $expectedToken,
// Yahoo uses xoauth_yahoo_guid instead of user_id
'xoauth_yahoo_guid' => $expectedUserId
]
)
);
parent::assertInstanceOf(AccessToken::class, $accessToken);
parent::assertSame($expectedToken, $accessToken->getToken());
parent::assertSame($expectedUserId, $accessToken->getUserId());
}
}
@@ -0,0 +1,18 @@
<?php
/**
* SocialConnect project
* @author: Patsura Dmitry https://github.com/ovr <[email protected]>
*/
namespace Test\OAuth2\Provider;
class YandexTest extends AbstractProviderTestCase
{
/**
* {@inheritdoc}
*/
protected function getProviderClassName()
{
return \SocialConnect\OAuth2\Provider\Yandex::class;
}
}