Вход Регистрация
Файл: vkolhoze.com/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php
Строк: 459
<?php

namespace GuzzleTestsPluginOauth;

use 
GuzzleHttpMessageRequestFactory;
use 
GuzzleHttpQueryAggregatorCommaAggregator;
use 
GuzzlePluginOauthOauthPlugin;
use 
GuzzleCommonEvent;

/**
 * @covers GuzzlePluginOauthOauthPlugin
 */
class OauthPluginTest extends GuzzleTestsGuzzleTestCase
{
    const 
TIMESTAMP '1327274290';
    const 
NONCE 'e7aa11195ca58349bec8b5ebe351d3497eb9e603';

    protected 
$config = array(
        
'consumer_key'    => 'foo',
        
'consumer_secret' => 'bar',
        
'token'           => 'count',
        
'token_secret'    => 'dracula'
    
);

    protected function 
getRequest()
    {
        return 
RequestFactory::getInstance()->create('POST''http://www.test.com/path?a=b&c=d'null, array(
            
'e' => 'f'
        
));
    }

    public function 
testSubscribesToEvents()
    {
        
$events OauthPlugin::getSubscribedEvents();
        
$this->assertArrayHasKey('request.before_send'$events);
    }

    public function 
testAcceptsConfigurationData()
    {
        
$p = new OauthPlugin($this->config);

        
// Access the config object
        
$class = new ReflectionClass($p);
        
$property $class->getProperty('config');
        
$property->setAccessible(true);
        
$config $property->getValue($p);

        
$this->assertEquals('foo'$config['consumer_key']);
        
$this->assertEquals('bar'$config['consumer_secret']);
        
$this->assertEquals('count'$config['token']);
        
$this->assertEquals('dracula'$config['token_secret']);
        
$this->assertEquals('1.0'$config['version']);
        
$this->assertEquals('HMAC-SHA1'$config['signature_method']);
        
$this->assertEquals('header'$config['request_method']);
    }

    public function 
testCreatesStringToSignFromPostRequest()
    {
        
$p = new OauthPlugin($this->config);
        
$request $this->getRequest();
        
$signString $p->getStringToSign($requestself::TIMESTAMPself::NONCE);

        
$this->assertContains('&e=f'rawurldecode($signString));

        
$expectedSignString =
            
// Method and URL
            
'POST&http%3A%2F%2Fwww.test.com%2Fpath' .
            
// Sorted parameters from query string and body
            
'&a%3Db%26c%3Dd%26e%3Df%26oauth_consumer_key%3Dfoo' .
            
'%26oauth_nonce%3De7aa11195ca58349bec8b5ebe351d3497eb9e603%26' .
            
'oauth_signature_method%3DHMAC-SHA1' .
            
'%26oauth_timestamp%3D' self::TIMESTAMP '%26oauth_token%3Dcount%26oauth_version%3D1.0';

        
$this->assertEquals($expectedSignString$signString);
    }

    public function 
testCreatesStringToSignIgnoringPostFields()
    {
        
$config $this->config;
        
$config['disable_post_params'] = true;
        
$p = new OauthPlugin($config);
        
$request $this->getRequest();
        
$sts rawurldecode($p->getStringToSign($requestself::TIMESTAMPself::NONCE));
        
$this->assertNotContains('&e=f'$sts);
    }

    public function 
testCreatesStringToSignFromPostRequestWithCustomContentType()
    {
        
$p = new OauthPlugin($this->config);
        
$request $this->getRequest();
        
$request->setHeader('Content-Type''Foo');
        
$this->assertEquals(
            
// Method and URL
            
'POST&http%3A%2F%2Fwww.test.com%2Fpath' .
            
// Sorted parameters from query string and body
            
'&a%3Db%26c%3Dd%26oauth_consumer_key%3Dfoo' .
            
'%26oauth_nonce%3D'self::NONCE .'%26' .
            
'oauth_signature_method%3DHMAC-SHA1' .
            
'%26oauth_timestamp%3D' self::TIMESTAMP '%26oauth_token%3Dcount%26oauth_version%3D1.0',
            
$p->getStringToSign($requestself::TIMESTAMPself::NONCE)
        );
    }

    
/**
     * @depends testCreatesStringToSignFromPostRequest
     */
    
public function testConvertsBooleansToStrings()
    {
        
$p = new OauthPlugin($this->config);
        
$request $this->getRequest();
        
$request->getQuery()->set('a'true);
        
$request->getQuery()->set('c'false);
        
$this->assertContains('&a%3Dtrue%26c%3Dfalse'$p->getStringToSign($requestself::TIMESTAMPself::NONCE));
    }

    public function 
testCreatesStringToSignFromPostRequestWithNullValues()
    {
        
$config = array(
            
'consumer_key'    => 'foo',
            
'consumer_secret' => 'bar',
            
'token'           => null,
            
'token_secret'    => 'dracula'
        
);

        
$p          = new OauthPlugin($config);
        
$request    $this->getRequest();
        
$signString $p->getStringToSign($requestself::TIMESTAMPself::NONCE);

        
$this->assertContains('&e=f'rawurldecode($signString));

        
$expectedSignString // Method and URL
                
'POST&http%3A%2F%2Fwww.test.com%2Fpath' .
                
// Sorted parameters from query string and body
                
'&a%3Db%26c%3Dd%26e%3Df%26oauth_consumer_key%3Dfoo' .
                
'%26oauth_nonce%3De7aa11195ca58349bec8b5ebe351d3497eb9e603%26' .
                
'oauth_signature_method%3DHMAC-SHA1' .
                
'%26oauth_timestamp%3D' self::TIMESTAMP '%26oauth_version%3D1.0';

        
$this->assertEquals($expectedSignString$signString);
    }

    
/**
     * @depends testCreatesStringToSignFromPostRequest
     */
    
public function testMultiDimensionalArray()
    {
        
$p = new OauthPlugin($this->config);
        
$request $this->getRequest();
        
$request->getQuery()->set('a', array('b' => array('e' => 'f''c' => 'd')));
        
$this->assertContains('a%255Bb%255D%255Bc%255D%3Dd%26a%255Bb%255D%255Be%255D%3Df%26c%3Dd%26e%3Df%26'$p->getStringToSign($requestself::TIMESTAMPself::NONCE));
    }

    
/**
     * @depends testMultiDimensionalArray
     */
    
public function testMultiDimensionalArrayWithNonDefaultQueryAggregator()
    {
        
$p = new OauthPlugin($this->config);
        
$request $this->getRequest();
        
$aggregator = new CommaAggregator();
        
$query $request->getQuery()->setAggregator($aggregator)
            ->
set('g', array('h''i''j'))
            ->
set('k', array('l'))
            ->
set('m', array('n''o'));
        
$this->assertContains('a%3Db%26c%3Dd%26e%3Df%26g%3Dh%2Ci%2Cj%26k%3Dl%26m%3Dn%2Co'$p->getStringToSign($requestself::TIMESTAMPself::NONCE));
    }

    
/**
     * @depends testCreatesStringToSignFromPostRequest
     */
    
public function testSignsStrings()
    {
        
$p = new OauthPlugin(array_merge($this->config, array(
            
'signature_callback' => function($string$key) {
                return 
"_{$string}|{$key}_";
            }
        )));
        
$request $this->getRequest();
        
$sig $p->getSignature($requestself::TIMESTAMPself::NONCE);
        
$this->assertEquals(
            
'_POST&http%3A%2F%2Fwww.test.com%2Fpath&a%3Db%26c%3Dd%26e%3Df%26oauth_consumer_key%3Dfoo' .
            
'%26oauth_nonce%3D'self::NONCE .'%26oauth_signature_method%3DHMAC-SHA1' .
            
'%26oauth_timestamp%3D' self::TIMESTAMP '%26oauth_token%3Dcount%26oauth_version%3D1.0|' .
            
'bar&dracula_',
            
base64_decode($sig)
        );
    }

    
/**
     * Test that the Oauth is signed correctly and that extra strings haven't been added
     * to the authorization header.
     */
    
public function testSignsOauthRequests()
    {
        
$p = new OauthPlugin($this->config);
        
$event = new Event(array(
            
'request' => $this->getRequest(),
            
'timestamp' => self::TIMESTAMP
        
));
        
$params $p->onRequestBeforeSend($event);

        
$this->assertTrue($event['request']->hasHeader('Authorization'));

        
$authorizationHeader = (string)$event['request']->getHeader('Authorization');

        
$this->assertStringStartsWith('OAuth '$authorizationHeader);

        
$stringsToCheck = array(
            
'oauth_consumer_key="foo"',
            
'oauth_nonce="'.urlencode($params['oauth_nonce']).'"',
            
'oauth_signature="'.urlencode($params['oauth_signature']).'"',
            
'oauth_signature_method="HMAC-SHA1"',
            
'oauth_timestamp="' self::TIMESTAMP '"',
            
'oauth_token="count"',
            
'oauth_version="1.0"',
        );

        
$totalLength strlen('OAuth ');

        
//Separator is not used before first parameter.
        
$separator '';

        foreach (
$stringsToCheck as $stringToCheck) {
            
$this->assertContains($stringToCheck$authorizationHeader);
            
$totalLength += strlen($separator);
            
$totalLength += strlen($stringToCheck);
            
$separator ', ';
        }

        
// Technically this test is not universally valid. It would be allowable to have extra n characters
        // in the Authorization header. However Guzzle does not do this, so we just perform a simple check
        // on length to validate the Authorization header is composed of only the strings above.
        
$this->assertEquals($totalLengthstrlen($authorizationHeader), 'Authorization has extra characters i.e. contains extra elements compared to stringsToCheck.');
    }

    public function 
testSignsOauthQueryStringRequest()
    {
        
$config array_merge(
            
$this->config,
            array(
'request_method' => OauthPlugin::REQUEST_METHOD_QUERY)
        );

        
$p = new OauthPlugin($config);
        
$event = new Event(array(
            
'request' => $this->getRequest(),
            
'timestamp' => self::TIMESTAMP
        
));
        
$params $p->onRequestBeforeSend($event);

        
$this->assertFalse($event['request']->hasHeader('Authorization'));

        
$stringsToCheck = array(
            
'a=b',
            
'c=d',
            
'oauth_consumer_key=foo',
            
'oauth_nonce='.urlencode($params['oauth_nonce']),
            
'oauth_signature='.urlencode($params['oauth_signature']),
            
'oauth_signature_method=HMAC-SHA1',
            
'oauth_timestamp='.self::TIMESTAMP,
            
'oauth_token=count',
            
'oauth_version=1.0',
        );

        
$queryString = (string) $event['request']->getQuery();

        
$totalLength strlen('?');

        
//Separator is not used before first parameter.
        
$separator '';

        foreach (
$stringsToCheck as $stringToCheck) {
            
$this->assertContains($stringToCheck$queryString);
            
$totalLength += strlen($separator);
            
$totalLength += strlen($stringToCheck);
            
$separator '&';
        }

        
// Removes the last query string separator '&'
        
$totalLength -= 1;

        
$this->assertEquals($totalLengthstrlen($queryString), 'Query string has extra characters i.e. contains extra elements compared to stringsToCheck.');
    }

    
/**
     * @expectedException InvalidArgumentException
     */
    
public function testInvalidArgumentExceptionOnMethodError()
    {
        
$config array_merge(
            
$this->config,
            array(
'request_method' => 'FakeMethod')
        );

        
$p = new OauthPlugin($config);
        
$event = new Event(array(
            
'request' => $this->getRequest(),
            
'timestamp' => self::TIMESTAMP
        
));

        
$p->onRequestBeforeSend($event);
    }

    public function 
testDoesNotAddFalseyValuesToAuthorization()
    {
        unset(
$this->config['token']);
        
$p = new OauthPlugin($this->config);
        
$event = new Event(array('request' => $this->getRequest(), 'timestamp' => self::TIMESTAMP));
        
$p->onRequestBeforeSend($event);
        
$this->assertTrue($event['request']->hasHeader('Authorization'));
        
$this->assertNotContains('oauth_token=', (string) $event['request']->getHeader('Authorization'));
    }

    public function 
testOptionalOauthParametersAreNotAutomaticallyAdded()
    {
        
// The only required Oauth parameters are the consumer key and secret. That is enough credentials
        // for signing oauth requests.
         
$config = array(
            
'consumer_key'    => 'foo',
            
'consumer_secret' => 'bar',
        );

        
$plugin = new OauthPlugin($config);
        
$event = new Event(array(
            
'request' => $this->getRequest(),
            
'timestamp' => self::TIMESTAMP
        
));

        
$timestamp $plugin->getTimestamp($event);
        
$request $event['request'];
        
$nonce $plugin->generateNonce($request);

        
$paramsToSign $plugin->getParamsToSign($request$timestamp$nonce);

        
$optionalParams = array(
            
'callback'      => 'oauth_callback',
            
'token'         => 'oauth_token',
            
'verifier'      => 'oauth_verifier',
            
'token_secret'  => 'token_secret'
        
);

        foreach (
$optionalParams as $optionName => $oauthName) {
            
$this->assertArrayNotHasKey($oauthName$paramsToSign"Optional Oauth param '$oauthName' was not set via config variable '$optionName', but it is listed in getParamsToSign().");
        }
    }
}
Онлайн: 0
Реклама