You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							251 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
	
	
							251 lines
						
					
					
						
							6.9 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace yiiunit\extensions\authclient; | 
						|
 | 
						|
use yii\authclient\signature\PlainText; | 
						|
use yii\authclient\OAuthToken; | 
						|
use yiiunit\extensions\authclient\TestCase; | 
						|
use yii\authclient\BaseOAuth; | 
						|
 | 
						|
class BaseOAuthTest extends TestCase | 
						|
{ | 
						|
	/** | 
						|
	 * Creates test OAuth client instance. | 
						|
	 * @return BaseOAuth oauth client. | 
						|
	 */ | 
						|
	protected function createOAuthClient() | 
						|
	{ | 
						|
		$oauthClient = $this->getMock(BaseOAuth::className(), ['setState', 'getState', 'composeRequestCurlOptions', 'refreshAccessToken', 'apiInternal']); | 
						|
		$oauthClient->expects($this->any())->method('setState')->will($this->returnValue($oauthClient)); | 
						|
		$oauthClient->expects($this->any())->method('getState')->will($this->returnValue(null)); | 
						|
		return $oauthClient; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Invokes the OAuth client method even if it is protected. | 
						|
	 * @param BaseOAuth $oauthClient OAuth client instance. | 
						|
	 * @param string $methodName name of the method to be invoked. | 
						|
	 * @param array $arguments method arguments. | 
						|
	 * @return mixed method invoke result. | 
						|
	 */ | 
						|
	protected function invokeOAuthClientMethod($oauthClient, $methodName, array $arguments = []) | 
						|
	{ | 
						|
		$classReflection = new \ReflectionClass(get_class($oauthClient)); | 
						|
		$methodReflection = $classReflection->getMethod($methodName); | 
						|
		$methodReflection->setAccessible(true); | 
						|
		$result = $methodReflection->invokeArgs($oauthClient, $arguments); | 
						|
		$methodReflection->setAccessible(false); | 
						|
		return $result; | 
						|
	} | 
						|
 | 
						|
	// Tests : | 
						|
 | 
						|
	public function testSetGet() | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
 | 
						|
		$returnUrl = 'http://test.return.url'; | 
						|
		$oauthClient->setReturnUrl($returnUrl); | 
						|
		$this->assertEquals($returnUrl, $oauthClient->getReturnUrl(), 'Unable to setup return URL!'); | 
						|
 | 
						|
		$curlOptions = [ | 
						|
			'option1' => 'value1', | 
						|
			'option2' => 'value2', | 
						|
		]; | 
						|
		$oauthClient->setCurlOptions($curlOptions); | 
						|
		$this->assertEquals($curlOptions, $oauthClient->getCurlOptions(), 'Unable to setup cURL options!'); | 
						|
	} | 
						|
 | 
						|
	public function testSetupComponents() | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
 | 
						|
		$oauthToken = new OAuthToken(); | 
						|
		$oauthClient->setAccessToken($oauthToken); | 
						|
		$this->assertEquals($oauthToken, $oauthClient->getAccessToken(), 'Unable to setup token!'); | 
						|
 | 
						|
		$oauthSignatureMethod = new PlainText(); | 
						|
		$oauthClient->setSignatureMethod($oauthSignatureMethod); | 
						|
		$this->assertEquals($oauthSignatureMethod, $oauthClient->getSignatureMethod(), 'Unable to setup signature method!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @depends testSetupComponents | 
						|
	 */ | 
						|
	public function testSetupComponentsByConfig() | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
 | 
						|
		$oauthToken = [ | 
						|
			'token' => 'test_token', | 
						|
			'tokenSecret' => 'test_token_secret', | 
						|
		]; | 
						|
		$oauthClient->setAccessToken($oauthToken); | 
						|
		$this->assertEquals($oauthToken['token'], $oauthClient->getAccessToken()->getToken(), 'Unable to setup token as config!'); | 
						|
 | 
						|
		$oauthSignatureMethod = [ | 
						|
			'class' => 'yii\authclient\signature\PlainText' | 
						|
		]; | 
						|
		$oauthClient->setSignatureMethod($oauthSignatureMethod); | 
						|
		$returnedSignatureMethod = $oauthClient->getSignatureMethod(); | 
						|
		$this->assertEquals($oauthSignatureMethod['class'], get_class($returnedSignatureMethod), 'Unable to setup signature method as config!'); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Data provider for [[testComposeUrl()]]. | 
						|
	 * @return array test data. | 
						|
	 */ | 
						|
	public function composeUrlDataProvider() | 
						|
	{ | 
						|
		return [ | 
						|
			[ | 
						|
				'http://test.url', | 
						|
				[ | 
						|
					'param1' => 'value1', | 
						|
					'param2' => 'value2', | 
						|
				], | 
						|
				'http://test.url?param1=value1¶m2=value2', | 
						|
			], | 
						|
			[ | 
						|
				'http://test.url?with=some', | 
						|
				[ | 
						|
					'param1' => 'value1', | 
						|
					'param2' => 'value2', | 
						|
				], | 
						|
				'http://test.url?with=some¶m1=value1¶m2=value2', | 
						|
			], | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @dataProvider composeUrlDataProvider | 
						|
	 * | 
						|
	 * @param string $url request URL. | 
						|
	 * @param array $params request params | 
						|
	 * @param string $expectedUrl expected composed URL. | 
						|
	 */ | 
						|
	public function testComposeUrl($url, array $params, $expectedUrl) | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
		$composedUrl = $this->invokeOAuthClientMethod($oauthClient, 'composeUrl', [$url, $params]); | 
						|
		$this->assertEquals($expectedUrl, $composedUrl); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Data provider for {@link testDetermineContentTypeByHeaders}. | 
						|
	 * @return array test data. | 
						|
	 */ | 
						|
	public function determineContentTypeByHeadersDataProvider() | 
						|
	{ | 
						|
		return [ | 
						|
			[ | 
						|
				['content_type' => 'application/json'], | 
						|
				'json' | 
						|
			], | 
						|
			[ | 
						|
				['content_type' => 'application/x-www-form-urlencoded'], | 
						|
				'urlencoded' | 
						|
			], | 
						|
			[ | 
						|
				['content_type' => 'application/xml'], | 
						|
				'xml' | 
						|
			], | 
						|
			[ | 
						|
				['some_header' => 'some_header_value'], | 
						|
				'auto' | 
						|
			], | 
						|
			[ | 
						|
				['content_type' => 'unknown'], | 
						|
				'auto' | 
						|
			], | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @dataProvider determineContentTypeByHeadersDataProvider | 
						|
	 * | 
						|
	 * @param array $headers request headers. | 
						|
	 * @param string $expectedResponseType expected response type. | 
						|
	 */ | 
						|
	public function testDetermineContentTypeByHeaders(array $headers, $expectedResponseType) | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
		$responseType = $this->invokeOAuthClientMethod($oauthClient, 'determineContentTypeByHeaders', [$headers]); | 
						|
		$this->assertEquals($expectedResponseType, $responseType); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Data provider for [[testDetermineContentTypeByRaw]]. | 
						|
	 * @return array test data. | 
						|
	 */ | 
						|
	public function determineContentTypeByRawDataProvider() | 
						|
	{ | 
						|
		return array( | 
						|
			['{name: value}', 'json'], | 
						|
			['name=value', 'urlencoded'], | 
						|
			['name1=value1&name2=value2', 'urlencoded'], | 
						|
			['<?xml version="1.0" encoding="UTF-8"?><tag>Value</tag>', 'xml'], | 
						|
			['<tag>Value</tag>', 'xml'], | 
						|
		); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @dataProvider determineContentTypeByRawDataProvider | 
						|
	 * | 
						|
	 * @param string $rawResponse raw response content. | 
						|
	 * @param string $expectedResponseType expected response type. | 
						|
	 */ | 
						|
	public function testDetermineContentTypeByRaw($rawResponse, $expectedResponseType) | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
		$responseType = $this->invokeOAuthClientMethod($oauthClient, 'determineContentTypeByRaw', [$rawResponse]); | 
						|
		$this->assertEquals($expectedResponseType, $responseType); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Data provider for [[testApiUrl]]. | 
						|
	 * @return array test data. | 
						|
	 */ | 
						|
	public function apiUrlDataProvider() | 
						|
	{ | 
						|
		return [ | 
						|
			[ | 
						|
				'http://api.base.url', | 
						|
				'sub/url', | 
						|
				'http://api.base.url/sub/url', | 
						|
			], | 
						|
			[ | 
						|
				'http://api.base.url', | 
						|
				'http://api.base.url/sub/url', | 
						|
				'http://api.base.url/sub/url', | 
						|
			], | 
						|
			[ | 
						|
				'http://api.base.url', | 
						|
				'https://api.base.url/sub/url', | 
						|
				'https://api.base.url/sub/url', | 
						|
			], | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @dataProvider apiUrlDataProvider | 
						|
	 * | 
						|
	 * @param $apiBaseUrl | 
						|
	 * @param $apiSubUrl | 
						|
	 * @param $expectedApiFullUrl | 
						|
	 */ | 
						|
	public function testApiUrl($apiBaseUrl, $apiSubUrl, $expectedApiFullUrl) | 
						|
	{ | 
						|
		$oauthClient = $this->createOAuthClient(); | 
						|
		$oauthClient->expects($this->any())->method('apiInternal')->will($this->returnArgument(1)); | 
						|
 | 
						|
		$accessToken = new OAuthToken(); | 
						|
		$accessToken->setToken('test_access_token'); | 
						|
		$accessToken->setExpireDuration(1000); | 
						|
		$oauthClient->setAccessToken($accessToken); | 
						|
 | 
						|
		$oauthClient->apiBaseUrl = $apiBaseUrl; | 
						|
 | 
						|
		$this->assertEquals($expectedApiFullUrl, $oauthClient->api($apiSubUrl)); | 
						|
	} | 
						|
} |