summaryrefslogtreecommitdiff
path: root/vendor/lusitanian/oauth
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/lusitanian/oauth')
-rw-r--r--vendor/lusitanian/oauth/.gitignore6
-rw-r--r--vendor/lusitanian/oauth/.scrutinizer.yml37
-rw-r--r--vendor/lusitanian/oauth/.travis.yml22
-rw-r--r--vendor/lusitanian/oauth/LICENSE20
-rw-r--r--vendor/lusitanian/oauth/README.md102
-rw-r--r--vendor/lusitanian/oauth/composer.json40
-rw-r--r--vendor/lusitanian/oauth/examples/amazon.php52
-rw-r--r--vendor/lusitanian/oauth/examples/bitbucket.php64
-rw-r--r--vendor/lusitanian/oauth/examples/bitly.php53
-rw-r--r--vendor/lusitanian/oauth/examples/bootstrap.php29
-rw-r--r--vendor/lusitanian/oauth/examples/box.php58
-rw-r--r--vendor/lusitanian/oauth/examples/buffer.php53
-rw-r--r--vendor/lusitanian/oauth/examples/dailymotion.php52
-rw-r--r--vendor/lusitanian/oauth/examples/dropbox.php52
-rw-r--r--vendor/lusitanian/oauth/examples/etsy.php59
-rw-r--r--vendor/lusitanian/oauth/examples/facebook.php54
-rw-r--r--vendor/lusitanian/oauth/examples/fitbit.php61
-rw-r--r--vendor/lusitanian/oauth/examples/flickr.php80
-rw-r--r--vendor/lusitanian/oauth/examples/foursquare.php53
-rw-r--r--vendor/lusitanian/oauth/examples/github.php52
-rw-r--r--vendor/lusitanian/oauth/examples/google.php53
-rw-r--r--vendor/lusitanian/oauth/examples/harvest.php74
-rw-r--r--vendor/lusitanian/oauth/examples/init.example.php136
-rw-r--r--vendor/lusitanian/oauth/examples/instagram.php56
-rw-r--r--vendor/lusitanian/oauth/examples/linkedin.php57
-rw-r--r--vendor/lusitanian/oauth/examples/mailchimp.php55
-rw-r--r--vendor/lusitanian/oauth/examples/microsoft.php49
-rw-r--r--vendor/lusitanian/oauth/examples/paypal.php52
-rw-r--r--vendor/lusitanian/oauth/examples/pocket.php63
-rw-r--r--vendor/lusitanian/oauth/examples/reddit.php54
-rw-r--r--vendor/lusitanian/oauth/examples/runkeeper.php51
-rw-r--r--vendor/lusitanian/oauth/examples/scoopit.php57
-rw-r--r--vendor/lusitanian/oauth/examples/soundcloud.php53
-rw-r--r--vendor/lusitanian/oauth/examples/tumblr.php62
-rw-r--r--vendor/lusitanian/oauth/examples/twitter.php62
-rw-r--r--vendor/lusitanian/oauth/examples/ustream.php54
-rw-r--r--vendor/lusitanian/oauth/examples/yahoo.php57
-rw-r--r--vendor/lusitanian/oauth/phpunit.xml.dist45
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/AutoLoader.php81
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Consumer/Credentials.php60
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Consumer/CredentialsInterface.php24
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Exception/Exception.php10
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php73
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/ClientInterface.php32
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php142
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php92
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Exception/TokenResponseException.php12
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/Uri.php408
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactory.php168
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactoryInterface.php42
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriInterface.php133
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php100
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Service/ServiceInterface.php49
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php10
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/StorageException.php12
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/TokenNotFoundException.php10
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php139
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php230
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php188
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php200
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php98
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php128
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Token/Exception/ExpiredTokenException.php12
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/Common/Token/TokenInterface.php64
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php305
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/BitBucket.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php132
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/FitBit.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php91
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ServiceInterface.php45
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Tumblr.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php121
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php96
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php12
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Signature.php132
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/SignatureInterface.php28
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/StdOAuth1Token.php75
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/TokenInterface.php41
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php333
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Amazon.php97
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php111
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php88
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php151
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dailymotion.php129
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dropbox.php111
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php12
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php10
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php17
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php17
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php193
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php81
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php208
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php158
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php157
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Heroku.php123
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php85
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php102
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php115
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php119
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Paypal.php103
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php125
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php114
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/RunKeeper.php105
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php92
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php37
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/SoundCloud.php77
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php98
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php109
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Yammer.php82
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/StdOAuth2Token.php13
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/TokenInterface.php9
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php229
-rw-r--r--vendor/lusitanian/oauth/src/OAuth/bootstrap.php13
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/Common/FakeProject/NS/SomeClass.php11
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/Common/Service/Mock.php60
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Fake.php57
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Mock.php35
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Fake.php32
-rw-r--r--vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Mock.php58
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/AutoloaderTest.php126
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Consumer/CredentialsTest.php51
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/AbstractClientTest.php67
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/CurlClientTest.php378
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/StreamClientTest.php283
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/HttpClientsTest.php171
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriFactoryTest.php331
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriTest.php898
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Service/AbstractServiceTest.php171
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Storage/MemoryTest.php132
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Storage/RedisTest.php102
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Storage/SessionTest.php245
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Storage/StorageTest.php74
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Storage/SymfonySessionTest.php111
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/Common/Token/AbstractTokenTest.php189
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/AbstractServiceTest.php215
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/BitBucketTest.php278
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/EtsyTest.php286
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FitBitTest.php278
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FlickrTest.php302
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/ScoopItTest.php302
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TumblrTest.php278
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TwitterTest.php307
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/XingTest.php239
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/YahooTest.php302
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Signature/SignatureTest.php325
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth1/Token/StdOAuth1TokenTest.php85
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AbstractServiceTest.php401
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AmazonTest.php207
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BitlyTest.php150
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BoxTest.php207
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BufferTest.php150
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DailymotionTest.php230
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DropboxTest.php231
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FacebookTest.php242
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FoursquareTest.php197
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GitHubTest.php220
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GoogleTest.php195
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/HerokuTest.php261
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/InstagramTest.php193
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/LinkedinTest.php213
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MailchimpTest.php179
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MicrosoftTest.php193
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/PaypalTest.php213
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RedditTest.php193
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RunKeeperTest.php207
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/SoundCloudTest.php159
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/UstreamTest.php193
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/VkontakteTest.php159
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/YammerTest.php187
-rw-r--r--vendor/lusitanian/oauth/tests/Unit/ServiceFactoryTest.php311
-rw-r--r--vendor/lusitanian/oauth/tests/bootstrap.php42
173 files changed, 21699 insertions, 0 deletions
diff --git a/vendor/lusitanian/oauth/.gitignore b/vendor/lusitanian/oauth/.gitignore
new file mode 100644
index 00000000..1721c572
--- /dev/null
+++ b/vendor/lusitanian/oauth/.gitignore
@@ -0,0 +1,6 @@
+.idea
+vendor
+.DS_Store
+composer.lock
+examples/init.php
+atlassian-ide-plugin.xml
diff --git a/vendor/lusitanian/oauth/.scrutinizer.yml b/vendor/lusitanian/oauth/.scrutinizer.yml
new file mode 100644
index 00000000..5a274c98
--- /dev/null
+++ b/vendor/lusitanian/oauth/.scrutinizer.yml
@@ -0,0 +1,37 @@
+before_commands:
+ - "composer install --dev --prefer-source"
+
+tools:
+ php_code_coverage:
+ enabled: true
+ test_command: phpunit -c phpunit.xml.dist
+ filter:
+ paths: ["src/*"]
+ php_code_sniffer:
+ enabled: true
+ config:
+ standard: PSR2
+ filter:
+ paths: ["src/*"]
+ php_cpd:
+ enabled: true
+ excluded_dirs: ["examples", "tests", "vendor"]
+ php_cs_fixer:
+ enabled: true
+ config:
+ level: all
+ filter:
+ paths: ["src/*", "tests/*"]
+ php_loc:
+ enabled: true
+ php_mess_detector:
+ enabled: true
+ filter:
+ paths: ["src/*"]
+ php_pdepend:
+ enabled: true
+ excluded_dirs: ["tests", "examples", "vendor"]
+ php_analyzer:
+ filter:
+ paths: ["src/*", "tests/*"]
+ sensiolabs_security_checker: true
diff --git a/vendor/lusitanian/oauth/.travis.yml b/vendor/lusitanian/oauth/.travis.yml
new file mode 100644
index 00000000..fe927478
--- /dev/null
+++ b/vendor/lusitanian/oauth/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+matrix:
+ allow_failures:
+ - php: hhvm
+
+before_script:
+ - composer self-update
+ - composer install
+ - pyrus install pear/PHP_CodeSniffer
+ - phpenv rehash
+
+script:
+ - phpcs --standard=psr2 src/
+ - phpunit --coverage-text
diff --git a/vendor/lusitanian/oauth/LICENSE b/vendor/lusitanian/oauth/LICENSE
new file mode 100644
index 00000000..cea529be
--- /dev/null
+++ b/vendor/lusitanian/oauth/LICENSE
@@ -0,0 +1,20 @@
+(c) 2013 David Desberg <david@daviddesberg.com>
+Contributions (c) 2013 Pieter Hordijk <info@pieterhordijk.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/lusitanian/oauth/README.md b/vendor/lusitanian/oauth/README.md
new file mode 100644
index 00000000..e7c2f792
--- /dev/null
+++ b/vendor/lusitanian/oauth/README.md
@@ -0,0 +1,102 @@
+PHPoAuthLib
+===========
+PHPoAuthLib provides oAuth support in PHP 5.3+ and is very easy to integrate with any project which requires an oAuth client.
+
+[![Build Status](https://travis-ci.org/Lusitanian/PHPoAuthLib.png?branch=master)](https://travis-ci.org/Lusitanian/PHPoAuthLib)
+[![Code Coverage](https://scrutinizer-ci.com/g/Lusitanian/PHPoAuthLib/badges/coverage.png?s=a0a15bebfda49e79f9ce289b00c6dfebd18fc98e)](https://scrutinizer-ci.com/g/Lusitanian/PHPoAuthLib/)
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/Lusitanian/PHPoAuthLib/badges/quality-score.png?s=c5976d2fefceb501f0d886c1a5bf087e69b44533)](https://scrutinizer-ci.com/g/Lusitanian/PHPoAuthLib/)
+[![Latest Stable Version](https://poser.pugx.org/lusitanian/oauth/v/stable.png)](https://packagist.org/packages/lusitanian/oauth)
+[![Total Downloads](https://poser.pugx.org/lusitanian/oauth/downloads.png)](https://packagist.org/packages/lusitanian/oauth)
+
+Installation
+------------
+This library can be found on [Packagist](https://packagist.org/packages/lusitanian/oauth).
+The recommended way to install this is through [composer](http://getcomposer.org).
+
+Edit your `composer.json` and add:
+
+```json
+{
+ "require": {
+ "lusitanian/oauth": "~0.3"
+ }
+}
+```
+
+And install dependencies:
+
+```bash
+$ curl -sS https://getcomposer.org/installer | php
+$ php composer.phar install
+```
+
+Features
+--------
+- PSR-0 compliant for easy interoperability
+- Fully extensible in every facet.
+ - You can implement any service with any custom requirements by extending the protocol version's `AbstractService` implementation.
+ - You can use any HTTP client you desire, just create a class utilizing it which implements `OAuth\Common\Http\ClientInterface` (two implementations are included)
+ - You can use any storage mechanism for tokens. By default, session, in-memory and Redis.io (requires PHPRedis) storage mechanisms are included. Implement additional mechanisms by implementing `OAuth\Common\Token\TokenStorageInterface`.
+
+Service support
+---------------
+The library supports both oAuth 1.x and oAuth 2.0 compliant services. A list of currently implemented services can be found below.
+
+Included service implementations
+--------------------------------
+- OAuth1
+ - BitBucket
+ - Etsy
+ - FitBit
+ - Flickr
+ - Scoop.it!
+ - Tumblr
+ - Twitter
+ - Xing
+ - Yahoo
+- OAuth2
+ - Amazon
+ - BitLy
+ - Box
+ - Dailymotion
+ - Dropbox
+ - Facebook
+ - Foursquare
+ - GitHub
+ - Google
+ - Harvest
+ - Heroku
+ - Instagram
+ - LinkedIn
+ - Mailchimp
+ - Microsoft
+ - PayPal
+ - Pocket
+ - Reddit
+ - RunKeeper
+ - SoundCloud
+ - Ustream
+ - Vkontakte
+ - Yammer
+- more to come!
+
+Examples
+--------
+Examples of basic usage are located in the examples/ directory.
+
+Usage
+------
+For usage with complete auth flow, please see the examples. More in-depth documentation will come with release 1.0.
+
+Framework Integration
+---------------------
+* Lithium: Sébastien Charrier has written [an adapter](https://github.com/scharrier/li3_socialauth) for the library.
+* Laravel 4: Dariusz PrzÄ…da has written [a service provider](https://github.com/artdarek/oauth-4-laravel) for the library.
+
+Extensions
+----------
+* Extract normalized user data from OAuth Services with the library [PHPoAuthUserData](https://github.com/Oryzone/PHPoAuthUserData) by Luciano Mammino
+
+Tests
+------
+To run the tests, you must install dependencies with `composer install --dev`
diff --git a/vendor/lusitanian/oauth/composer.json b/vendor/lusitanian/oauth/composer.json
new file mode 100644
index 00000000..cc0bdcf2
--- /dev/null
+++ b/vendor/lusitanian/oauth/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "lusitanian/oauth",
+ "description": "PHP 5.3+ oAuth 1/2 Library",
+ "keywords": ["oauth", "authentication", "authorization", "security"],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "David Desberg",
+ "email": "david@daviddesberg.com"
+ },
+ {
+ "name": "Pieter Hordijk",
+ "email": "info@pieterhordijk.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "symfony/http-foundation": "~2.1",
+ "predis/predis": "0.8.*@dev",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "suggest": {
+ "symfony/http-foundation": "Allows using the Symfony Session storage backend.",
+ "predis/predis": "Allows using the Redis storage backend.",
+ "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client."
+ },
+ "autoload": {
+ "psr-0": {
+ "OAuth": "src",
+ "OAuth\\Unit": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ }
+}
diff --git a/vendor/lusitanian/oauth/examples/amazon.php b/vendor/lusitanian/oauth/examples/amazon.php
new file mode 100644
index 00000000..0798eafc
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/amazon.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Amazon service
+ *
+ * PHP version 5.4
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Amazon;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['amazon']['key'],
+ $servicesCredentials['amazon']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Amazon service using the credentials, http client, storage mechanism for the token and profile scope
+/** @var $amazonService Amazon */
+$amazonService = $serviceFactory->createService('amazon', $credentials, $storage, array('profile'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from Amazon, get the token
+ $token = $amazonService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($amazonService->request('/user/profile'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique Amazon user id is: ' . $result['user_id'] . ' and your name is ' . $result['name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $amazonService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Amazon!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/bitbucket.php b/vendor/lusitanian/oauth/examples/bitbucket.php
new file mode 100644
index 00000000..d9330961
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/bitbucket.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token from the BitBucket service
+ *
+ * PHP version 5.4
+ * @author Ændrew Rininsland <me@aendrew.com>
+ *
+ * Shamelessly cribbed from work by:
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\BitBucket;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// We need to use a persistent storage to save the token, because oauth1 requires the token secret received before'
+// the redirect (request token request) in the access token request.
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['bitbucket']['key'],
+ $servicesCredentials['bitbucket']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the BitBucket service using the credentials, http client and storage mechanism for the token
+/** @var $bbService BitBucket */
+$bbService = $serviceFactory->createService('BitBucket', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('BitBucket');
+
+ // This was a callback request from BitBucket, get the token
+ $bbService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($bbService->request('user/repositories'));
+
+ echo('The first repo in the list is ' . $result[0]->name);
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $bbService->requestRequestToken();
+
+ $url = $bbService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with BitBucket!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/bitly.php b/vendor/lusitanian/oauth/examples/bitly.php
new file mode 100644
index 00000000..9cd27e34
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/bitly.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Bitly service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Bitly;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['bitly']['key'],
+ $servicesCredentials['bitly']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Bitly service using the credentials, http client and storage mechanism for the token
+/** @var $bitlyService Bitly */
+$bitlyService = $serviceFactory->createService('bitly', $credentials, $storage);
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from bitly, get the token
+ $bitlyService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($bitlyService->request('user/info'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique user id is: ' . $result['data']['login'] . ' and your name is ' . $result['data']['display_name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $bitlyService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Bitly!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/bootstrap.php b/vendor/lusitanian/oauth/examples/bootstrap.php
new file mode 100644
index 00000000..f02da414
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/bootstrap.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Bootstrap the library
+ */
+require_once __DIR__ . '/../vendor/autoload.php';
+
+/**
+ * Setup error reporting
+ */
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+
+/**
+ * Setup the timezone
+ */
+ini_set('date.timezone', 'Europe/Amsterdam');
+
+/**
+ * Create a new instance of the URI class with the current URI, stripping the query string
+ */
+$uriFactory = new \OAuth\Common\Http\Uri\UriFactory();
+$currentUri = $uriFactory->createFromSuperGlobalArray($_SERVER);
+$currentUri->setQuery('');
+
+/**
+ * Load the credential for the different services
+ */
+require_once __DIR__ . '/init.php';
diff --git a/vendor/lusitanian/oauth/examples/box.php b/vendor/lusitanian/oauth/examples/box.php
new file mode 100644
index 00000000..f1b06443
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/box.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Box service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @author Antoine Corcy <contact@sbin.dk>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Box;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['box']['key'],
+ $servicesCredentials['box']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Box service using the credentials, http client and storage mechanism for the token
+/** @var $boxService Box */
+$boxService = $serviceFactory->createService('box', $credentials, $storage);
+
+if (!empty($_GET['code'])) {
+ // retrieve the CSRF state parameter
+ $state = isset($_GET['state']) ? $_GET['state'] : null;
+
+ // This was a callback request from box, get the token
+ $token = $boxService->requestAccessToken($_GET['code'], $state);
+
+ // Send a request with it
+ $result = json_decode($boxService->request('/users/me'), true);
+
+ // Show some of the resultant data
+ echo 'Your Box name is ' . $result['name'] . ' and your email is ' . $result['login'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $boxService->getAuthorizationUri();
+ // var_dump($url);
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Box!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/buffer.php b/vendor/lusitanian/oauth/examples/buffer.php
new file mode 100644
index 00000000..c1b9ddde
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/buffer.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Buffer service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Buffer;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['buffer']['key'],
+ $servicesCredentials['buffer']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the buffer service using the credentials, http client and storage mechanism for the token
+/** @var $bufferService buffer */
+$bufferService = $serviceFactory->createService('buffer', $credentials, $storage);
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from buffer, get the token
+ $bufferService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($bufferService->request('user.json'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique user id is: ' . $result['id'] . ' and your plan is ' . $result['plan'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $bufferService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with buffer!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/dailymotion.php b/vendor/lusitanian/oauth/examples/dailymotion.php
new file mode 100644
index 00000000..53f0878a
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/dailymotion.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Dailymotion service
+ *
+ * PHP version 5.4
+ *
+ * @author Mouhamed SEYE <mouhamed@seye.pro>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Dailymotion;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['dailymotion']['key'],
+ $servicesCredentials['dailymotion']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Dailymotion service using the credentials, http client, storage mechanism for the token and email scope
+/** @var $dailymotionService Dailymotion */
+$dailymotionService = $serviceFactory->createService('dailymotion', $credentials, $storage, array('email'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from Dailymotion, get the token
+ $token = $dailymotionService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($dailymotionService->request('/me?fields=email,id'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique Dailymotion user id is: ' . $result['id'] . ' and your email is ' . $result['email'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $dailymotionService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Dailymotion!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/dropbox.php b/vendor/lusitanian/oauth/examples/dropbox.php
new file mode 100644
index 00000000..0d60551c
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/dropbox.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Dropbox service
+ *
+ * PHP version 5.4
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Dropbox;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['dropbox']['key'],
+ $servicesCredentials['dropbox']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Dropbox service using the credentials, http client and storage mechanism for the token
+/** @var $dropboxService Dropbox */
+$dropboxService = $serviceFactory->createService('dropbox', $credentials, $storage, array());
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from Dropbox, get the token
+ $token = $dropboxService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($dropboxService->request('/account/info'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique Dropbox user id is: ' . $result['uid'] . ' and your name is ' . $result['display_name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $dropboxService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Dropbox!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/etsy.php b/vendor/lusitanian/oauth/examples/etsy.php
new file mode 100644
index 00000000..0c0b79b7
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/etsy.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Etsy service
+ *
+ * PHP version 5.4
+ *
+ * @author Iñaki Abete <inakiabt+github@gmail.com>
+ * @copyright Copyright (c) 2013 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\Etsy;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['etsy']['key'],
+ $servicesCredentials['etsy']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Etsy service using the credentials, http client and storage mechanism for the token
+/** @var $etsyService Etsy */
+$etsyService = $serviceFactory->createService('Etsy', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('Etsy');
+
+ // This was a callback request from Etsy, get the token
+ $etsyService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($etsyService->request('/private/users/__SELF__'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $response = $etsyService->requestRequestToken();
+ $extra = $response->getExtraParams();
+ $url = $extra['login_url'];
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Etsy!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/facebook.php b/vendor/lusitanian/oauth/examples/facebook.php
new file mode 100644
index 00000000..b6426721
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/facebook.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Facebook service
+ *
+ * PHP version 5.4
+ *
+ * @author Benjamin Bender <bb@codepoet.de>
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Facebook;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['facebook']['key'],
+ $servicesCredentials['facebook']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Facebook service using the credentials, http client and storage mechanism for the token
+/** @var $facebookService Facebook */
+$facebookService = $serviceFactory->createService('facebook', $credentials, $storage, array());
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from facebook, get the token
+ $token = $facebookService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($facebookService->request('/me'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique facebook user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $facebookService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Facebook!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/fitbit.php b/vendor/lusitanian/oauth/examples/fitbit.php
new file mode 100644
index 00000000..35b3d09f
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/fitbit.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the FitBit service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\FitBit;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['fitbit']['key'],
+ $servicesCredentials['fitbit']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the FitBit service using the credentials, http client and storage mechanism for the token
+/** @var $fitbitService FitBit */
+$fitbitService = $serviceFactory->createService('FitBit', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('FitBit');
+
+ // This was a callback request from fitbit, get the token
+ $fitbitService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($fitbitService->request('user/-/profile.json'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $fitbitService->requestRequestToken();
+
+ $url = $fitbitService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with FitBit!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/flickr.php b/vendor/lusitanian/oauth/examples/flickr.php
new file mode 100644
index 00000000..f7a80f67
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/flickr.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Flickr service
+ *
+ * @author Christian Mayer <thefox21at@gmail.com>
+ * @copyright Copyright (c) 2013 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\Flickr;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+use OAuth\Common\Http\Client\CurlClient;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__.'/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['flickr']['key'],
+ $servicesCredentials['flickr']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Flickr service using the credentials, http client and storage mechanism for the token
+$flickrService = $serviceFactory->createService('Flickr', $credentials, $storage);
+
+$step = isset($_GET['step']) ? (int)$_GET['step'] : null;
+
+$oauth_token = isset($_GET['oauth_token']) ? $_GET['oauth_token'] : null;
+$oauth_verifier = isset($_GET['oauth_verifier']) ? $_GET['oauth_verifier'] : null;
+
+if($oauth_token && $oauth_verifier){
+ $step = 2;
+}
+
+switch($step){
+ default:
+ print "<a href='".$currentUri->getRelativeUri().'?step=1'."'>Login with Flickr!</a>";
+ break;
+
+ case 1:
+
+ if($token = $flickrService->requestRequestToken()){
+ $oauth_token = $token->getAccessToken();
+ $secret = $token->getAccessTokenSecret();
+
+ if($oauth_token && $secret){
+ $url = $flickrService->getAuthorizationUri(array('oauth_token' => $oauth_token, 'perms' => 'write'));
+ header('Location: '.$url);
+ }
+ }
+
+ break;
+
+ case 2:
+ $token = $storage->retrieveAccessToken('Flickr');
+ $secret = $token->getAccessTokenSecret();
+
+ if($token = $flickrService->requestAccessToken($oauth_token, $oauth_verifier, $secret)){
+ $oauth_token = $token->getAccessToken();
+ $secret = $token->getAccessTokenSecret();
+
+ $storage->storeAccessToken('Flickr', $token);
+
+ header('Location: '.$currentUri->getAbsoluteUri().'?step=3');
+ }
+ break;
+
+ case 3:
+ $xml = simplexml_load_string($flickrService->request('flickr.test.login'));
+ print "status: ".(string)$xml->attributes()->stat."\n";
+ break;
+}
diff --git a/vendor/lusitanian/oauth/examples/foursquare.php b/vendor/lusitanian/oauth/examples/foursquare.php
new file mode 100644
index 00000000..f7920724
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/foursquare.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Foursquare service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Foursquare;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['foursquare']['key'],
+ $servicesCredentials['foursquare']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Foursquare service using the credentials, http client and storage mechanism for the token
+/** @var $foursquareService Foursquare */
+$foursquareService = $serviceFactory->createService('foursquare', $credentials, $storage);
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from foursquare, get the token
+ $foursquareService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($foursquareService->request('users/self'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique foursquare user id is: ' . $result['response']['user']['id'] . ' and your name is ' . $result['response']['user']['firstName'] . $result['response']['user']['lastName'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $foursquareService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Foursquare!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/github.php b/vendor/lusitanian/oauth/examples/github.php
new file mode 100644
index 00000000..23e971f8
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/github.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Github service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\GitHub;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['github']['key'],
+ $servicesCredentials['github']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the GitHub service using the credentials, http client and storage mechanism for the token
+/** @var $gitHub GitHub */
+$gitHub = $serviceFactory->createService('GitHub', $credentials, $storage, array('user'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from github, get the token
+ $gitHub->requestAccessToken($_GET['code']);
+
+ $result = json_decode($gitHub->request('user/emails'), true);
+
+ echo 'The first email on your github account is ' . $result[0];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $gitHub->getAuthorizationUri();
+ header('Location: ' . $url);
+
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Github!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/google.php b/vendor/lusitanian/oauth/examples/google.php
new file mode 100644
index 00000000..f05a03e0
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/google.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Google service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Google;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['google']['key'],
+ $servicesCredentials['google']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Google service using the credentials, http client and storage mechanism for the token
+/** @var $googleService Google */
+$googleService = $serviceFactory->createService('google', $credentials, $storage, array('userinfo_email', 'userinfo_profile'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from google, get the token
+ $googleService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique google user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $googleService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Google!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/harvest.php b/vendor/lusitanian/oauth/examples/harvest.php
new file mode 100644
index 00000000..1d11584a
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/harvest.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the harvest service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\Common\Consumer\Credentials;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Token\Exception\ExpiredTokenException;
+use OAuth\OAuth2\Service\Harvest;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+$serviceName = 'Harvest';
+$scopes = array();
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['harvest']['key'],
+ $servicesCredentials['harvest']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Harvest service using the credentials, http client and storage mechanism for the token
+/** @var $harves Harves */
+$harvest = $serviceFactory->createService($serviceName, $credentials, $storage, $scopes);
+
+if (!empty($_GET['clearToken'])) {
+ // Clear the current AccessToken and go back to the Beginning.
+ $storage->clearToken($serviceName);
+ header('Location: ' . $currentUri->getAbsoluteUri());
+
+} elseif ($storage->hasAccessToken($serviceName)) {
+ // fetch the accessToken for the service
+ $accessToken = $storage->retrieveAccessToken($serviceName);
+
+ // is the accessToken expired? then let's refesh it!
+ if ($accessToken->isExpired() === TRUE) {
+ $harvest->refreshAccessToken($accessToken);
+ }
+
+ // use the service with the valid access token to fetch my email
+ $result = json_decode($harvest->request('account/who_am_i'), true);
+ echo 'The email on your harvest account is ' . $result['user']['email'];
+
+ $url = $currentUri->getRelativeUri() . '?clearToken=1';
+ echo " <a href='$url'>Click here to clear the current access token</a>";
+
+} elseif (!empty($_GET['code'])) {
+ // This was a callback request from harvest, get the token
+ $harvest->requestAccessToken($_GET['code']);
+ header('Location: ' . $currentUri->getAbsoluteUri());
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // Redirect to the Authorization uri
+ $url = $harvest->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Harvest!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/init.example.php b/vendor/lusitanian/oauth/examples/init.example.php
new file mode 100644
index 00000000..fb6aee40
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/init.example.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * This file sets up the information needed to test the examples in different environments.
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+/**
+ * @var array A list of all the credentials to be used by the different services in the examples
+ */
+$servicesCredentials = array(
+ 'amazon' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'bitbucket' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'bitly' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'box' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'buffer' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'dailymotion' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'dropbox' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'etsy' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'facebook' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'fitbit' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'flickr' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'foursquare' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'github' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'google' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'instagram' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'linkedin' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'mailchimp' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'microsoft' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'paypal' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'pocket' => array(
+ 'key' => '',
+ ),
+ 'reddit' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'runkeeper' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'scoopit' => array(
+ 'key' => '',
+ 'secret' => ''
+ ),
+ 'soundcloud' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'tumblr' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'twitter' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'ustream' => array(
+ 'key' => '',
+ 'secret' => '',
+ ),
+ 'yahoo' => array(
+ 'key' => '',
+ 'secret' => ''
+ ),
+ 'yammer' => array(
+ 'key' => '',
+ 'secret' => ''
+ ),
+);
+
+/** @var $serviceFactory \OAuth\ServiceFactory An OAuth service factory. */
+$serviceFactory = new \OAuth\ServiceFactory();
diff --git a/vendor/lusitanian/oauth/examples/instagram.php b/vendor/lusitanian/oauth/examples/instagram.php
new file mode 100644
index 00000000..2e44094c
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/instagram.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Instagram service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @author Hannes Van De Vreken <vandevreken.hannes@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Instagram;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['instagram']['key'],
+ $servicesCredentials['instagram']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+$scopes = array('basic', 'comments', 'relationships', 'likes');
+
+// Instantiate the Instagram service using the credentials, http client and storage mechanism for the token
+/** @var $instagramService Instagram */
+$instagramService = $serviceFactory->createService('instagram', $credentials, $storage, $scopes);
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from Instagram, get the token
+ $instagramService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($instagramService->request('users/self'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique instagram user id is: ' . $result['data']['id'] . ' and your name is ' . $result['data']['full_name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $instagramService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Instagram!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/linkedin.php b/vendor/lusitanian/oauth/examples/linkedin.php
new file mode 100644
index 00000000..db14ab25
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/linkedin.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Linkedin service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @author Antoine Corcy <contact@sbin.dk>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Linkedin;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['linkedin']['key'],
+ $servicesCredentials['linkedin']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Linkedin service using the credentials, http client and storage mechanism for the token
+/** @var $linkedinService Linkedin */
+$linkedinService = $serviceFactory->createService('linkedin', $credentials, $storage, array('r_basicprofile'));
+
+if (!empty($_GET['code'])) {
+ // retrieve the CSRF state parameter
+ $state = isset($_GET['state']) ? $_GET['state'] : null;
+
+ // This was a callback request from linkedin, get the token
+ $token = $linkedinService->requestAccessToken($_GET['code'], $state);
+
+ // Send a request with it. Please note that XML is the default format.
+ $result = json_decode($linkedinService->request('/people/~?format=json'), true);
+
+ // Show some of the resultant data
+ echo 'Your linkedin first name is ' . $result['firstName'] . ' and your last name is ' . $result['lastName'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $linkedinService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Linkedin!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/mailchimp.php b/vendor/lusitanian/oauth/examples/mailchimp.php
new file mode 100644
index 00000000..dd7e12bd
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/mailchimp.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Mailchimp service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Hannes Van De Vreken <vandevreken.hannes@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Mailchimp;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+$_SERVER['SERVER_PORT'] = 80;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['mailchimp']['key'],
+ $servicesCredentials['mailchimp']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Mailchimp service using the credentials, http client and storage mechanism for the token
+/** @var $mailchimpService Mailchimp */
+$mailchimpService = $serviceFactory->createService('mailchimp', $credentials, $storage, array());
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from mailchimp, get the token
+ $token = $mailchimpService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = $mailchimpService->request('/users/profile.json');
+
+ header('Content-Type: application/json');
+ echo $result; exit;
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $mailchimpService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Mailchimp!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/microsoft.php b/vendor/lusitanian/oauth/examples/microsoft.php
new file mode 100644
index 00000000..1edb13f1
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/microsoft.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Microsoft service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Microsoft;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['microsoft']['key'],
+ $servicesCredentials['microsoft']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Microsoft service using the credentials, http client and storage mechanism for the token
+/** @var $microsoft Microsoft */
+$microsoft = $serviceFactory->createService('microsoft', $credentials, $storage, array('basic'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from Microsoft, get the token
+ $token = $microsoft->requestAccessToken($_GET['code']);
+
+ var_dump($token);
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $microsoft->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Microsoft!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/paypal.php b/vendor/lusitanian/oauth/examples/paypal.php
new file mode 100644
index 00000000..207357f2
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/paypal.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the PayPal service
+ *
+ * PHP version 5.4
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Paypal;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['paypal']['key'],
+ $servicesCredentials['paypal']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the PayPal service using the credentials, http client, storage mechanism for the token and profile/openid scopes
+/** @var $paypalService PayPal */
+$paypalService = $serviceFactory->createService('paypal', $credentials, $storage, array('profile', 'openid'));
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from PayPal, get the token
+ $token = $paypalService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($paypalService->request('/identity/openidconnect/userinfo/?schema=openid'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique PayPal user id is: ' . $result['user_id'] . ' and your name is ' . $result['name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $paypalService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with PayPal!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/pocket.php b/vendor/lusitanian/oauth/examples/pocket.php
new file mode 100644
index 00000000..b96d2ace
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/pocket.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Pocket service.
+ *
+ * @author Christian Mayer <thefox21at@gmail.com>
+ * @copyright Copyright (c) 2014 Christian Mayer <thefox21at@gmail.com>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Pocket;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+use OAuth\Common\Http\Client\CurlClient;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__.'/bootstrap.php';
+
+$step = isset($_GET['step']) ? (int)$_GET['step'] : null;
+$code = isset($_GET['code']) ? $_GET['code'] : null;
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['pocket']['key'],
+ null, // Pocket API doesn't have a secret key. :S
+ $currentUri->getAbsoluteUri().($code ? '?step=3&code='.$code : '')
+);
+
+// Instantiate the Pocket service using the credentials, http client and storage mechanism for the token
+$pocketService = $serviceFactory->createService('Pocket', $credentials, $storage);
+
+switch($step){
+ default:
+ print '<a href="'.$currentUri->getRelativeUri().'?step=1">Login with Pocket</a>';
+
+ break;
+
+ case 1:
+ $code = $pocketService->requestRequestToken();
+ header('Location: '.$currentUri->getRelativeUri().'?step=2&code='.$code);
+
+ break;
+
+ case 2:
+ $url = $pocketService->getAuthorizationUri(array('request_token' => $code));
+ header('Location: '.$url);
+
+ break;
+
+ case 3:
+ $token = $pocketService->requestAccessToken($code);
+ $accessToken = $token->getAccessToken();
+ $extraParams = $token->getExtraParams();
+
+ print 'User: '.$extraParams['username'].'<br />';
+ print 'Access Token: '.$accessToken;
+ break;
+}
diff --git a/vendor/lusitanian/oauth/examples/reddit.php b/vendor/lusitanian/oauth/examples/reddit.php
new file mode 100644
index 00000000..7363d840
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/reddit.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Reddit service
+ *
+ * PHP version 5.4
+ *
+ * @author Connor Hindley <conn.hindley@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Reddit;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['reddit']['key'],
+ $servicesCredentials['reddit']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Reddit service using the credentials, http client and storage mechanism for the token
+/** @var $reddit Reddit */
+$reddit = $serviceFactory->createService('Reddit', $credentials, $storage, array('identity'));
+
+if (!empty($_GET['code'])) {
+ // retrieve the CSRF state parameter
+ $state = isset($_GET['state']) ? $_GET['state'] : null;
+
+ // This was a callback request from reddit, get the token
+ $reddit->requestAccessToken($_GET['code'], $state);
+
+ $result = json_decode($reddit->request('api/v1/me.json'), true);
+
+ echo 'Your unique reddit user id is: ' . $result['id'] . ' and your username is ' . $result['name'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $reddit->getAuthorizationUri();
+ header('Location: ' . $url);
+
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Reddit!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/runkeeper.php b/vendor/lusitanian/oauth/examples/runkeeper.php
new file mode 100644
index 00000000..61a203f9
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/runkeeper.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token from the RunKeeper service
+ *
+ * PHP version 5.4
+ *
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\RunKeeper;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['runkeeper']['key'],
+ $servicesCredentials['runkeeper']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Runkeeper service using the credentials, http client and storage mechanism for the token
+/** @var $runkeeperService RunKeeper */
+$runkeeperService = $serviceFactory->createService('RunKeeper', $credentials, $storage, array());
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from RunKeeper, get the token
+ $token = $runkeeperService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($runkeeperService->request('/user'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique RunKeeper user id is: ' . $result['userID'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $runkeeperService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with RunKeeper!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/scoopit.php b/vendor/lusitanian/oauth/examples/scoopit.php
new file mode 100644
index 00000000..cc1c103b
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/scoopit.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Example of making API calls for the ScoopIt service
+ *
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2013 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\ScoopIt;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__.'/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['scoopit']['key'],
+ $servicesCredentials['scoopit']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the ScoopIt service using the credentials, http client and storage mechanism for the token
+$scoopItService = $serviceFactory->createService('ScoopIt', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('ScoopIt');
+
+ // This was a callback request from ScoopIt, get the token
+ $scoopItService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($scoopItService->request('profile'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $scoopItService->requestRequestToken();
+
+ $url = $scoopItService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with ScoopIt!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/soundcloud.php b/vendor/lusitanian/oauth/examples/soundcloud.php
new file mode 100644
index 00000000..2629490b
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/soundcloud.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the SoundCloud service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\SoundCloud;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['soundcloud']['key'],
+ $servicesCredentials['soundcloud']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the SoundCloud service using the credentials, http client and storage mechanism for the token
+/** @var $soundcloudService SoundCloud */
+$soundcloudService = $serviceFactory->createService('soundCloud', $credentials, $storage);
+
+if (!empty($_GET['code'])) {
+ // This was a callback request from SoundCloud, get the token
+ $soundcloudService->requestAccessToken($_GET['code']);
+
+ // Send a request with it
+ $result = json_decode($soundcloudService->request('me.json'), true);
+
+ // Show some of the resultant data
+ echo 'Your unique user id is: ' . $result['id'] . ' and your name is ' . $result['username'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $soundcloudService->getAuthorizationUri();
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with SoundCloud!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/tumblr.php b/vendor/lusitanian/oauth/examples/tumblr.php
new file mode 100644
index 00000000..bde0521b
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/tumblr.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Tumblr service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\Tumblr;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// We need to use a persistent storage to save the token, because oauth1 requires the token secret received before'
+// the redirect (request token request) in the access token request.
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['tumblr']['key'],
+ $servicesCredentials['tumblr']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the tumblr service using the credentials, http client and storage mechanism for the token
+/** @var $tumblrService Tumblr */
+$tumblrService = $serviceFactory->createService('tumblr', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('Tumblr');
+
+ // This was a callback request from tumblr, get the token
+ $tumblrService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($tumblrService->request('user/info'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $tumblrService->requestRequestToken();
+
+ $url = $tumblrService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Tumblr!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/twitter.php b/vendor/lusitanian/oauth/examples/twitter.php
new file mode 100644
index 00000000..6b14a222
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/twitter.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Twitter service
+ *
+ * PHP version 5.4
+ *
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\Twitter;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// We need to use a persistent storage to save the token, because oauth1 requires the token secret received before'
+// the redirect (request token request) in the access token request.
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['twitter']['key'],
+ $servicesCredentials['twitter']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the twitter service using the credentials, http client and storage mechanism for the token
+/** @var $twitterService Twitter */
+$twitterService = $serviceFactory->createService('twitter', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('Twitter');
+
+ // This was a callback request from twitter, get the token
+ $twitterService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($twitterService->request('account/verify_credentials.json'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $twitterService->requestRequestToken();
+
+ $url = $twitterService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Twitter!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/ustream.php b/vendor/lusitanian/oauth/examples/ustream.php
new file mode 100644
index 00000000..e3ca0bb4
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/ustream.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Example of retrieving an authentication token of the Ustream service
+ *
+ * PHP version 5.4
+ *
+ * @author Attila Gonda <pcdevil7@gmail.com>
+ * @copyright Copyright (c) 2014 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth2\Service\Ustream;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__ . '/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['ustream']['key'],
+ $servicesCredentials['ustream']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Ustream service using the credentials, http client and storage mechanism for the token
+/** @var $ustream Ustream */
+$ustream = $serviceFactory->createService('Ustream', $credentials, $storage, array('identity'));
+
+if (!empty($_GET['code'])) {
+ // retrieve the CSRF state parameter
+ $state = isset($_GET['state']) ? $_GET['state'] : null;
+
+ // This was a callback request from Ustream, get the token
+ $ustream->requestAccessToken($_GET['code'], $state);
+
+ $result = json_decode($ustream->request('users/self.json'), true);
+
+ echo 'Your unique Ustream user id is: ' . $result['id'] . ' and your username is ' . $result['username'];
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ $url = $ustream->getAuthorizationUri();
+ header('Location: ' . $url);
+
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Ustream!</a>";
+}
diff --git a/vendor/lusitanian/oauth/examples/yahoo.php b/vendor/lusitanian/oauth/examples/yahoo.php
new file mode 100644
index 00000000..549332e9
--- /dev/null
+++ b/vendor/lusitanian/oauth/examples/yahoo.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Example of making API calls for the Yahoo service
+ *
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2014 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+use OAuth\OAuth1\Service\Yahoo;
+use OAuth\Common\Storage\Session;
+use OAuth\Common\Consumer\Credentials;
+
+/**
+ * Bootstrap the example
+ */
+require_once __DIR__.'/bootstrap.php';
+
+// Session storage
+$storage = new Session();
+
+// Setup the credentials for the requests
+$credentials = new Credentials(
+ $servicesCredentials['yahoo']['key'],
+ $servicesCredentials['yahoo']['secret'],
+ $currentUri->getAbsoluteUri()
+);
+
+// Instantiate the Yahoo service using the credentials, http client and storage mechanism for the token
+$yahooService = $serviceFactory->createService('Yahoo', $credentials, $storage);
+
+if (!empty($_GET['oauth_token'])) {
+ $token = $storage->retrieveAccessToken('Yahoo');
+
+ // This was a callback request from Yahoo, get the token
+ $yahooService->requestAccessToken(
+ $_GET['oauth_token'],
+ $_GET['oauth_verifier'],
+ $token->getRequestTokenSecret()
+ );
+
+ // Send a request now that we have access token
+ $result = json_decode($yahooService->request('profile'));
+
+ echo 'result: <pre>' . print_r($result, true) . '</pre>';
+
+} elseif (!empty($_GET['go']) && $_GET['go'] === 'go') {
+ // extra request needed for oauth1 to request a request token :-)
+ $token = $yahooService->requestRequestToken();
+
+ $url = $yahooService->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+ header('Location: ' . $url);
+} else {
+ $url = $currentUri->getRelativeUri() . '?go=go';
+ echo "<a href='$url'>Login with Yahoo!</a>";
+}
diff --git a/vendor/lusitanian/oauth/phpunit.xml.dist b/vendor/lusitanian/oauth/phpunit.xml.dist
new file mode 100644
index 00000000..ee281953
--- /dev/null
+++ b/vendor/lusitanian/oauth/phpunit.xml.dist
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit backupGlobals="true"
+ backupStaticAttributes="false"
+ bootstrap="tests/bootstrap.php"
+ colors="false"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ forceCoversAnnotation="false"
+ mapTestClassNameToCoveredClassName="false"
+ processIsolation="false"
+ stopOnError="false"
+ stopOnFailure="false"
+ stopOnIncomplete="false"
+ stopOnSkipped="false"
+ testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
+ strict="false"
+ verbose="false">
+ <testsuites>
+ <testsuite name="Unit">
+ <directory>tests/Unit</directory>
+ </testsuite>
+ </testsuites>
+ <filter>
+ <whitelist>
+ <directory suffix=".php">src/</directory>
+ <exclude>
+ <file>src/OAuth/bootstrap.php</file>
+ <file>src/OAuth/Common/Exception/Exception.php</file>
+ <file>src/OAuth/Common/Http/Exception/TokenResponseException.php</file>
+ <file>src/OAuth/Common/Storage/Exception/StorageException.php</file>
+ <file>src/OAuth/Common/Storage/Exception/TokenNotFoundException.php</file>
+ <file>src/OAuth/Common/Token/Exception/ExpiredTokenException.php</file>
+ <file>src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php</file>
+ <file>src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php</file>
+ <file>src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php</file>
+ <file>src/OAuth/OAuth2/Token/StdOAuth2Token.php</file>
+ </exclude>
+ </whitelist>
+ </filter>
+ <php>
+ <env name="redis_host" value="127.0.0.1"/>
+ <env name="redis_port" value="6379"/>
+ </php>
+</phpunit>
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/AutoLoader.php b/vendor/lusitanian/oauth/src/OAuth/Common/AutoLoader.php
new file mode 100644
index 00000000..9fe7951c
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/AutoLoader.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace OAuth\Common;
+
+/**
+ * PSR-0 Autoloader
+ *
+ * @author ieter Hordijk <info@pieterhordijk.com>
+ */
+class AutoLoader
+{
+ /**
+ * @var string The namespace prefix for this instance.
+ */
+ protected $namespace = '';
+
+ /**
+ * @var string The filesystem prefix to use for this instance
+ */
+ protected $path = '';
+
+ /**
+ * Build the instance of the autoloader
+ *
+ * @param string $namespace The prefixed namespace this instance will load
+ * @param string $path The filesystem path to the root of the namespace
+ */
+ public function __construct($namespace, $path)
+ {
+ $this->namespace = ltrim($namespace, '\\');
+ $this->path = rtrim($path, '/\\') . DIRECTORY_SEPARATOR;
+ }
+
+ /**
+ * Try to load a class
+ *
+ * @param string $class The class name to load
+ *
+ * @return boolean If the loading was successful
+ */
+ public function load($class)
+ {
+ $class = ltrim($class, '\\');
+
+ if (strpos($class, $this->namespace) === 0) {
+ $nsparts = explode('\\', $class);
+ $class = array_pop($nsparts);
+ $nsparts[] = '';
+ $path = $this->path . implode(DIRECTORY_SEPARATOR, $nsparts);
+ $path .= str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
+
+ if (file_exists($path)) {
+ require $path;
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Register the autoloader to PHP
+ *
+ * @return boolean The status of the registration
+ */
+ public function register()
+ {
+ return spl_autoload_register(array($this, 'load'));
+ }
+
+ /**
+ * Unregister the autoloader to PHP
+ *
+ * @return boolean The status of the unregistration
+ */
+ public function unregister()
+ {
+ return spl_autoload_unregister(array($this, 'load'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/Credentials.php b/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/Credentials.php
new file mode 100644
index 00000000..8e98e9fa
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/Credentials.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OAuth\Common\Consumer;
+
+/**
+ * Value object for the credentials of an OAuth service.
+ */
+class Credentials implements CredentialsInterface
+{
+ /**
+ * @var string
+ */
+ protected $consumerId;
+
+ /**
+ * @var string
+ */
+ protected $consumerSecret;
+
+ /**
+ * @var string
+ */
+ protected $callbackUrl;
+
+ /**
+ * @param string $consumerId
+ * @param string $consumerSecret
+ * @param string $callbackUrl
+ */
+ public function __construct($consumerId, $consumerSecret, $callbackUrl)
+ {
+ $this->consumerId = $consumerId;
+ $this->consumerSecret = $consumerSecret;
+ $this->callbackUrl = $callbackUrl;
+ }
+
+ /**
+ * @return string
+ */
+ public function getCallbackUrl()
+ {
+ return $this->callbackUrl;
+ }
+
+ /**
+ * @return string
+ */
+ public function getConsumerId()
+ {
+ return $this->consumerId;
+ }
+
+ /**
+ * @return string
+ */
+ public function getConsumerSecret()
+ {
+ return $this->consumerSecret;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/CredentialsInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/CredentialsInterface.php
new file mode 100644
index 00000000..a33e54e9
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Consumer/CredentialsInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth\Common\Consumer;
+
+/**
+ * Credentials Interface, credentials should implement this.
+ */
+interface CredentialsInterface
+{
+ /**
+ * @return string
+ */
+ public function getCallbackUrl();
+
+ /**
+ * @return string
+ */
+ public function getConsumerId();
+
+ /**
+ * @return string
+ */
+ public function getConsumerSecret();
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Exception/Exception.php b/vendor/lusitanian/oauth/src/OAuth/Common/Exception/Exception.php
new file mode 100644
index 00000000..2e399217
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Exception/Exception.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\Common\Exception;
+
+/**
+ * Generic library-level exception.
+ */
+class Exception extends \Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php
new file mode 100644
index 00000000..94000b18
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace OAuth\Common\Http\Client;
+
+/**
+ * Abstract HTTP client
+ */
+abstract class AbstractClient implements ClientInterface
+{
+ /**
+ * @var string The user agent string passed to services
+ */
+ protected $userAgent;
+
+ /**
+ * @var int The maximum number of redirects
+ */
+ protected $maxRedirects = 5;
+
+ /**
+ * @var int The maximum timeout
+ */
+ protected $timeout = 15;
+
+ /**
+ * Creates instance
+ *
+ * @param string $userAgent The UA string the client will use
+ */
+ public function __construct($userAgent = 'PHPoAuthLib')
+ {
+ $this->userAgent = $userAgent;
+ }
+
+ /**
+ * @param int $redirects Maximum redirects for client
+ *
+ * @return ClientInterface
+ */
+ public function setMaxRedirects($redirects)
+ {
+ $this->maxRedirects = $redirects;
+
+ return $this;
+ }
+
+ /**
+ * @param int $timeout Request timeout time for client in seconds
+ *
+ * @return ClientInterface
+ */
+ public function setTimeout($timeout)
+ {
+ $this->timeout = $timeout;
+
+ return $this;
+ }
+
+ /**
+ * @param array $headers
+ */
+ public function normalizeHeaders(&$headers)
+ {
+ // Normalize headers
+ array_walk(
+ $headers,
+ function (&$val, &$key) {
+ $key = ucfirst(strtolower($key));
+ $val = ucfirst(strtolower($key)) . ': ' . $val;
+ }
+ );
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/ClientInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/ClientInterface.php
new file mode 100644
index 00000000..f9c20226
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/ClientInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth\Common\Http\Client;
+
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+
+/**
+ * Any HTTP clients to be used with the library should implement this interface.
+ */
+interface ClientInterface
+{
+ /**
+ * Any implementing HTTP providers should send a request to the provided endpoint with the parameters.
+ * They should return, in string form, the response body and throw an exception on error.
+ *
+ * @param UriInterface $endpoint
+ * @param mixed $requestBody
+ * @param array $extraHeaders
+ * @param string $method
+ *
+ * @return string
+ *
+ * @throws TokenResponseException
+ */
+ public function retrieveResponse(
+ UriInterface $endpoint,
+ $requestBody,
+ array $extraHeaders = array(),
+ $method = 'POST'
+ );
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php
new file mode 100644
index 00000000..eae1be3e
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php
@@ -0,0 +1,142 @@
+<?php
+
+namespace OAuth\Common\Http\Client;
+
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Client implementation for cURL
+ */
+class CurlClient extends AbstractClient
+{
+ /**
+ * If true, explicitly sets cURL to use SSL version 3. Use this if cURL
+ * compiles with GnuTLS SSL.
+ *
+ * @var bool
+ */
+ private $forceSSL3 = false;
+
+ /**
+ * Additional parameters (as `key => value` pairs) to be passed to `curl_setopt`
+ *
+ * @var array
+ */
+ private $parameters = array();
+
+ /**
+ * Additional `curl_setopt` parameters
+ *
+ * @param array $parameters
+ */
+ public function setCurlParameters(array $parameters)
+ {
+ $this->parameters = $parameters;
+ }
+
+ /**
+ * @param bool $force
+ *
+ * @return CurlClient
+ */
+ public function setForceSSL3($force)
+ {
+ $this->forceSSL3 = $force;
+
+ return $this;
+ }
+
+ /**
+ * Any implementing HTTP providers should send a request to the provided endpoint with the parameters.
+ * They should return, in string form, the response body and throw an exception on error.
+ *
+ * @param UriInterface $endpoint
+ * @param mixed $requestBody
+ * @param array $extraHeaders
+ * @param string $method
+ *
+ * @return string
+ *
+ * @throws TokenResponseException
+ * @throws \InvalidArgumentException
+ */
+ public function retrieveResponse(
+ UriInterface $endpoint,
+ $requestBody,
+ array $extraHeaders = array(),
+ $method = 'POST'
+ ) {
+ // Normalize method name
+ $method = strtoupper($method);
+
+ $this->normalizeHeaders($extraHeaders);
+
+ if ($method === 'GET' && !empty($requestBody)) {
+ throw new \InvalidArgumentException('No body expected for "GET" request.');
+ }
+
+ if (!isset($extraHeaders['Content-Type']) && $method === 'POST' && is_array($requestBody)) {
+ $extraHeaders['Content-Type'] = 'Content-Type: application/x-www-form-urlencoded';
+ }
+
+ $extraHeaders['Host'] = 'Host: '.$endpoint->getHost();
+ $extraHeaders['Connection'] = 'Connection: close';
+
+ $ch = curl_init();
+
+ curl_setopt($ch, CURLOPT_URL, $endpoint->getAbsoluteUri());
+
+ if ($method === 'POST' || $method === 'PUT') {
+ if ($requestBody && is_array($requestBody)) {
+ $requestBody = http_build_query($requestBody, '', '&');
+ }
+
+ if ($method === 'PUT') {
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
+ } else {
+ curl_setopt($ch, CURLOPT_POST, true);
+ }
+
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
+ } else {
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
+ }
+
+ if ($this->maxRedirects > 0) {
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($ch, CURLOPT_MAXREDIRS, $this->maxRedirects);
+ }
+
+ curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $extraHeaders);
+ curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);
+
+ foreach ($this->parameters as $key => $value) {
+ curl_setopt($ch, $key, $value);
+ }
+
+ if ($this->forceSSL3) {
+ curl_setopt($ch, CURLOPT_SSLVERSION, 3);
+ }
+
+ $response = curl_exec($ch);
+ $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+ if (false === $response) {
+ $errNo = curl_errno($ch);
+ $errStr = curl_error($ch);
+ curl_close($ch);
+ if (empty($errStr)) {
+ throw new TokenResponseException('Failed to request resource.', $responseCode);
+ }
+ throw new TokenResponseException('cURL Error # '.$errNo.': '.$errStr, $responseCode);
+ }
+
+ curl_close($ch);
+
+ return $response;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php
new file mode 100644
index 00000000..7f3c5249
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace OAuth\Common\Http\Client;
+
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Client implementation for streams/file_get_contents
+ */
+class StreamClient extends AbstractClient
+{
+ /**
+ * Any implementing HTTP providers should send a request to the provided endpoint with the parameters.
+ * They should return, in string form, the response body and throw an exception on error.
+ *
+ * @param UriInterface $endpoint
+ * @param mixed $requestBody
+ * @param array $extraHeaders
+ * @param string $method
+ *
+ * @return string
+ *
+ * @throws TokenResponseException
+ * @throws \InvalidArgumentException
+ */
+ public function retrieveResponse(
+ UriInterface $endpoint,
+ $requestBody,
+ array $extraHeaders = array(),
+ $method = 'POST'
+ ) {
+ // Normalize method name
+ $method = strtoupper($method);
+
+ $this->normalizeHeaders($extraHeaders);
+
+ if ($method === 'GET' && !empty($requestBody)) {
+ throw new \InvalidArgumentException('No body expected for "GET" request.');
+ }
+
+ if (!isset($extraHeaders['Content-Type']) && $method === 'POST' && is_array($requestBody)) {
+ $extraHeaders['Content-Type'] = 'Content-Type: application/x-www-form-urlencoded';
+ }
+
+ $host = 'Host: '.$endpoint->getHost();
+ // Append port to Host if it has been specified
+ if ($endpoint->hasExplicitPortSpecified()) {
+ $host .= ':'.$endpoint->getPort();
+ }
+
+ $extraHeaders['Host'] = $host;
+ $extraHeaders['Connection'] = 'Connection: close';
+
+ if (is_array($requestBody)) {
+ $requestBody = http_build_query($requestBody, '', '&');
+ }
+ $extraHeaders['Content-length'] = 'Content-length: '.strlen($requestBody);
+
+ $context = $this->generateStreamContext($requestBody, $extraHeaders, $method);
+
+ $level = error_reporting(0);
+ $response = file_get_contents($endpoint->getAbsoluteUri(), false, $context);
+ error_reporting($level);
+ if (false === $response) {
+ $lastError = error_get_last();
+ if (is_null($lastError)) {
+ throw new TokenResponseException('Failed to request resource.');
+ }
+ throw new TokenResponseException($lastError['message']);
+ }
+
+ return $response;
+ }
+
+ private function generateStreamContext($body, $headers, $method)
+ {
+ return stream_context_create(
+ array(
+ 'http' => array(
+ 'method' => $method,
+ 'header' => implode("\r\n", array_values($headers)),
+ 'content' => $body,
+ 'protocol_version' => '1.1',
+ 'user_agent' => $this->userAgent,
+ 'max_redirects' => $this->maxRedirects,
+ 'timeout' => $this->timeout
+ ),
+ )
+ );
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Exception/TokenResponseException.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Exception/TokenResponseException.php
new file mode 100644
index 00000000..c519a223
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Exception/TokenResponseException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\Common\Http\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception relating to token response from service.
+ */
+class TokenResponseException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/Uri.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/Uri.php
new file mode 100644
index 00000000..c5114937
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/Uri.php
@@ -0,0 +1,408 @@
+<?php
+
+namespace OAuth\Common\Http\Uri;
+
+use InvalidArgumentException;
+
+/**
+ * Standards-compliant URI class.
+ */
+class Uri implements UriInterface
+{
+ /**
+ * @var string
+ */
+ private $scheme = 'http';
+
+ /**
+ * @var string
+ */
+ private $userInfo = '';
+
+ /**
+ * @var string
+ */
+ private $rawUserInfo = '';
+
+ /**
+ * @var string
+ */
+ private $host;
+
+ /**
+ * @var int
+ */
+ private $port = 80;
+
+ /**
+ * @var string
+ */
+ private $path = '/';
+
+ /**
+ * @var string
+ */
+ private $query = '';
+
+ /**
+ * @var string
+ */
+ private $fragment = '';
+
+ /**
+ * @var bool
+ */
+ private $explicitPortSpecified = false;
+
+ /**
+ * @var bool
+ */
+ private $explicitTrailingHostSlash = false;
+
+ /**
+ * @param string $uri
+ */
+ public function __construct($uri = null)
+ {
+ if (null !== $uri) {
+ $this->parseUri($uri);
+ }
+ }
+
+ /**
+ * @param string $uri
+ *
+ * @throws \InvalidArgumentException
+ */
+ protected function parseUri($uri)
+ {
+ if (false === ($uriParts = parse_url($uri))) {
+ // congratulations if you've managed to get parse_url to fail,
+ // it seems to always return some semblance of a parsed url no matter what
+ throw new InvalidArgumentException("Invalid URI: $uri");
+ }
+
+ if (!isset($uriParts['scheme'])) {
+ throw new InvalidArgumentException('Invalid URI: http|https scheme required');
+ }
+
+ $this->scheme = $uriParts['scheme'];
+ $this->host = $uriParts['host'];
+
+ if (isset($uriParts['port'])) {
+ $this->port = $uriParts['port'];
+ $this->explicitPortSpecified = true;
+ } else {
+ $this->port = strcmp('https', $uriParts['scheme']) ? 80 : 443;
+ $this->explicitPortSpecified = false;
+ }
+
+ if (isset($uriParts['path'])) {
+ $this->path = $uriParts['path'];
+ if ('/' === $uriParts['path']) {
+ $this->explicitTrailingHostSlash = true;
+ }
+ } else {
+ $this->path = '/';
+ }
+
+ $this->query = isset($uriParts['query']) ? $uriParts['query'] : '';
+ $this->fragment = isset($uriParts['fragment']) ? $uriParts['fragment'] : '';
+
+ $userInfo = '';
+ if (!empty($uriParts['user'])) {
+ $userInfo .= $uriParts['user'];
+ }
+ if ($userInfo && !empty($uriParts['pass'])) {
+ $userInfo .= ':' . $uriParts['pass'];
+ }
+
+ $this->setUserInfo($userInfo);
+ }
+
+ /**
+ * @param string $rawUserInfo
+ *
+ * @return string
+ */
+ protected function protectUserInfo($rawUserInfo)
+ {
+ $colonPos = strpos($rawUserInfo, ':');
+
+ // rfc3986-3.2.1 | http://tools.ietf.org/html/rfc3986#section-3.2
+ // "Applications should not render as clear text any data
+ // after the first colon (":") character found within a userinfo
+ // subcomponent unless the data after the colon is the empty string
+ // (indicating no password)"
+ if ($colonPos !== false && strlen($rawUserInfo)-1 > $colonPos) {
+ return substr($rawUserInfo, 0, $colonPos) . ':********';
+ } else {
+ return $rawUserInfo;
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getScheme()
+ {
+ return $this->scheme;
+ }
+
+ /**
+ * @return string
+ */
+ public function getUserInfo()
+ {
+ return $this->userInfo;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRawUserInfo()
+ {
+ return $this->rawUserInfo;
+ }
+
+ /**
+ * @return string
+ */
+ public function getHost()
+ {
+ return $this->host;
+ }
+
+ /**
+ * @return int
+ */
+ public function getPort()
+ {
+ return $this->port;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ /**
+ * @return string
+ */
+ public function getQuery()
+ {
+ return $this->query;
+ }
+
+ /**
+ * @return string
+ */
+ public function getFragment()
+ {
+ return $this->fragment;
+ }
+
+ /**
+ * Uses protected user info by default as per rfc3986-3.2.1
+ * Uri::getRawAuthority() is available if plain-text password information is desirable.
+ *
+ * @return string
+ */
+ public function getAuthority()
+ {
+ $authority = $this->userInfo ? $this->userInfo.'@' : '';
+ $authority .= $this->host;
+
+ if ($this->explicitPortSpecified) {
+ $authority .= ":{$this->port}";
+ }
+
+ return $authority;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRawAuthority()
+ {
+ $authority = $this->rawUserInfo ? $this->rawUserInfo.'@' : '';
+ $authority .= $this->host;
+
+ if ($this->explicitPortSpecified) {
+ $authority .= ":{$this->port}";
+ }
+
+ return $authority;
+ }
+
+ /**
+ * @return string
+ */
+ public function getAbsoluteUri()
+ {
+ $uri = $this->scheme . '://' . $this->getRawAuthority();
+
+ if ('/' === $this->path) {
+ $uri .= $this->explicitTrailingHostSlash ? '/' : '';
+ } else {
+ $uri .= $this->path;
+ }
+
+ if (!empty($this->query)) {
+ $uri .= "?{$this->query}";
+ }
+
+ if (!empty($this->fragment)) {
+ $uri .= "#{$this->fragment}";
+ }
+
+ return $uri;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRelativeUri()
+ {
+ $uri = '';
+
+ if ('/' === $this->path) {
+ $uri .= $this->explicitTrailingHostSlash ? '/' : '';
+ } else {
+ $uri .= $this->path;
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Uses protected user info by default as per rfc3986-3.2.1
+ * Uri::getAbsoluteUri() is available if plain-text password information is desirable.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ $uri = $this->scheme . '://' . $this->getAuthority();
+
+ if ('/' === $this->path) {
+ $uri .= $this->explicitTrailingHostSlash ? '/' : '';
+ } else {
+ $uri .= $this->path;
+ }
+
+ if (!empty($this->query)) {
+ $uri .= "?{$this->query}";
+ }
+
+ if (!empty($this->fragment)) {
+ $uri .= "#{$this->fragment}";
+ }
+
+ return $uri;
+ }
+
+ /**
+ * @param $path
+ */
+ public function setPath($path)
+ {
+ if (empty($path)) {
+ $this->path = '/';
+ $this->explicitTrailingHostSlash = false;
+ } else {
+ $this->path = $path;
+ if ('/' === $this->path) {
+ $this->explicitTrailingHostSlash = true;
+ }
+ }
+ }
+
+ /**
+ * @param string $query
+ */
+ public function setQuery($query)
+ {
+ $this->query = $query;
+ }
+
+ /**
+ * @param string $var
+ * @param string $val
+ */
+ public function addToQuery($var, $val)
+ {
+ if (strlen($this->query) > 0) {
+ $this->query .= '&';
+ }
+ $this->query .= http_build_query(array($var => $val), '', '&');
+ }
+
+ /**
+ * @param string $fragment
+ */
+ public function setFragment($fragment)
+ {
+ $this->fragment = $fragment;
+ }
+
+ /**
+ * @param string $scheme
+ */
+ public function setScheme($scheme)
+ {
+ $this->scheme = $scheme;
+ }
+
+
+ /**
+ * @param string $userInfo
+ */
+ public function setUserInfo($userInfo)
+ {
+ $this->userInfo = $userInfo ? $this->protectUserInfo($userInfo) : '';
+ $this->rawUserInfo = $userInfo;
+ }
+
+
+ /**
+ * @param int $port
+ */
+ public function setPort($port)
+ {
+ $this->port = intval($port);
+
+ if (('https' === $this->scheme && $this->port === 443) || ('http' === $this->scheme && $this->port === 80)) {
+ $this->explicitPortSpecified = false;
+ } else {
+ $this->explicitPortSpecified = true;
+ }
+ }
+
+ /**
+ * @param string $host
+ */
+ public function setHost($host)
+ {
+ $this->host = $host;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasExplicitTrailingHostSlash()
+ {
+ return $this->explicitTrailingHostSlash;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasExplicitPortSpecified()
+ {
+ return $this->explicitPortSpecified;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactory.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactory.php
new file mode 100644
index 00000000..127aa203
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactory.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace OAuth\Common\Http\Uri;
+
+use RuntimeException;
+
+/**
+ * Factory class for uniform resource indicators
+ */
+class UriFactory implements UriFactoryInterface
+{
+ /**
+ * Factory method to build a URI from a super-global $_SERVER array.
+ *
+ * @param array $_server
+ *
+ * @return UriInterface
+ */
+ public function createFromSuperGlobalArray(array $_server)
+ {
+ if ($uri = $this->attemptProxyStyleParse($_server)) {
+ return $uri;
+ }
+
+ $scheme = $this->detectScheme($_server);
+ $host = $this->detectHost($_server);
+ $port = $this->detectPort($_server);
+ $path = $this->detectPath($_server);
+ $query = $this->detectQuery($_server);
+
+ return $this->createFromParts($scheme, '', $host, $port, $path, $query);
+ }
+
+ /**
+ * @param string $absoluteUri
+ *
+ * @return UriInterface
+ */
+ public function createFromAbsolute($absoluteUri)
+ {
+ return new Uri($absoluteUri);
+ }
+
+ /**
+ * Factory method to build a URI from parts
+ *
+ * @param string $scheme
+ * @param string $userInfo
+ * @param string $host
+ * @param string $port
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ *
+ * @return UriInterface
+ */
+ public function createFromParts($scheme, $userInfo, $host, $port, $path = '', $query = '', $fragment = '')
+ {
+ $uri = new Uri();
+ $uri->setScheme($scheme);
+ $uri->setUserInfo($userInfo);
+ $uri->setHost($host);
+ $uri->setPort($port);
+ $uri->setPath($path);
+ $uri->setQuery($query);
+ $uri->setFragment($fragment);
+
+ return $uri;
+ }
+
+ /**
+ * @param array $_server
+ *
+ * @return UriInterface|null
+ */
+ private function attemptProxyStyleParse($_server)
+ {
+ // If the raw HTTP request message arrives with a proxy-style absolute URI in the
+ // initial request line, the absolute URI is stored in $_SERVER['REQUEST_URI'] and
+ // we only need to parse that.
+ if (isset($_server['REQUEST_URI']) && parse_url($_server['REQUEST_URI'], PHP_URL_SCHEME)) {
+ return new Uri($_server['REQUEST_URI']);
+ }
+
+ return null;
+ }
+
+ /**
+ * @param array $_server
+ *
+ * @return string
+ *
+ * @throws RuntimeException
+ */
+ private function detectPath($_server)
+ {
+ if (isset($_server['REQUEST_URI'])) {
+ $uri = $_server['REQUEST_URI'];
+ } elseif (isset($_server['REDIRECT_URL'])) {
+ $uri = $_server['REDIRECT_URL'];
+ } else {
+ throw new RuntimeException('Could not detect URI path from superglobal');
+ }
+
+ $queryStr = strpos($uri, '?');
+ if ($queryStr !== false) {
+ $uri = substr($uri, 0, $queryStr);
+ }
+
+ return $uri;
+ }
+
+ /**
+ * @param array $_server
+ *
+ * @return string
+ */
+ private function detectHost(array $_server)
+ {
+ $host = isset($_server['HTTP_HOST']) ? $_server['HTTP_HOST'] : '';
+
+ if (strstr($host, ':')) {
+ $host = parse_url($host, PHP_URL_HOST);
+ }
+
+ return $host;
+ }
+
+ /**
+ * @param array $_server
+ *
+ * @return string
+ */
+ private function detectPort(array $_server)
+ {
+ return isset($_server['SERVER_PORT']) ? $_server['SERVER_PORT'] : 80;
+ }
+
+ /**
+ * @param array $_server
+ *
+ * @return string
+ */
+ private function detectQuery(array $_server)
+ {
+ return isset($_server['QUERY_STRING']) ? $_server['QUERY_STRING'] : '';
+ }
+
+ /**
+ * Determine URI scheme component from superglobal array
+ *
+ * When using ISAPI with IIS, the value will be "off" if the request was
+ * not made through the HTTPS protocol. As a result, we filter the
+ * value to a bool.
+ *
+ * @param array $_server A super-global $_SERVER array
+ *
+ * @return string Returns http or https depending on the URI scheme
+ */
+ private function detectScheme(array $_server)
+ {
+ if (isset($_server['HTTPS']) && filter_var($_server['HTTPS'], FILTER_VALIDATE_BOOLEAN)) {
+ return 'https';
+ } else {
+ return 'http';
+ }
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactoryInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactoryInterface.php
new file mode 100644
index 00000000..2b157d84
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriFactoryInterface.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace OAuth\Common\Http\Uri;
+
+/**
+ * Factory interface for uniform resource indicators
+ */
+interface UriFactoryInterface
+{
+ /**
+ * Factory method to build a URI from a super-global $_SERVER array.
+ *
+ * @param array $_server
+ *
+ * @return UriInterface
+ */
+ public function createFromSuperGlobalArray(array $_server);
+
+ /**
+ * Creates a URI from an absolute URI
+ *
+ * @param string $absoluteUri
+ *
+ * @return UriInterface
+ */
+ public function createFromAbsolute($absoluteUri);
+
+ /**
+ * Factory method to build a URI from parts
+ *
+ * @param string $scheme
+ * @param string $userInfo
+ * @param string $host
+ * @param string $port
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ *
+ * @return UriInterface
+ */
+ public function createFromParts($scheme, $userInfo, $host, $port, $path = '', $query = '', $fragment = '');
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriInterface.php
new file mode 100644
index 00000000..008d4647
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriInterface.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace OAuth\Common\Http\Uri;
+
+interface UriInterface
+{
+ /**
+ * @return string
+ */
+ public function getScheme();
+
+ /**
+ * @param string $scheme
+ */
+ public function setScheme($scheme);
+
+ /**
+ * @return string
+ */
+ public function getHost();
+
+ /**
+ * @param string $host
+ */
+ public function setHost($host);
+
+ /**
+ * @return int
+ */
+ public function getPort();
+
+ /**
+ * @param int $port
+ */
+ public function setPort($port);
+
+ /**
+ * @return string
+ */
+ public function getPath();
+
+ /**
+ * @param string $path
+ */
+ public function setPath($path);
+
+ /**
+ * @return string
+ */
+ public function getQuery();
+
+ /**
+ * @param string $query
+ */
+ public function setQuery($query);
+
+ /**
+ * Adds a param to the query string.
+ *
+ * @param string $var
+ * @param string $val
+ */
+ public function addToQuery($var, $val);
+
+ /**
+ * @return string
+ */
+ public function getFragment();
+
+ /**
+ * Should return URI user info, masking protected user info data according to rfc3986-3.2.1
+ *
+ * @return string
+ */
+ public function getUserInfo();
+
+ /**
+ * @param string $userInfo
+ */
+ public function setUserInfo($userInfo);
+
+ /**
+ * Should return the URI Authority, masking protected user info data according to rfc3986-3.2.1
+ *
+ * @return string
+ */
+ public function getAuthority();
+
+ /**
+ * Should return the URI string, masking protected user info data according to rfc3986-3.2.1
+ *
+ * @return string the URI string with user protected info masked
+ */
+ public function __toString();
+
+ /**
+ * Should return the URI Authority without masking protected user info data
+ *
+ * @return string
+ */
+ public function getRawAuthority();
+
+ /**
+ * Should return the URI user info without masking protected user info data
+ *
+ * @return string
+ */
+ public function getRawUserInfo();
+
+ /**
+ * Build the full URI based on all the properties
+ *
+ * @return string The full URI without masking user info
+ */
+ public function getAbsoluteUri();
+
+ /**
+ * Build the relative URI based on all the properties
+ *
+ * @return string The relative URI
+ */
+ public function getRelativeUri();
+
+ /**
+ * @return bool
+ */
+ public function hasExplicitTrailingHostSlash();
+
+ /**
+ * @return bool
+ */
+ public function hasExplicitPortSpecified();
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php b/vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php
new file mode 100644
index 00000000..0bf572b4
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth\Common\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Exception\Exception;
+use OAuth\Common\Storage\TokenStorageInterface;
+
+/**
+ * Abstract OAuth service, version-agnostic
+ */
+abstract class AbstractService implements ServiceInterface
+{
+ /** @var Credentials */
+ protected $credentials;
+
+ /** @var ClientInterface */
+ protected $httpClient;
+
+ /** @var TokenStorageInterface */
+ protected $storage;
+
+ /**
+ * @param CredentialsInterface $credentials
+ * @param ClientInterface $httpClient
+ * @param TokenStorageInterface $storage
+ */
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage
+ ) {
+ $this->credentials = $credentials;
+ $this->httpClient = $httpClient;
+ $this->storage = $storage;
+ }
+
+ /**
+ * @param UriInterface|string $path
+ * @param UriInterface $baseApiUri
+ *
+ * @return UriInterface
+ *
+ * @throws Exception
+ */
+ protected function determineRequestUriFromPath($path, UriInterface $baseApiUri = null)
+ {
+ if ($path instanceof UriInterface) {
+ $uri = $path;
+ } elseif (stripos($path, 'http://') === 0 || stripos($path, 'https://') === 0) {
+ $uri = new Uri($path);
+ } else {
+ if (null === $baseApiUri) {
+ throw new Exception(
+ 'An absolute URI must be passed to ServiceInterface::request as no baseApiUri is set.'
+ );
+ }
+
+ $uri = clone $baseApiUri;
+ if (false !== strpos($path, '?')) {
+ $parts = explode('?', $path, 2);
+ $path = $parts[0];
+ $query = $parts[1];
+ $uri->setQuery($query);
+ }
+
+ if ($path[0] === '/') {
+ $path = substr($path, 1);
+ }
+
+ $uri->setPath($uri->getPath() . $path);
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Accessor to the storage adapter to be able to retrieve tokens
+ *
+ * @return TokenStorageInterface
+ */
+ public function getStorage()
+ {
+ return $this->storage;
+ }
+
+ /**
+ * @return string
+ */
+ public function service()
+ {
+ // get class name without backslashes
+ $classname = get_class($this);
+
+ return preg_replace('/^.*\\\\/', '', $classname);
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Service/ServiceInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Service/ServiceInterface.php
new file mode 100644
index 00000000..5856a039
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Service/ServiceInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace OAuth\Common\Service;
+
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Defines methods common among all OAuth services.
+ */
+interface ServiceInterface
+{
+ /**
+ * Sends an authenticated API request to the path provided.
+ * If the path provided is not an absolute URI, the base API Uri (service-specific) will be used.
+ *
+ * @param string|UriInterface $path
+ * @param string $method HTTP method
+ * @param array $body Request body if applicable (an associative array will
+ * automatically be converted into a urlencoded body)
+ * @param array $extraHeaders Extra headers if applicable. These will override service-specific
+ * any defaults.
+ *
+ * @return string
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array());
+
+ /**
+ * Returns the url to redirect to for authorization purposes.
+ *
+ * @param array $additionalParameters
+ *
+ * @return UriInterface
+ */
+ public function getAuthorizationUri(array $additionalParameters = array());
+
+ /**
+ * Returns the authorization API endpoint.
+ *
+ * @return UriInterface
+ */
+ public function getAuthorizationEndpoint();
+
+ /**
+ * Returns the access token API endpoint.
+ *
+ * @return UriInterface
+ */
+ public function getAccessTokenEndpoint();
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php
new file mode 100644
index 00000000..b3daeabb
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\Common\Storage\Exception;
+
+/**
+ * Exception thrown when a state is not found in storage.
+ */
+class AuthorizationStateNotFoundException extends StorageException
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/StorageException.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/StorageException.php
new file mode 100644
index 00000000..4378ee8f
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/StorageException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\Common\Storage\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Generic storage exception.
+ */
+class StorageException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/TokenNotFoundException.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/TokenNotFoundException.php
new file mode 100644
index 00000000..06222508
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/TokenNotFoundException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\Common\Storage\Exception;
+
+/**
+ * Exception thrown when a token is not found in storage.
+ */
+class TokenNotFoundException extends StorageException
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php
new file mode 100644
index 00000000..d42c2251
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace OAuth\Common\Storage;
+
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
+
+/*
+ * Stores a token in-memory only (destroyed at end of script execution).
+ */
+class Memory implements TokenStorageInterface
+{
+ /**
+ * @var object|TokenInterface
+ */
+ protected $tokens;
+
+ /**
+ * @var array
+ */
+ protected $states;
+
+ public function __construct()
+ {
+ $this->tokens = array();
+ $this->states = array();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAccessToken($service)
+ {
+ if ($this->hasAccessToken($service)) {
+ return $this->tokens[$service];
+ }
+
+ throw new TokenNotFoundException('Token not stored');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAccessToken($service, TokenInterface $token)
+ {
+ $this->tokens[$service] = $token;
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAccessToken($service)
+ {
+ return isset($this->tokens[$service]) && $this->tokens[$service] instanceof TokenInterface;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearToken($service)
+ {
+ if (array_key_exists($service, $this->tokens)) {
+ unset($this->tokens[$service]);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllTokens()
+ {
+ $this->tokens = array();
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAuthorizationState($service)
+ {
+ if ($this->hasAuthorizationState($service)) {
+ return $this->states[$service];
+ }
+
+ throw new AuthorizationStateNotFoundException('State not stored');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAuthorizationState($service, $state)
+ {
+ $this->states[$service] = $state;
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAuthorizationState($service)
+ {
+ return isset($this->states[$service]) && null !== $this->states[$service];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAuthorizationState($service)
+ {
+ if (array_key_exists($service, $this->states)) {
+ unset($this->states[$service]);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllAuthorizationStates()
+ {
+ $this->states = array();
+
+ // allow chaining
+ return $this;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php
new file mode 100644
index 00000000..77318bd6
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace OAuth\Common\Storage;
+
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
+use Predis\Client as Predis;
+
+/*
+ * Stores a token in a Redis server. Requires the Predis library available at https://github.com/nrk/predis
+ */
+class Redis implements TokenStorageInterface
+{
+ /**
+ * @var string
+ */
+ protected $key;
+
+ protected $stateKey;
+
+ /**
+ * @var object|\Redis
+ */
+ protected $redis;
+
+ /**
+ * @var object|TokenInterface
+ */
+ protected $cachedTokens;
+
+ /**
+ * @var object
+ */
+ protected $cachedStates;
+
+ /**
+ * @param Predis $redis An instantiated and connected redis client
+ * @param string $key The key to store the token under in redis
+ * @param string $stateKey The key to store the state under in redis.
+ */
+ public function __construct(Predis $redis, $key, $stateKey)
+ {
+ $this->redis = $redis;
+ $this->key = $key;
+ $this->stateKey = $stateKey;
+ $this->cachedTokens = array();
+ $this->cachedStates = array();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAccessToken($service)
+ {
+ if (!$this->hasAccessToken($service)) {
+ throw new TokenNotFoundException('Token not found in redis');
+ }
+
+ if (isset($this->cachedTokens[$service])) {
+ return $this->cachedTokens[$service];
+ }
+
+ $val = $this->redis->hget($this->key, $service);
+
+ return $this->cachedTokens[$service] = unserialize($val);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAccessToken($service, TokenInterface $token)
+ {
+ // (over)write the token
+ $this->redis->hset($this->key, $service, serialize($token));
+ $this->cachedTokens[$service] = $token;
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAccessToken($service)
+ {
+ if (isset($this->cachedTokens[$service])
+ && $this->cachedTokens[$service] instanceof TokenInterface
+ ) {
+ return true;
+ }
+
+ return $this->redis->hexists($this->key, $service);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearToken($service)
+ {
+ $this->redis->hdel($this->key, $service);
+ unset($this->cachedTokens[$service]);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllTokens()
+ {
+ // memory
+ $this->cachedTokens = array();
+
+ // redis
+ $keys = $this->redis->hkeys($this->key);
+ $me = $this; // 5.3 compat
+
+ // pipeline for performance
+ $this->redis->pipeline(
+ function ($pipe) use ($keys, $me) {
+ foreach ($keys as $k) {
+ $pipe->hdel($me->getKey(), $k);
+ }
+ }
+ );
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAuthorizationState($service)
+ {
+ if (!$this->hasAuthorizationState($service)) {
+ throw new AuthorizationStateNotFoundException('State not found in redis');
+ }
+
+ if (isset($this->cachedStates[$service])) {
+ return $this->cachedStates[$service];
+ }
+
+ $val = $this->redis->hget($this->stateKey, $service);
+
+ return $this->cachedStates[$service] = unserialize($val);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAuthorizationState($service, $state)
+ {
+ // (over)write the token
+ $this->redis->hset($this->stateKey, $service, $state);
+ $this->cachedStates[$service] = $state;
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAuthorizationState($service)
+ {
+ if (isset($this->cachedStates[$service])
+ && null !== $this->cachedStates[$service]
+ ) {
+ return true;
+ }
+
+ return $this->redis->hexists($this->stateKey, $service);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAuthorizationState($service)
+ {
+ $this->redis->hdel($this->stateKey, $service);
+ unset($this->cachedStates[$service]);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllAuthorizationStates()
+ {
+ // memory
+ $this->cachedStates = array();
+
+ // redis
+ $keys = $this->redis->hkeys($this->stateKey);
+ $me = $this; // 5.3 compat
+
+ // pipeline for performance
+ $this->redis->pipeline(
+ function ($pipe) use ($keys, $me) {
+ foreach ($keys as $k) {
+ $pipe->hdel($me->getKey(), $k);
+ }
+ }
+ );
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * @return Predis $redis
+ */
+ public function getRedis()
+ {
+ return $this->redis;
+ }
+
+ /**
+ * @return string $key
+ */
+ public function getKey()
+ {
+ return $this->key;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php
new file mode 100644
index 00000000..e908a67e
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php
@@ -0,0 +1,188 @@
+<?php
+
+namespace OAuth\Common\Storage;
+
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
+
+/**
+ * Stores a token in a PHP session.
+ */
+class Session implements TokenStorageInterface
+{
+ /**
+ * @var bool
+ */
+ protected $startSession;
+
+ /**
+ * @var string
+ */
+ protected $sessionVariableName;
+
+ /**
+ * @var string
+ */
+ protected $stateVariableName;
+
+ /**
+ * @param bool $startSession Whether or not to start the session upon construction.
+ * @param string $sessionVariableName the variable name to use within the _SESSION superglobal
+ * @param string $stateVariableName
+ */
+ public function __construct(
+ $startSession = true,
+ $sessionVariableName = 'lusitanian_oauth_token',
+ $stateVariableName = 'lusitanian_oauth_state'
+ ) {
+ if ($startSession && !isset($_SESSION)) {
+ session_start();
+ }
+
+ $this->startSession = $startSession;
+ $this->sessionVariableName = $sessionVariableName;
+ $this->stateVariableName = $stateVariableName;
+ if (!isset($_SESSION[$sessionVariableName])) {
+ $_SESSION[$sessionVariableName] = array();
+ }
+ if (!isset($_SESSION[$stateVariableName])) {
+ $_SESSION[$stateVariableName] = array();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAccessToken($service)
+ {
+ if ($this->hasAccessToken($service)) {
+ return unserialize($_SESSION[$this->sessionVariableName][$service]);
+ }
+
+ throw new TokenNotFoundException('Token not found in session, are you sure you stored it?');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAccessToken($service, TokenInterface $token)
+ {
+ $serializedToken = serialize($token);
+
+ if (isset($_SESSION[$this->sessionVariableName])
+ && is_array($_SESSION[$this->sessionVariableName])
+ ) {
+ $_SESSION[$this->sessionVariableName][$service] = $serializedToken;
+ } else {
+ $_SESSION[$this->sessionVariableName] = array(
+ $service => $serializedToken,
+ );
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAccessToken($service)
+ {
+ return isset($_SESSION[$this->sessionVariableName], $_SESSION[$this->sessionVariableName][$service]);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearToken($service)
+ {
+ if (array_key_exists($service, $_SESSION[$this->sessionVariableName])) {
+ unset($_SESSION[$this->sessionVariableName][$service]);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllTokens()
+ {
+ unset($_SESSION[$this->sessionVariableName]);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAuthorizationState($service, $state)
+ {
+ if (isset($_SESSION[$this->stateVariableName])
+ && is_array($_SESSION[$this->stateVariableName])
+ ) {
+ $_SESSION[$this->stateVariableName][$service] = $state;
+ } else {
+ $_SESSION[$this->stateVariableName] = array(
+ $service => $state,
+ );
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAuthorizationState($service)
+ {
+ return isset($_SESSION[$this->stateVariableName], $_SESSION[$this->stateVariableName][$service]);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAuthorizationState($service)
+ {
+ if ($this->hasAuthorizationState($service)) {
+ return $_SESSION[$this->stateVariableName][$service];
+ }
+
+ throw new AuthorizationStateNotFoundException('State not found in session, are you sure you stored it?');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAuthorizationState($service)
+ {
+ if (array_key_exists($service, $_SESSION[$this->stateVariableName])) {
+ unset($_SESSION[$this->stateVariableName][$service]);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllAuthorizationStates()
+ {
+ unset($_SESSION[$this->stateVariableName]);
+
+ // allow chaining
+ return $this;
+ }
+
+ public function __destruct()
+ {
+ if ($this->startSession) {
+ session_write_close();
+ }
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php
new file mode 100644
index 00000000..6c5fbf60
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php
@@ -0,0 +1,200 @@
+<?php
+
+namespace OAuth\Common\Storage;
+
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+
+class SymfonySession implements TokenStorageInterface
+{
+ private $session;
+ private $sessionVariableName;
+ private $stateVariableName;
+
+ /**
+ * @param SessionInterface $session
+ * @param bool $startSession
+ * @param string $sessionVariableName
+ * @param string $stateVariableName
+ */
+ public function __construct(
+ SessionInterface $session,
+ $startSession = true,
+ $sessionVariableName = 'lusitanian_oauth_token',
+ $stateVariableName = 'lusitanian_oauth_state'
+ ) {
+ $this->session = $session;
+ $this->sessionVariableName = $sessionVariableName;
+ $this->stateVariableName = $stateVariableName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAccessToken($service)
+ {
+ if ($this->hasAccessToken($service)) {
+ // get from session
+ $tokens = $this->session->get($this->sessionVariableName);
+
+ // one item
+ return $tokens[$service];
+ }
+
+ throw new TokenNotFoundException('Token not found in session, are you sure you stored it?');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAccessToken($service, TokenInterface $token)
+ {
+ // get previously saved tokens
+ $tokens = $this->session->get($this->sessionVariableName);
+
+ if (!is_array($tokens)) {
+ $tokens = array();
+ }
+
+ $tokens[$service] = $token;
+
+ // save
+ $this->session->set($this->sessionVariableName, $tokens);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAccessToken($service)
+ {
+ // get from session
+ $tokens = $this->session->get($this->sessionVariableName);
+
+ return is_array($tokens)
+ && isset($tokens[$service])
+ && $tokens[$service] instanceof TokenInterface;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearToken($service)
+ {
+ // get previously saved tokens
+ $tokens = $this->session->get($this->sessionVariableName);
+
+ if (is_array($tokens) && array_key_exists($service, $tokens)) {
+ unset($tokens[$service]);
+
+ // Replace the stored tokens array
+ $this->session->set($this->sessionVariableName, $tokens);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllTokens()
+ {
+ $this->session->remove($this->sessionVariableName);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function retrieveAuthorizationState($service)
+ {
+ if ($this->hasAuthorizationState($service)) {
+ // get from session
+ $states = $this->session->get($this->stateVariableName);
+
+ // one item
+ return $states[$service];
+ }
+
+ throw new AuthorizationStateNotFoundException('State not found in session, are you sure you stored it?');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function storeAuthorizationState($service, $state)
+ {
+ // get previously saved tokens
+ $states = $this->session->get($this->stateVariableName);
+
+ if (!is_array($states)) {
+ $states = array();
+ }
+
+ $states[$service] = $state;
+
+ // save
+ $this->session->set($this->stateVariableName, $states);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasAuthorizationState($service)
+ {
+ // get from session
+ $states = $this->session->get($this->stateVariableName);
+
+ return is_array($states)
+ && isset($states[$service])
+ && null !== $states[$service];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAuthorizationState($service)
+ {
+ // get previously saved tokens
+ $states = $this->session->get($this->stateVariableName);
+
+ if (is_array($states) && array_key_exists($service, $states)) {
+ unset($states[$service]);
+
+ // Replace the stored tokens array
+ $this->session->set($this->stateVariableName, $states);
+ }
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clearAllAuthorizationStates()
+ {
+ $this->session->remove($this->stateVariableName);
+
+ // allow chaining
+ return $this;
+ }
+
+ /**
+ * @return Session
+ */
+ public function getSession()
+ {
+ return $this->session;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php
new file mode 100644
index 00000000..46552cee
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth\Common\Storage;
+
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Storage\Exception\TokenNotFoundException;
+
+/**
+ * All token storage providers must implement this interface.
+ */
+interface TokenStorageInterface
+{
+ /**
+ * @param string $service
+ *
+ * @return TokenInterface
+ *
+ * @throws TokenNotFoundException
+ */
+ public function retrieveAccessToken($service);
+
+ /**
+ * @param string $service
+ * @param TokenInterface $token
+ *
+ * @return TokenStorageInterface
+ */
+ public function storeAccessToken($service, TokenInterface $token);
+
+ /**
+ * @param string $service
+ *
+ * @return bool
+ */
+ public function hasAccessToken($service);
+
+ /**
+ * Delete the users token. Aka, log out.
+ *
+ * @param string $service
+ *
+ * @return TokenStorageInterface
+ */
+ public function clearToken($service);
+
+ /**
+ * Delete *ALL* user tokens. Use with care. Most of the time you will likely
+ * want to use clearToken() instead.
+ *
+ * @return TokenStorageInterface
+ */
+ public function clearAllTokens();
+
+ /**
+ * Store the authorization state related to a given service
+ *
+ * @param string $service
+ * @param string $state
+ *
+ * @return TokenStorageInterface
+ */
+ public function storeAuthorizationState($service, $state);
+
+ /**
+ * Check if an authorization state for a given service exists
+ *
+ * @param string $service
+ *
+ * @return bool
+ */
+ public function hasAuthorizationState($service);
+
+ /**
+ * Retrieve the authorization state for a given service
+ *
+ * @param string $service
+ *
+ * @return string
+ */
+ public function retrieveAuthorizationState($service);
+
+ /**
+ * Clear the authorization state of a given service
+ *
+ * @param string $service
+ *
+ * @return TokenStorageInterface
+ */
+ public function clearAuthorizationState($service);
+
+ /**
+ * Delete *ALL* user authorization states. Use with care. Most of the time you will likely
+ * want to use clearAuthorization() instead.
+ *
+ * @return TokenStorageInterface
+ */
+ public function clearAllAuthorizationStates();
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php b/vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php
new file mode 100644
index 00000000..7a362473
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace OAuth\Common\Token;
+
+/**
+ * Base token implementation for any OAuth version.
+ */
+abstract class AbstractToken implements TokenInterface
+{
+ /**
+ * @var string
+ */
+ protected $accessToken;
+
+ /**
+ * @var string
+ */
+ protected $refreshToken;
+
+ /**
+ * @var int
+ */
+ protected $endOfLife;
+
+ /**
+ * @var array
+ */
+ protected $extraParams = array();
+
+ /**
+ * @param string $accessToken
+ * @param string $refreshToken
+ * @param int $lifetime
+ * @param array $extraParams
+ */
+ public function __construct($accessToken = null, $refreshToken = null, $lifetime = null, $extraParams = array())
+ {
+ $this->accessToken = $accessToken;
+ $this->refreshToken = $refreshToken;
+ $this->setLifetime($lifetime);
+ $this->extraParams = $extraParams;
+ }
+
+ /**
+ * @return string
+ */
+ public function getAccessToken()
+ {
+ return $this->accessToken;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRefreshToken()
+ {
+ return $this->refreshToken;
+ }
+
+ /**
+ * @return int
+ */
+ public function getEndOfLife()
+ {
+ return $this->endOfLife;
+ }
+
+ /**
+ * @param array $extraParams
+ */
+ public function setExtraParams(array $extraParams)
+ {
+ $this->extraParams = $extraParams;
+ }
+
+ /**
+ * @return array
+ */
+ public function getExtraParams()
+ {
+ return $this->extraParams;
+ }
+
+ /**
+ * @param string $accessToken
+ */
+ public function setAccessToken($accessToken)
+ {
+ $this->accessToken = $accessToken;
+ }
+
+ /**
+ * @param int $endOfLife
+ */
+ public function setEndOfLife($endOfLife)
+ {
+ $this->endOfLife = $endOfLife;
+ }
+
+ /**
+ * @param int $lifetime
+ */
+ public function setLifetime($lifetime)
+ {
+ if (0 === $lifetime || static::EOL_NEVER_EXPIRES === $lifetime) {
+ $this->endOfLife = static::EOL_NEVER_EXPIRES;
+ } elseif (null !== $lifetime) {
+ $this->endOfLife = intval($lifetime) + time();
+ } else {
+ $this->endOfLife = static::EOL_UNKNOWN;
+ }
+ }
+
+ /**
+ * @param string $refreshToken
+ */
+ public function setRefreshToken($refreshToken)
+ {
+ $this->refreshToken = $refreshToken;
+ }
+
+ public function isExpired()
+ {
+ return ($this->getEndOfLife() !== TokenInterface::EOL_NEVER_EXPIRES
+ && $this->getEndOfLife() !== TokenInterface::EOL_UNKNOWN
+ && time() > $this->getEndOfLife());
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Token/Exception/ExpiredTokenException.php b/vendor/lusitanian/oauth/src/OAuth/Common/Token/Exception/ExpiredTokenException.php
new file mode 100644
index 00000000..26ad6cc5
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Token/Exception/ExpiredTokenException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\Common\Token\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception thrown when an expired token is attempted to be used.
+ */
+class ExpiredTokenException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/Common/Token/TokenInterface.php b/vendor/lusitanian/oauth/src/OAuth/Common/Token/TokenInterface.php
new file mode 100644
index 00000000..84a41092
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Token/TokenInterface.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace OAuth\Common\Token;
+
+/**
+ * Base token interface for any OAuth version.
+ */
+interface TokenInterface
+{
+ /**
+ * Denotes an unknown end of life time.
+ */
+ const EOL_UNKNOWN = -9001;
+
+ /**
+ * Denotes a token which never expires, should only happen in OAuth1.
+ */
+ const EOL_NEVER_EXPIRES = -9002;
+
+ /**
+ * @return string
+ */
+ public function getAccessToken();
+
+ /**
+ * @return int
+ */
+ public function getEndOfLife();
+
+ /**
+ * @return array
+ */
+ public function getExtraParams();
+
+ /**
+ * @param string $accessToken
+ */
+ public function setAccessToken($accessToken);
+
+ /**
+ * @param int $endOfLife
+ */
+ public function setEndOfLife($endOfLife);
+
+ /**
+ * @param int $lifetime
+ */
+ public function setLifetime($lifetime);
+
+ /**
+ * @param array $extraParams
+ */
+ public function setExtraParams(array $extraParams);
+
+ /**
+ * @return string
+ */
+ public function getRefreshToken();
+
+ /**
+ * @param string $refreshToken
+ */
+ public function setRefreshToken($refreshToken);
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php
new file mode 100644
index 00000000..43c9c9f6
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php
@@ -0,0 +1,305 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\TokenInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Service\AbstractService as BaseAbstractService;
+
+abstract class AbstractService extends BaseAbstractService implements ServiceInterface
+{
+ /** @const OAUTH_VERSION */
+ const OAUTH_VERSION = 1;
+
+ /** @var SignatureInterface */
+ protected $signature;
+
+ /** @var UriInterface|null */
+ protected $baseApiUri;
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage);
+
+ $this->signature = $signature;
+ $this->baseApiUri = $baseApiUri;
+
+ $this->signature->setHashingAlgorithm($this->getSignatureMethod());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function requestRequestToken()
+ {
+ $authorizationHeader = array('Authorization' => $this->buildAuthorizationHeaderForTokenRequest());
+ $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders());
+
+ $responseBody = $this->httpClient->retrieveResponse($this->getRequestTokenEndpoint(), array(), $headers);
+
+ $token = $this->parseRequestTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($additionalParameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function requestAccessToken($token, $verifier, $tokenSecret = null)
+ {
+ if (is_null($tokenSecret)) {
+ $storedRequestToken = $this->storage->retrieveAccessToken($this->service());
+ $tokenSecret = $storedRequestToken->getRequestTokenSecret();
+ }
+ $this->signature->setTokenSecret($tokenSecret);
+
+ $bodyParams = array(
+ 'oauth_verifier' => $verifier,
+ );
+
+ $authorizationHeader = array(
+ 'Authorization' => $this->buildAuthorizationHeaderForAPIRequest(
+ 'POST',
+ $this->getAccessTokenEndpoint(),
+ $this->storage->retrieveAccessToken($this->service()),
+ $bodyParams
+ )
+ );
+
+ $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders());
+
+ $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams, $headers);
+
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ /**
+ * Sends an authenticated API request to the path provided.
+ * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
+ *
+ * @param string|UriInterface $path
+ * @param string $method HTTP method
+ * @param array $body Request body if applicable (key/value pairs)
+ * @param array $extraHeaders Extra headers if applicable.
+ * These will override service-specific any defaults.
+ *
+ * @return string
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ $uri = $this->determineRequestUriFromPath($path, $this->baseApiUri);
+
+ /** @var $token StdOAuth1Token */
+ $token = $this->storage->retrieveAccessToken($this->service());
+ $extraHeaders = array_merge($this->getExtraApiHeaders(), $extraHeaders);
+ $authorizationHeader = array(
+ 'Authorization' => $this->buildAuthorizationHeaderForAPIRequest($method, $uri, $token, $body)
+ );
+ $headers = array_merge($authorizationHeader, $extraHeaders);
+
+ return $this->httpClient->retrieveResponse($uri, $body, $headers, $method);
+ }
+
+ /**
+ * Return any additional headers always needed for this service implementation's OAuth calls.
+ *
+ * @return array
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array();
+ }
+
+ /**
+ * Return any additional headers always needed for this service implementation's API calls.
+ *
+ * @return array
+ */
+ protected function getExtraApiHeaders()
+ {
+ return array();
+ }
+
+ /**
+ * Builds the authorization header for getting an access or request token.
+ *
+ * @param array $extraParameters
+ *
+ * @return string
+ */
+ protected function buildAuthorizationHeaderForTokenRequest(array $extraParameters = array())
+ {
+ $parameters = $this->getBasicAuthorizationHeaderInfo();
+ $parameters = array_merge($parameters, $extraParameters);
+ $parameters['oauth_signature'] = $this->signature->getSignature(
+ $this->getRequestTokenEndpoint(),
+ $parameters,
+ 'POST'
+ );
+
+ $authorizationHeader = 'OAuth ';
+ $delimiter = '';
+ foreach ($parameters as $key => $value) {
+ $authorizationHeader .= $delimiter . rawurlencode($key) . '="' . rawurlencode($value) . '"';
+
+ $delimiter = ', ';
+ }
+
+ return $authorizationHeader;
+ }
+
+ /**
+ * Builds the authorization header for an authenticated API request
+ *
+ * @param string $method
+ * @param UriInterface $uri The uri the request is headed
+ * @param TokenInterface $token
+ * @param array $bodyParams Request body if applicable (key/value pairs)
+ *
+ * @return string
+ */
+ protected function buildAuthorizationHeaderForAPIRequest(
+ $method,
+ UriInterface $uri,
+ TokenInterface $token,
+ $bodyParams = null
+ ) {
+ $this->signature->setTokenSecret($token->getAccessTokenSecret());
+ $parameters = $this->getBasicAuthorizationHeaderInfo();
+ if (isset($parameters['oauth_callback'])) {
+ unset($parameters['oauth_callback']);
+ }
+
+ $parameters = array_merge($parameters, array('oauth_token' => $token->getAccessToken()));
+ $parameters = (is_array($bodyParams)) ? array_merge($parameters, $bodyParams) : $parameters;
+ $parameters['oauth_signature'] = $this->signature->getSignature($uri, $parameters, $method);
+
+ $authorizationHeader = 'OAuth ';
+ $delimiter = '';
+
+ foreach ($parameters as $key => $value) {
+ $authorizationHeader .= $delimiter . rawurlencode($key) . '="' . rawurlencode($value) . '"';
+ $delimiter = ', ';
+ }
+
+ return $authorizationHeader;
+ }
+
+ /**
+ * Builds the authorization header array.
+ *
+ * @return array
+ */
+ protected function getBasicAuthorizationHeaderInfo()
+ {
+ $dateTime = new \DateTime();
+ $headerParameters = array(
+ 'oauth_callback' => $this->credentials->getCallbackUrl(),
+ 'oauth_consumer_key' => $this->credentials->getConsumerId(),
+ 'oauth_nonce' => $this->generateNonce(),
+ 'oauth_signature_method' => $this->getSignatureMethod(),
+ 'oauth_timestamp' => $dateTime->format('U'),
+ 'oauth_version' => $this->getVersion(),
+ );
+
+ return $headerParameters;
+ }
+
+ /**
+ * Pseudo random string generator used to build a unique string to sign each request
+ *
+ * @param int $length
+ *
+ * @return string
+ */
+ protected function generateNonce($length = 32)
+ {
+ $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
+
+ $nonce = '';
+ $maxRand = strlen($characters)-1;
+ for ($i = 0; $i < $length; $i++) {
+ $nonce.= $characters[rand(0, $maxRand)];
+ }
+
+ return $nonce;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getSignatureMethod()
+ {
+ return 'HMAC-SHA1';
+ }
+
+ /**
+ * This returns the version used in the authorization header of the requests
+ *
+ * @return string
+ */
+ protected function getVersion()
+ {
+ return '1.0';
+ }
+
+ /**
+ * Parses the request token response and returns a TokenInterface.
+ * This is only needed to verify the `oauth_callback_confirmed` parameter. The actual
+ * parsing logic is contained in the access token parser.
+ *
+ * @abstract
+ *
+ * @param string $responseBody
+ *
+ * @return TokenInterface
+ *
+ * @throws TokenResponseException
+ */
+ abstract protected function parseRequestTokenResponse($responseBody);
+
+ /**
+ * Parses the access token response and returns a TokenInterface.
+ *
+ * @abstract
+ *
+ * @param string $responseBody
+ *
+ * @return TokenInterface
+ *
+ * @throws TokenResponseException
+ */
+ abstract protected function parseAccessTokenResponse($responseBody);
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/BitBucket.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/BitBucket.php
new file mode 100644
index 00000000..f6d8edfe
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/BitBucket.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class BitBucket extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://bitbucket.org/api/1.0/');
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://bitbucket.org/!api/1.0/oauth/request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://bitbucket.org/!api/1.0/oauth/authenticate');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://bitbucket.org/!api/1.0/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php
new file mode 100644
index 00000000..30dc331c
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Etsy extends AbstractService
+{
+
+ protected $scopes = array();
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://openapi.etsy.com/v2/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ $uri = new Uri($this->baseApiUri . 'oauth/request_token');
+ $scopes = $this->getScopes();
+
+ if (count($scopes)) {
+ $uri->setQuery('scope=' . implode('%20', $scopes));
+ }
+
+ return $uri;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri($this->baseApiUri);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri($this->baseApiUri . 'oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * Set the scopes for permissions
+ * @see https://www.etsy.com/developers/documentation/getting_started/oauth#section_permission_scopes
+ * @param array $scopes
+ *
+ * @return $this
+ */
+ public function setScopes(array $scopes)
+ {
+ if (!is_array($scopes)) {
+ $scopes = array();
+ }
+
+ $this->scopes = $scopes;
+ return $this;
+ }
+
+ /**
+ * Return the defined scopes
+ * @return array
+ */
+ public function getScopes()
+ {
+ return $this->scopes;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/FitBit.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/FitBit.php
new file mode 100644
index 00000000..78032d75
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/FitBit.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class FitBit extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.fitbit.com/1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://api.fitbit.com/oauth/request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.fitbit.com/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.fitbit.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php
new file mode 100644
index 00000000..f06d282a
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Flickr extends AbstractService
+{
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+ if ($baseApiUri === null) {
+ $this->baseApiUri = new Uri('https://api.flickr.com/services/rest/');
+ }
+ }
+
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://www.flickr.com/services/oauth/request_token');
+ }
+
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.flickr.com/services/oauth/authorize');
+ }
+
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.flickr.com/services/oauth/access_token');
+ }
+
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] != 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+ if ($data === null || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ $uri = $this->determineRequestUriFromPath('/', $this->baseApiUri);
+ $uri->addToQuery('method', $path);
+
+ $token = $this->storage->retrieveAccessToken($this->service());
+ $extraHeaders = array_merge($this->getExtraApiHeaders(), $extraHeaders);
+ $authorizationHeader = array(
+ 'Authorization' => $this->buildAuthorizationHeaderForAPIRequest($method, $uri, $token, $body)
+ );
+ $headers = array_merge($authorizationHeader, $extraHeaders);
+
+ return $this->httpClient->retrieveResponse($uri, $body, $headers, $method);
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php
new file mode 100644
index 00000000..28bd250b
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class ScoopIt extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://www.scoop.it/api/1/');
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://www.scoop.it/oauth/request');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.scoop.it/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.scoop.it/oauth/access');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ServiceInterface.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ServiceInterface.php
new file mode 100644
index 00000000..3f91fbf2
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ServiceInterface.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Service\ServiceInterface as BaseServiceInterface;
+use OAuth\OAuth1\Signature\SignatureInterface;
+
+/**
+ * Defines the common methods across OAuth 1 services.
+ */
+interface ServiceInterface extends BaseServiceInterface
+{
+ /**
+ * Retrieves and stores/returns the OAuth1 request token obtained from the service.
+ *
+ * @return TokenInterface $token
+ *
+ * @throws TokenResponseException
+ */
+ public function requestRequestToken();
+
+ /**
+ * Retrieves and stores/returns the OAuth1 access token after a successful authorization.
+ *
+ * @param string $token The request token from the callback.
+ * @param string $verifier
+ * @param string $tokenSecret
+ *
+ * @return TokenInterface $token
+ *
+ * @throws TokenResponseException
+ */
+ public function requestAccessToken($token, $verifier, $tokenSecret);
+
+ /**
+ * @return UriInterface
+ */
+ public function getRequestTokenEndpoint();
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Tumblr.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Tumblr.php
new file mode 100644
index 00000000..3f5d38a8
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Tumblr.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Tumblr extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.tumblr.com/v2/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://www.tumblr.com/oauth/request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.tumblr.com/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.tumblr.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php
new file mode 100644
index 00000000..f46c34e4
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Exception\Exception;
+
+class Twitter extends AbstractService
+{
+ const ENDPOINT_AUTHENTICATE = "https://api.twitter.com/oauth/authenticate";
+ const ENDPOINT_AUTHORIZE = "https://api.twitter.com/oauth/authorize";
+
+ protected $authorizationEndpoint = self::ENDPOINT_AUTHENTICATE;
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.twitter.com/1.1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://api.twitter.com/oauth/request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ if ($this->authorizationEndpoint != self::ENDPOINT_AUTHENTICATE
+ && $this->authorizationEndpoint != self::ENDPOINT_AUTHORIZE) {
+ $this->authorizationEndpoint = self::ENDPOINT_AUTHENTICATE;
+ }
+ return new Uri($this->authorizationEndpoint);
+ }
+
+ /**
+ * @param string $authorizationEndpoint
+ *
+ * @throws Exception
+ */
+ public function setAuthorizationEndpoint($endpoint)
+ {
+ if ($endpoint != self::ENDPOINT_AUTHENTICATE && $endpoint != self::ENDPOINT_AUTHORIZE) {
+ throw new Exception(
+ sprintf("'%s' is not a correct Twitter authorization endpoint.", $endpoint)
+ );
+ }
+ $this->authorizationEndpoint = $endpoint;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.twitter.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php
new file mode 100644
index 00000000..03e3357f
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Xing extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.xing.com/v1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://api.xing.com/v1/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.xing.com/v1/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://api.xing.com/v1/request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php
new file mode 100644
index 00000000..cff291d4
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Yahoo extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://social.yahooapis.com/v1/');
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://api.login.yahoo.com/oauth/v2/get_request_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://api.login.yahoo.com/oauth/v2/request_auth');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.login.yahoo.com/oauth/v2/get_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth1Token();
+
+ $token->setRequestToken($data['oauth_token']);
+ $token->setRequestTokenSecret($data['oauth_token_secret']);
+ $token->setAccessToken($data['oauth_token']);
+ $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+ $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+ unset($data['oauth_token'], $data['oauth_token_secret']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php
new file mode 100644
index 00000000..44c36ce7
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\OAuth1\Signature\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Thrown when an unsupported hash mechanism is requested in signature class.
+ */
+class UnsupportedHashAlgorithmException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Signature.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Signature.php
new file mode 100644
index 00000000..2e13eb37
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/Signature.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace OAuth\OAuth1\Signature;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth1\Signature\Exception\UnsupportedHashAlgorithmException;
+
+class Signature implements SignatureInterface
+{
+ /**
+ * @var Credentials
+ */
+ protected $credentials;
+
+ /**
+ * @var string
+ */
+ protected $algorithm;
+
+ /**
+ * @var string
+ */
+ protected $tokenSecret = null;
+
+ /**
+ * @param CredentialsInterface $credentials
+ */
+ public function __construct(CredentialsInterface $credentials)
+ {
+ $this->credentials = $credentials;
+ }
+
+ /**
+ * @param string $algorithm
+ */
+ public function setHashingAlgorithm($algorithm)
+ {
+ $this->algorithm = $algorithm;
+ }
+
+ /**
+ * @param string $token
+ */
+ public function setTokenSecret($token)
+ {
+ $this->tokenSecret = $token;
+ }
+
+ /**
+ * @param UriInterface $uri
+ * @param array $params
+ * @param string $method
+ *
+ * @return string
+ */
+ public function getSignature(UriInterface $uri, array $params, $method = 'POST')
+ {
+ parse_str($uri->getQuery(), $queryStringData);
+
+ foreach (array_merge($queryStringData, $params) as $key => $value) {
+ $signatureData[rawurlencode($key)] = rawurlencode($value);
+ }
+
+ ksort($signatureData);
+
+ // determine base uri
+ $baseUri = $uri->getScheme() . '://' . $uri->getRawAuthority();
+
+ if ('/' === $uri->getPath()) {
+ $baseUri .= $uri->hasExplicitTrailingHostSlash() ? '/' : '';
+ } else {
+ $baseUri .= $uri->getPath();
+ }
+
+ $baseString = strtoupper($method) . '&';
+ $baseString .= rawurlencode($baseUri) . '&';
+ $baseString .= rawurlencode($this->buildSignatureDataString($signatureData));
+
+ return base64_encode($this->hash($baseString));
+ }
+
+ /**
+ * @param array $signatureData
+ *
+ * @return string
+ */
+ protected function buildSignatureDataString(array $signatureData)
+ {
+ $signatureString = '';
+ $delimiter = '';
+ foreach ($signatureData as $key => $value) {
+ $signatureString .= $delimiter . $key . '=' . $value;
+
+ $delimiter = '&';
+ }
+
+ return $signatureString;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getSigningKey()
+ {
+ $signingKey = rawurlencode($this->credentials->getConsumerSecret()) . '&';
+ if ($this->tokenSecret !== null) {
+ $signingKey .= rawurlencode($this->tokenSecret);
+ }
+
+ return $signingKey;
+ }
+
+ /**
+ * @param string $data
+ *
+ * @return string
+ *
+ * @throws UnsupportedHashAlgorithmException
+ */
+ protected function hash($data)
+ {
+ switch (strtoupper($this->algorithm)) {
+ case 'HMAC-SHA1':
+ return hash_hmac('sha1', $data, $this->getSigningKey(), true);
+ default:
+ throw new UnsupportedHashAlgorithmException(
+ 'Unsupported hashing algorithm (' . $this->algorithm . ') used.'
+ );
+ }
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/SignatureInterface.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/SignatureInterface.php
new file mode 100644
index 00000000..da50ddb6
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Signature/SignatureInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace OAuth\OAuth1\Signature;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+interface SignatureInterface
+{
+ /**
+ * @param string $algorithm
+ */
+ public function setHashingAlgorithm($algorithm);
+
+ /**
+ * @param string $token
+ */
+ public function setTokenSecret($token);
+
+ /**
+ * @param UriInterface $uri
+ * @param array $params
+ * @param string $method
+ *
+ * @return string
+ */
+ public function getSignature(UriInterface $uri, array $params, $method = 'POST');
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/StdOAuth1Token.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/StdOAuth1Token.php
new file mode 100644
index 00000000..a12a7971
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/StdOAuth1Token.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace OAuth\OAuth1\Token;
+
+use OAuth\Common\Token\AbstractToken;
+
+/**
+ * Standard OAuth1 token implementation.
+ * Implements OAuth\OAuth1\Token\TokenInterface in case of any OAuth1 specific features.
+ */
+class StdOAuth1Token extends AbstractToken implements TokenInterface
+{
+ /**
+ * @var string
+ */
+ protected $requestToken;
+
+ /**
+ * @var string
+ */
+ protected $requestTokenSecret;
+
+ /**
+ * @var string
+ */
+ protected $accessTokenSecret;
+
+ /**
+ * @param string $requestToken
+ */
+ public function setRequestToken($requestToken)
+ {
+ $this->requestToken = $requestToken;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRequestToken()
+ {
+ return $this->requestToken;
+ }
+
+ /**
+ * @param string $requestTokenSecret
+ */
+ public function setRequestTokenSecret($requestTokenSecret)
+ {
+ $this->requestTokenSecret = $requestTokenSecret;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRequestTokenSecret()
+ {
+ return $this->requestTokenSecret;
+ }
+
+ /**
+ * @param string $accessTokenSecret
+ */
+ public function setAccessTokenSecret($accessTokenSecret)
+ {
+ $this->accessTokenSecret = $accessTokenSecret;
+ }
+
+ /**
+ * @return string
+ */
+ public function getAccessTokenSecret()
+ {
+ return $this->accessTokenSecret;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/TokenInterface.php b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/TokenInterface.php
new file mode 100644
index 00000000..0bc3f739
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Token/TokenInterface.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth\OAuth1\Token;
+
+use OAuth\Common\Token\TokenInterface as BaseTokenInterface;
+
+/**
+ * OAuth1 specific token interface
+ */
+interface TokenInterface extends BaseTokenInterface
+{
+ /**
+ * @return string
+ */
+ public function getAccessTokenSecret();
+
+ /**
+ * @param string $accessTokenSecret
+ */
+ public function setAccessTokenSecret($accessTokenSecret);
+
+ /**
+ * @return string
+ */
+ public function getRequestTokenSecret();
+
+ /**
+ * @param string $requestTokenSecret
+ */
+ public function setRequestTokenSecret($requestTokenSecret);
+
+ /**
+ * @return string
+ */
+ public function getRequestToken();
+
+ /**
+ * @param string $requestToken
+ */
+ public function setRequestToken($requestToken);
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php
new file mode 100644
index 00000000..57dc76f2
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php
@@ -0,0 +1,333 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Exception\Exception;
+use OAuth\Common\Service\AbstractService as BaseAbstractService;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth2\Service\Exception\InvalidAuthorizationStateException;
+use OAuth\OAuth2\Service\Exception\InvalidScopeException;
+use OAuth\OAuth2\Service\Exception\MissingRefreshTokenException;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Token\Exception\ExpiredTokenException;
+
+abstract class AbstractService extends BaseAbstractService implements ServiceInterface
+{
+ /** @const OAUTH_VERSION */
+ const OAUTH_VERSION = 2;
+
+ /** @var array */
+ protected $scopes;
+
+ /** @var UriInterface|null */
+ protected $baseApiUri;
+
+ /** @var bool */
+ protected $stateParameterInAuthUrl;
+
+ /**
+ * @param CredentialsInterface $credentials
+ * @param ClientInterface $httpClient
+ * @param TokenStorageInterface $storage
+ * @param array $scopes
+ * @param UriInterface|null $baseApiUri
+ * @param bool $stateParameterInAutUrl
+ *
+ * @throws InvalidScopeException
+ */
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null,
+ $stateParameterInAutUrl = false
+ ) {
+ parent::__construct($credentials, $httpClient, $storage);
+ $this->stateParameterInAuthUrl = $stateParameterInAutUrl;
+
+ foreach ($scopes as $scope) {
+ if (!$this->isValidScope($scope)) {
+ throw new InvalidScopeException('Scope ' . $scope . ' is not valid for service ' . get_class($this));
+ }
+ }
+
+ $this->scopes = $scopes;
+
+ $this->baseApiUri = $baseApiUri;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'type' => 'web_server',
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'response_type' => 'code',
+ )
+ );
+
+ $parameters['scope'] = implode(' ', $this->scopes);
+
+ if ($this->needsStateParameterInAuthUrl()) {
+ if (!isset($parameters['state'])) {
+ $parameters['state'] = $this->generateAuthorizationState();
+ }
+ $this->storeAuthorizationState($parameters['state']);
+ }
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function requestAccessToken($code, $state = null)
+ {
+ if (null !== $state) {
+ $this->validateAuthorizationState($state);
+ }
+
+ $bodyParams = array(
+ 'code' => $code,
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'client_secret' => $this->credentials->getConsumerSecret(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'grant_type' => 'authorization_code',
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $bodyParams,
+ $this->getExtraOAuthHeaders()
+ );
+
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ /**
+ * Sends an authenticated API request to the path provided.
+ * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
+ *
+ * @param string|UriInterface $path
+ * @param string $method HTTP method
+ * @param array $body Request body if applicable.
+ * @param array $extraHeaders Extra headers if applicable. These will override service-specific
+ * any defaults.
+ *
+ * @return string
+ *
+ * @throws ExpiredTokenException
+ * @throws Exception
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ $uri = $this->determineRequestUriFromPath($path, $this->baseApiUri);
+ $token = $this->storage->retrieveAccessToken($this->service());
+
+ if ($token->getEndOfLife() !== TokenInterface::EOL_NEVER_EXPIRES
+ && $token->getEndOfLife() !== TokenInterface::EOL_UNKNOWN
+ && time() > $token->getEndOfLife()
+ ) {
+ throw new ExpiredTokenException(
+ sprintf(
+ 'Token expired on %s at %s',
+ date('m/d/Y', $token->getEndOfLife()),
+ date('h:i:s A', $token->getEndOfLife())
+ )
+ );
+ }
+
+ // add the token where it may be needed
+ if (static::AUTHORIZATION_METHOD_HEADER_OAUTH === $this->getAuthorizationMethod()) {
+ $extraHeaders = array_merge(array('Authorization' => 'OAuth ' . $token->getAccessToken()), $extraHeaders);
+ } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING === $this->getAuthorizationMethod()) {
+ $uri->addToQuery('access_token', $token->getAccessToken());
+ } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING_V2 === $this->getAuthorizationMethod()) {
+ $uri->addToQuery('oauth2_access_token', $token->getAccessToken());
+ } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING_V3 === $this->getAuthorizationMethod()) {
+ $uri->addToQuery('apikey', $token->getAccessToken());
+ } elseif (static::AUTHORIZATION_METHOD_HEADER_BEARER === $this->getAuthorizationMethod()) {
+ $extraHeaders = array_merge(array('Authorization' => 'Bearer ' . $token->getAccessToken()), $extraHeaders);
+ }
+
+ $extraHeaders = array_merge($this->getExtraApiHeaders(), $extraHeaders);
+
+ return $this->httpClient->retrieveResponse($uri, $body, $extraHeaders, $method);
+ }
+
+ /**
+ * Accessor to the storage adapter to be able to retrieve tokens
+ *
+ * @return TokenStorageInterface
+ */
+ public function getStorage()
+ {
+ return $this->storage;
+ }
+
+ /**
+ * Refreshes an OAuth2 access token.
+ *
+ * @param TokenInterface $token
+ *
+ * @return TokenInterface $token
+ *
+ * @throws MissingRefreshTokenException
+ */
+ public function refreshAccessToken(TokenInterface $token)
+ {
+ $refreshToken = $token->getRefreshToken();
+
+ if (empty($refreshToken)) {
+ throw new MissingRefreshTokenException();
+ }
+
+ $parameters = array(
+ 'grant_type' => 'refresh_token',
+ 'type' => 'web_server',
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'client_secret' => $this->credentials->getConsumerSecret(),
+ 'refresh_token' => $refreshToken,
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $parameters,
+ $this->getExtraOAuthHeaders()
+ );
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ /**
+ * Return whether or not the passed scope value is valid.
+ *
+ * @param string $scope
+ *
+ * @return bool
+ */
+ public function isValidScope($scope)
+ {
+ $reflectionClass = new \ReflectionClass(get_class($this));
+
+ return in_array($scope, $reflectionClass->getConstants(), true);
+ }
+
+ /**
+ * Check if the given service need to generate a unique state token to build the authorization url
+ *
+ * @return bool
+ */
+ public function needsStateParameterInAuthUrl()
+ {
+ return $this->stateParameterInAuthUrl;
+ }
+
+ /**
+ * Validates the authorization state against a given one
+ *
+ * @param string $state
+ * @throws InvalidAuthorizationStateException
+ */
+ protected function validateAuthorizationState($state)
+ {
+ if ($this->retrieveAuthorizationState() !== $state) {
+ throw new InvalidAuthorizationStateException();
+ }
+ }
+
+ /**
+ * Generates a random string to be used as state
+ *
+ * @return string
+ */
+ protected function generateAuthorizationState()
+ {
+ return md5(rand());
+ }
+
+ /**
+ * Retrieves the authorization state for the current service
+ *
+ * @return string
+ */
+ protected function retrieveAuthorizationState()
+ {
+ return $this->storage->retrieveAuthorizationState($this->service());
+ }
+
+ /**
+ * Stores a given authorization state into the storage
+ *
+ * @param string $state
+ */
+ protected function storeAuthorizationState($state)
+ {
+ $this->storage->storeAuthorizationState($this->service(), $state);
+ }
+
+ /**
+ * Return any additional headers always needed for this service implementation's OAuth calls.
+ *
+ * @return array
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array();
+ }
+
+ /**
+ * Return any additional headers always needed for this service implementation's API calls.
+ *
+ * @return array
+ */
+ protected function getExtraApiHeaders()
+ {
+ return array();
+ }
+
+ /**
+ * Parses the access token response and returns a TokenInterface.
+ *
+ * @abstract
+ *
+ * @param string $responseBody
+ *
+ * @return TokenInterface
+ *
+ * @throws TokenResponseException
+ */
+ abstract protected function parseAccessTokenResponse($responseBody);
+
+ /**
+ * Returns a class constant from ServiceInterface defining the authorization method used for the API
+ * Header is the sane default.
+ *
+ * @return int
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_OAUTH;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Amazon.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Amazon.php
new file mode 100644
index 00000000..035d1a55
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Amazon.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Amazon service.
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @link https://images-na.ssl-images-amazon.com/images/G/01/lwa/dev/docs/website-developer-guide._TTH_.pdf
+ */
+class Amazon extends AbstractService
+{
+ /**
+ * Defined scopes
+ * @link https://images-na.ssl-images-amazon.com/images/G/01/lwa/dev/docs/website-developer-guide._TTH_.pdf
+ */
+ const SCOPE_PROFILE = 'profile';
+ const SCOPE_POSTAL_CODE = 'postal_code';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.amazon.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.amazon.com/ap/oa');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.amazon.com/ap/oatoken');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error_description'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error_description'] . '"');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php
new file mode 100644
index 00000000..e01cbc42
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Bitly extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api-ssl.bitly.com/v3/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://bitly.com/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api-ssl.bitly.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ // I'm invincible!!!
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function requestAccessToken($code, $state = null)
+ {
+ if (null !== $state) {
+ $this->validateAuthorizationState($state);
+ }
+
+ $bodyParams = array(
+ 'code' => $code,
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'client_secret' => $this->credentials->getConsumerSecret(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'grant_type' => 'authorization_code',
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $bodyParams,
+ $this->getExtraOAuthHeaders()
+ );
+
+ // we can scream what we want that we want bitly to return a json encoded string (format=json), but the
+ // WOAH WATCH YOUR LANGUAGE ;) service doesn't seem to like screaming, hence we need to manually
+ // parse the result
+ $parsedResult = array();
+ parse_str($responseBody, $parsedResult);
+
+ $token = $this->parseAccessTokenResponse(json_encode($parsedResult));
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php
new file mode 100644
index 00000000..14696c59
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Box service.
+ *
+ * @author Antoine Corcy <contact@sbin.dk>
+ * @link https://developers.box.com/oauth/
+ */
+class Box extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.box.com/2.0/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.box.com/api/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.box.com/api/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php
new file mode 100644
index 00000000..5905678e
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php
@@ -0,0 +1,151 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+/**
+ * Buffer API.
+ * @author Sumukh Sridhara <@sumukhsridhara>
+ * @link https://bufferapp.com/developers/api
+ */
+class Buffer extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+ if ($baseApiUri === null) {
+ $this->baseApiUri = new Uri('https://api.bufferapp.com/1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://bufferapp.com/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.bufferapp.com/1/oauth2/token.json');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'response_type' => 'code',
+ )
+ );
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function requestRequestToken()
+ {
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getRequestTokenEndpoint(),
+ array(
+ 'client_key' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'response_type' => 'code',
+ )
+ );
+
+ $code = $this->parseRequestTokenResponse($responseBody);
+
+ return $code;
+ }
+
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['code'])) {
+ throw new TokenResponseException('Error in retrieving code.');
+ }
+ return $data['code'];
+ }
+
+ public function requestAccessToken($code)
+ {
+ $bodyParams = array(
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'client_secret' => $this->credentials->getConsumerSecret(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'code' => $code,
+ 'grant_type' => 'authorization_code',
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $bodyParams,
+ $this->getExtraOAuthHeaders()
+ );
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if ($data === null || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dailymotion.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dailymotion.php
new file mode 100644
index 00000000..095a467f
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dailymotion.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Dailymotion service.
+ *
+ * @author Mouhamed SEYE <mouhamed@seye.pro>
+ * @link http://www.dailymotion.com/doc/api/authentication.html
+ */
+class Dailymotion extends AbstractService
+{
+ /**
+ * Scopes
+ *
+ * @var string
+ */
+ const SCOPE_EMAIL = 'email',
+ SCOPE_PROFILE = 'userinfo',
+ SCOPE_VIDEOS = 'manage_videos',
+ SCOPE_COMMENTS = 'manage_comments',
+ SCOPE_PLAYLIST = 'manage_playlists',
+ SCOPE_TILES = 'manage_tiles',
+ SCOPE_SUBSCRIPTIONS = 'manage_subscriptions',
+ SCOPE_FRIENDS = 'manage_friends',
+ SCOPE_FAVORITES = 'manage_favorites',
+ SCOPE_GROUPS = 'manage_groups';
+
+ /**
+ * Dialog form factors
+ *
+ * @var string
+ */
+ const DISPLAY_PAGE = 'page',
+ DISPLAY_POPUP = 'popup',
+ DISPLAY_MOBILE = 'mobile';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.dailymotion.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://api.dailymotion.com/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.dailymotion.com/oauth/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_OAUTH;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error_description']) || isset($data['error'])) {
+ throw new TokenResponseException(
+ sprintf(
+ 'Error in retrieving token: "%s"',
+ isset($data['error_description']) ? $data['error_description'] : $data['error']
+ )
+ );
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Accept' => 'application/json');
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dropbox.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dropbox.php
new file mode 100644
index 00000000..43ec6c7f
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Dropbox.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Dropbox service.
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @link https://www.dropbox.com/developers/core/docs
+ */
+class Dropbox extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.dropbox.com/1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'response_type' => 'code',
+ )
+ );
+
+ $parameters['scope'] = implode(' ', $this->scopes);
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.dropbox.com/1/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.dropbox.com/1/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php
new file mode 100644
index 00000000..398df2fd
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\OAuth2\Service\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception thrown when an invalid accessType for the Google Service is specified
+ */
+class InvalidAccessTypeException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php
new file mode 100644
index 00000000..fe9d550a
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\OAuth2\Service\Exception;
+
+/**
+ * Exception thrown when the state parameter received during the authorization process is invalid.
+ */
+class InvalidAuthorizationStateException extends \Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php
new file mode 100644
index 00000000..c6a51c88
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @author David Desberg <david@daviddesberg.com>
+ * Released under the MIT license.
+ */
+
+namespace OAuth\OAuth2\Service\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception thrown when a scope provided to a service is invalid.
+ */
+class InvalidScopeException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php
new file mode 100644
index 00000000..21eece6a
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @author David Desberg <david@daviddesberg.com>
+ * Released under the MIT license.
+ */
+
+namespace OAuth\OAuth2\Service\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception thrown when service is requested to refresh the access token but no refresh token can be found.
+ */
+class MissingRefreshTokenException extends Exception
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php
new file mode 100644
index 00000000..80b25c05
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Exception\Exception;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Facebook extends AbstractService
+{
+ /**
+ * Facebook www url - used to build dialog urls
+ */
+ const WWW_URL = 'https://www.facebook.com/';
+
+ /**
+ * Defined scopes
+ *
+ * If you don't think this is scary you should not be allowed on the web at all
+ *
+ * @link https://developers.facebook.com/docs/reference/login/
+ * @link https://developers.facebook.com/tools/explorer For a list of permissions use 'Get Access Token'
+ */
+ // email scopes
+ const SCOPE_EMAIL = 'email';
+ // extended permissions
+ const SCOPE_READ_FRIENDLIST = 'read_friendlists';
+ const SCOPE_READ_INSIGHTS = 'read_insights';
+ const SCOPE_READ_MAILBOX = 'read_mailbox';
+ const SCOPE_READ_PAGE_MAILBOXES = 'read_page_mailboxes';
+ const SCOPE_READ_REQUESTS = 'read_requests';
+ const SCOPE_READ_STREAM = 'read_stream';
+ const SCOPE_VIDEO_UPLOAD = 'video_upload';
+ const SCOPE_XMPP_LOGIN = 'xmpp_login';
+ const SCOPE_USER_ONLINE_PRESENCE = 'user_online_presence';
+ const SCOPE_FRIENDS_ONLINE_PRESENCE = 'friends_online_presence';
+ const SCOPE_ADS_MANAGEMENT = 'ads_management';
+ const SCOPE_ADS_READ = 'ads_read';
+ const SCOPE_CREATE_EVENT = 'create_event';
+ const SCOPE_CREATE_NOTE = 'create_note';
+ const SCOPE_EXPORT_STREAM = 'export_stream';
+ const SCOPE_MANAGE_FRIENDLIST = 'manage_friendlists';
+ const SCOPE_MANAGE_NOTIFICATIONS = 'manage_notifications';
+ const SCOPE_PHOTO_UPLOAD = 'photo_upload';
+ const SCOPE_PUBLISH_ACTIONS = 'publish_actions';
+ const SCOPE_PUBLISH_CHECKINS = 'publish_checkins';
+ const SCOPE_PUBLISH_STREAM = 'publish_stream';
+ const SCOPE_RSVP_EVENT = 'rsvp_event';
+ const SCOPE_SHARE_ITEM = 'share_item';
+ const SCOPE_SMS = 'sms';
+ const SCOPE_STATUS_UPDATE = 'status_update';
+ // Extended Profile Properties
+ const SCOPE_USER_FRIENDS = 'user_friends';
+ const SCOPE_USER_ABOUT = 'user_about_me';
+ const SCOPE_FRIENDS_ABOUT = 'friends_about_me';
+ const SCOPE_USER_ACTIVITIES = 'user_activities';
+ const SCOPE_FRIENDS_ACTIVITIES = 'friends_activities';
+ const SCOPE_USER_BIRTHDAY = 'user_birthday';
+ const SCOPE_FRIENDS_BIRTHDAY = 'friends_birthday';
+ const SCOPE_USER_CHECKINS = 'user_checkins';
+ const SCOPE_FRIENDS_CHECKINS = 'friends_checkins';
+ const SCOPE_USER_EDUCATION = 'user_education_history';
+ const SCOPE_FRIENDS_EDUCATION = 'friends_education_history';
+ const SCOPE_USER_EVENTS = 'user_events';
+ const SCOPE_FRIENDS_EVENTS = 'friends_events';
+ const SCOPE_USER_GROUPS = 'user_groups';
+ const SCOPE_FRIENDS_GROUPS = 'friends_groups';
+ const SCOPE_USER_HOMETOWN = 'user_hometown';
+ const SCOPE_FRIENDS_HOMETOWN = 'friends_hometown';
+ const SCOPE_USER_INTERESTS = 'user_interests';
+ const SCOPE_FRIEND_INTERESTS = 'friends_interests';
+ const SCOPE_USER_LIKES = 'user_likes';
+ const SCOPE_FRIENDS_LIKES = 'friends_likes';
+ const SCOPE_USER_LOCATION = 'user_location';
+ const SCOPE_FRIENDS_LOCATION = 'friends_location';
+ const SCOPE_USER_NOTES = 'user_notes';
+ const SCOPE_FRIENDS_NOTES = 'friends_notes';
+ const SCOPE_USER_PHOTOS = 'user_photos';
+ const SCOPE_USER_PHOTO_VIDEO_TAGS = 'user_photo_video_tags';
+ const SCOPE_FRIENDS_PHOTOS = 'friends_photos';
+ const SCOPE_FRIENDS_PHOTO_VIDEO_TAGS = 'friends_photo_video_tags';
+ const SCOPE_USER_QUESTIONS = 'user_questions';
+ const SCOPE_FRIENDS_QUESTIONS = 'friends_questions';
+ const SCOPE_USER_RELATIONSHIPS = 'user_relationships';
+ const SCOPE_FRIENDS_RELATIONSHIPS = 'friends_relationships';
+ const SCOPE_USER_RELATIONSHIPS_DETAILS = 'user_relationship_details';
+ const SCOPE_FRIENDS_RELATIONSHIPS_DETAILS = 'friends_relationship_details';
+ const SCOPE_USER_RELIGION = 'user_religion_politics';
+ const SCOPE_FRIENDS_RELIGION = 'friends_religion_politics';
+ const SCOPE_USER_STATUS = 'user_status';
+ const SCOPE_FRIENDS_STATUS = 'friends_status';
+ const SCOPE_USER_SUBSCRIPTIONS = 'user_subscriptions';
+ const SCOPE_FRIENDS_SUBSCRIPTIONS = 'friends_subscriptions';
+ const SCOPE_USER_VIDEOS = 'user_videos';
+ const SCOPE_FRIENDS_VIDEOS = 'friends_videos';
+ const SCOPE_USER_WEBSITE = 'user_website';
+ const SCOPE_FRIENDS_WEBSITE = 'friends_website';
+ const SCOPE_USER_WORK = 'user_work_history';
+ const SCOPE_FRIENDS_WORK = 'friends_work_history';
+ // Open Graph Permissions
+ const SCOPE_USER_MUSIC = 'user_actions.music';
+ const SCOPE_FRIENDS_MUSIC = 'friends_actions.music';
+ const SCOPE_USER_NEWS = 'user_actions.news';
+ const SCOPE_FRIENDS_NEWS = 'friends_actions.news';
+ const SCOPE_USER_VIDEO = 'user_actions.video';
+ const SCOPE_FRIENDS_VIDEO = 'friends_actions.video';
+ const SCOPE_USER_APP = 'user_actions:APP_NAMESPACE';
+ const SCOPE_FRIENDS_APP = 'friends_actions:APP_NAMESPACE';
+ const SCOPE_USER_GAMES = 'user_games_activity';
+ const SCOPE_FRIENDS_GAMES = 'friends_games_activity';
+ //Page Permissions
+ const SCOPE_PAGES = 'manage_pages';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://graph.facebook.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.facebook.com/dialog/oauth');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://graph.facebook.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ // Facebook gives us a query string ... Oh wait. JSON is too simple, understand ?
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+
+ if (isset($data['expires'])) {
+ $token->setLifeTime($data['expires']);
+ }
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ public function getDialogUri($dialogPath, array $parameters)
+ {
+ if (!isset($parameters['redirect_uri'])) {
+ throw new Exception("Redirect uri is mandatory for this request");
+ }
+ $parameters['app_id'] = $this->credentials->getConsumerId();
+ $baseUrl = self::WWW_URL . 'dialog/' . $dialogPath;
+ $query = http_build_query($parameters);
+ return new Uri($baseUrl . '?' . $query);
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php
new file mode 100644
index 00000000..fdbabf98
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Foursquare extends AbstractService
+{
+ private $apiVersionDate = '20130829';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.foursquare.com/v2/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://foursquare.com/oauth2/authenticate');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://foursquare.com/oauth2/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ // Foursquare tokens evidently never expire...
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ $uri = new Uri($this->baseApiUri . $path);
+ $uri->addToQuery('v', $this->apiVersionDate);
+
+ return parent::request($uri, $method, $body, $extraHeaders);
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php
new file mode 100644
index 00000000..9fee2ba0
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class GitHub extends AbstractService
+{
+ /**
+ * Defined scopes, see http://developer.github.com/v3/oauth/ for definitions.
+ */
+
+ /**
+ * Public read-only access (includes public user profile info, public repo info, and gists)
+ */
+ const SCOPE_READONLY = '';
+
+ /**
+ * Read/write access to profile info only.
+ *
+ * Includes SCOPE_USER_EMAIL and SCOPE_USER_FOLLOW.
+ */
+ const SCOPE_USER = 'user';
+
+ /**
+ * Read access to a user’s email addresses.
+ */
+ const SCOPE_USER_EMAIL = 'user:email';
+
+ /**
+ * Access to follow or unfollow other users.
+ */
+ const SCOPE_USER_FOLLOW = 'user:follow';
+
+ /**
+ * Read/write access to public repos and organizations.
+ */
+ const SCOPE_PUBLIC_REPO = 'public_repo';
+
+ /**
+ * Read/write access to public and private repos and organizations.
+ *
+ * Includes SCOPE_REPO_STATUS.
+ */
+ const SCOPE_REPO = 'repo';
+
+ /**
+ * Grants access to deployment statuses for public and private repositories.
+ * This scope is only necessary to grant other users or services access to deployment statuses,
+ * without granting access to the code.
+ */
+ const SCOPE_REPO_DEPLOYMENT = 'repo_deployment';
+
+ /**
+ * Read/write access to public and private repository commit statuses. This scope is only necessary to grant other
+ * users or services access to private repository commit statuses without granting access to the code. The repo and
+ * public_repo scopes already include access to commit status for private and public repositories, respectively.
+ */
+ const SCOPE_REPO_STATUS = 'repo:status';
+
+ /**
+ * Delete access to adminable repositories.
+ */
+ const SCOPE_DELETE_REPO = 'delete_repo';
+
+ /**
+ * Read access to a user’s notifications. repo is accepted too.
+ */
+ const SCOPE_NOTIFICATIONS = 'notifications';
+
+ /**
+ * Write access to gists.
+ */
+ const SCOPE_GIST = 'gist';
+
+ /**
+ * Grants read and ping access to hooks in public or private repositories.
+ */
+ const SCOPE_HOOKS_READ = 'read:repo_hook';
+
+ /**
+ * Grants read, write, and ping access to hooks in public or private repositories.
+ */
+ const SCOPE_HOOKS_WRITE = 'write:repo_hook';
+
+ /**
+ * Grants read, write, ping, and delete access to hooks in public or private repositories.
+ */
+ const SCOPE_HOOKS_ADMIN = 'admin:repo_hook';
+
+ /**
+ * Read-only access to organization, teams, and membership.
+ */
+ const SCOPE_ORG_READ = 'read:org';
+
+ /**
+ * Publicize and unpublicize organization membership.
+ */
+ const SCOPE_ORG_WRITE = 'write:org';
+
+ /**
+ * Fully manage organization, teams, and memberships.
+ */
+ const SCOPE_ORG_ADMIN = 'admin:org';
+
+ /**
+ * List and view details for public keys.
+ */
+ const SCOPE_PUBLIC_KEY_READ = 'read:public_key';
+
+ /**
+ * Create, list, and view details for public keys.
+ */
+ const SCOPE_PUBLIC_KEY_WRITE = 'write:public_key';
+
+ /**
+ * Fully manage public keys.
+ */
+ const SCOPE_PUBLIC_KEY_ADMIN = 'admin:public_key';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.github.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://github.com/login/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://github.com/login/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ // Github tokens evidently never expire...
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * Used to configure response type -- we want JSON from github, default is query string format
+ *
+ * @return array
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Accept' => 'application/json');
+ }
+
+ /**
+ * Required for GitHub API calls.
+ *
+ * @return array
+ */
+ protected function getExtraApiHeaders()
+ {
+ return array('Accept' => 'application/vnd.github.beta+json');
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php
new file mode 100644
index 00000000..096876b6
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php
@@ -0,0 +1,158 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\OAuth2\Service\Exception\InvalidAccessTypeException;
+use OAuth\Common\Http\Uri\Uri;
+
+class Google extends AbstractService
+{
+ /**
+ * Defined scopes - More scopes are listed here:
+ * https://developers.google.com/oauthplayground/
+ *
+ * Make a pull request if you need more scopes.
+ */
+
+ // Basic
+ const SCOPE_EMAIL = 'email';
+ const SCOPE_PROFILE = 'profile';
+
+ const SCOPE_USERINFO_EMAIL = 'https://www.googleapis.com/auth/userinfo.email';
+ const SCOPE_USERINFO_PROFILE = 'https://www.googleapis.com/auth/userinfo.profile';
+
+ // Google+
+ const SCOPE_GPLUS_ME = 'https://www.googleapis.com/auth/plus.me';
+ const SCOPE_GPLUS_LOGIN = 'https://www.googleapis.com/auth/plus.login';
+ const SCOPE_GPLUS_CIRCLES_READ = 'https://www.googleapis.com/auth/plus.circles.read';
+ const SCOPE_GPLUS_CIRCLES_WRITE = 'https://www.googleapis.com/auth/plus.circles.write';
+ const SCOPE_GPLUS_STREAM_READ = 'https://www.googleapis.com/auth/plus.stream.read';
+ const SCOPE_GPLUS_STREAM_WRITE = 'https://www.googleapis.com/auth/plus.stream.write';
+ const SCOPE_GPLUS_MEDIA = 'https://www.googleapis.com/auth/plus.media.upload';
+
+ // Google Drive
+ const SCOPE_DOCUMENTSLIST = 'https://docs.google.com/feeds/';
+ const SCOPE_SPREADSHEETS = 'https://spreadsheets.google.com/feeds/';
+ const SCOPE_GOOGLEDRIVE = 'https://www.googleapis.com/auth/drive';
+ const SCOPE_DRIVE_APPS = 'https://www.googleapis.com/auth/drive.appdata';
+ const SCOPE_DRIVE_APPS_READ_ONLY = 'https://www.googleapis.com/auth/drive.apps.readonly';
+ const SCOPE_GOOGLEDRIVE_FILES = 'https://www.googleapis.com/auth/drive.file';
+ const SCOPE_DRIVE_METADATA_READ_ONLY = 'https://www.googleapis.com/auth/drive.metadata.readonly';
+ const SCOPE_DRIVE_READ_ONLY = 'https://www.googleapis.com/auth/drive.readonly';
+ const SCOPE_DRIVE_SCRIPTS = 'https://www.googleapis.com/auth/drive.scripts';
+
+ // Adwords
+ const SCOPE_ADSENSE = 'https://www.googleapis.com/auth/adsense';
+ const SCOPE_ADWORDS = 'https://adwords.google.com/api/adwords/';
+ const SCOPE_GAN = 'https://www.googleapis.com/auth/gan'; // google affiliate network...?
+
+ // Google Analytics
+ const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics';
+ const SCOPE_ANALYTICS_EDIT = 'https://www.googleapis.com/auth/analytics.edit';
+ const SCOPE_ANALYTICS_MANAGE_USERS = 'https://www.googleapis.com/auth/analytics.manage.users';
+ const SCOPE_ANALYTICS_READ_ONLY = 'https://www.googleapis.com/auth/analytics.readonly';
+
+ // Other services
+ const SCOPE_BOOKS = 'https://www.googleapis.com/auth/books';
+ const SCOPE_BLOGGER = 'https://www.googleapis.com/auth/blogger';
+ const SCOPE_CALENDAR = 'https://www.googleapis.com/auth/calendar';
+ const SCOPE_CALENDAR_READ_ONLY = 'https://www.googleapis.com/auth/calendar.readonly';
+ const SCOPE_CONTACT = 'https://www.google.com/m8/feeds/';
+ const SCOPE_CHROMEWEBSTORE = 'https://www.googleapis.com/auth/chromewebstore.readonly';
+ const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom';
+ const SCOPE_GMAIL_IMAP_SMTP = 'https://mail.google.com';
+ const SCOPE_PICASAWEB = 'https://picasaweb.google.com/data/';
+ const SCOPE_SITES = 'https://sites.google.com/feeds/';
+ const SCOPE_URLSHORTENER = 'https://www.googleapis.com/auth/urlshortener';
+ const SCOPE_WEBMASTERTOOLS = 'https://www.google.com/webmasters/tools/feeds/';
+ const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks';
+
+ // Cloud services
+ const SCOPE_CLOUDSTORAGE = 'https://www.googleapis.com/auth/devstorage.read_write';
+ const SCOPE_CONTENTFORSHOPPING = 'https://www.googleapis.com/auth/structuredcontent'; // what even is this
+ const SCOPE_USER_PROVISIONING = 'https://apps-apis.google.com/a/feeds/user/';
+ const SCOPE_GROUPS_PROVISIONING = 'https://apps-apis.google.com/a/feeds/groups/';
+ const SCOPE_NICKNAME_PROVISIONING = 'https://apps-apis.google.com/a/feeds/alias/';
+
+ // Old
+ const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut';
+ const SCOPE_GOOGLELATITUDE =
+ 'https://www.googleapis.com/auth/latitude.all.best https://www.googleapis.com/auth/latitude.all.city';
+ const SCOPE_OPENID = 'openid';
+
+ // YouTube
+ const SCOPE_YOUTUBE_GDATA = 'https://gdata.youtube.com';
+ const SCOPE_YOUTUBE_ANALYTICS_MONETARY = 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly';
+ const SCOPE_YOUTUBE_ANALYTICS = 'https://www.googleapis.com/auth/yt-analytics.readonly';
+ const SCOPE_YOUTUBE = 'https://www.googleapis.com/auth/youtube';
+ const SCOPE_YOUTUBE_READ_ONLY = 'https://www.googleapis.com/auth/youtube.readonly';
+ const SCOPE_YOUTUBE_UPLOAD = 'https://www.googleapis.com/auth/youtube.upload';
+ const SCOPE_YOUTUBE_PARTNER = 'https://www.googleapis.com/auth/youtubepartner';
+ const SCOPE_YOUTUBE_PARTNER_AUDIT = 'https://www.googleapis.com/auth/youtubepartner-channel-audit';
+
+ // Google Glass
+ const SCOPE_GLASS_TIMELINE = 'https://www.googleapis.com/auth/glass.timeline';
+ const SCOPE_GLASS_LOCATION = 'https://www.googleapis.com/auth/glass.location';
+
+ // Android Publisher
+ const SCOPE_ANDROID_PUBLISHER = 'https://www.googleapis.com/auth/androidpublisher';
+
+ protected $accessType = 'online';
+
+
+ public function setAccessType($accessType)
+ {
+ if (!in_array($accessType, array('online', 'offline'), true)) {
+ throw new InvalidAccessTypeException('Invalid accessType, expected either online or offline');
+ }
+ $this->accessType = $accessType;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://accounts.google.com/o/oauth2/auth?access_type=' . $this->accessType);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://accounts.google.com/o/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifetime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php
new file mode 100644
index 00000000..96fb0f2d
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+
+class Harvest extends AbstractService
+{
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.harvestapp.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'state' => 'optional-csrf-token',
+ 'response_type' => 'code',
+ )
+ );
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://api.harvestapp.com/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.harvestapp.com/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || ! is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifetime($data['expires_in']);
+ $token->setRefreshToken($data['refresh_token']);
+
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * Refreshes an OAuth2 access token.
+ *
+ * @param TokenInterface $token
+ *
+ * @return TokenInterface $token
+ *
+ * @throws MissingRefreshTokenException
+ */
+ public function refreshAccessToken(TokenInterface $token)
+ {
+ $refreshToken = $token->getRefreshToken();
+
+ if (empty($refreshToken)) {
+ throw new MissingRefreshTokenException();
+ }
+
+ $parameters = array(
+ 'grant_type' => 'refresh_token',
+ 'type' => 'web_server',
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'client_secret' => $this->credentials->getConsumerSecret(),
+ 'refresh_token' => $refreshToken,
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $parameters,
+ $this->getExtraOAuthHeaders()
+ );
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ /**
+ * @return array
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Accept' => 'application/json');
+ }
+
+ /**
+ * Return any additional headers always needed for this service implementation's API calls.
+ *
+ * @return array
+ */
+ protected function getExtraApiHeaders()
+ {
+ return array('Accept' => 'application/json');
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Heroku.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Heroku.php
new file mode 100644
index 00000000..470cedc3
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Heroku.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Heroku service.
+ *
+ * @author Thomas Welton <thomaswelton@me.com>
+ * @link https://devcenter.heroku.com/articles/oauth
+ */
+class Heroku extends AbstractService
+{
+ /**
+ * Defined scopes
+ * @link https://devcenter.heroku.com/articles/oauth#scopes
+ */
+ const SCOPE_GLOBAL = 'global';
+ const SCOPE_IDENTITY = 'identity';
+ const SCOPE_READ = 'read';
+ const SCOPE_WRITE = 'write';
+ const SCOPE_READ_PROTECTED = 'read-protected';
+ const SCOPE_WRITE_PROTECTED = 'write-protected';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.heroku.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://id.heroku.com/oauth/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://id.heroku.com/oauth/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error_description']) || isset($data['error'])) {
+ throw new TokenResponseException(
+ sprintf(
+ 'Error in retrieving token: "%s"',
+ isset($data['error_description']) ? $data['error_description'] : $data['error']
+ )
+ );
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Accept' => 'application/vnd.heroku+json; version=3');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraApiHeaders()
+ {
+ return array('Accept' => 'application/vnd.heroku+json; version=3', 'Content-Type' => 'application/json');
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php
new file mode 100644
index 00000000..49e9c8c9
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Instagram extends AbstractService
+{
+ /**
+ * Defined scopes
+ * @link http://instagram.com/developer/authentication/#scope
+ */
+ const SCOPE_BASIC = 'basic';
+ const SCOPE_COMMENTS = 'comments';
+ const SCOPE_RELATIONSHIPS = 'relationships';
+ const SCOPE_LIKES = 'likes';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.instagram.com/v1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://api.instagram.com/oauth/authorize/');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.instagram.com/oauth/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ // Instagram tokens evidently never expire...
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php
new file mode 100644
index 00000000..bb801e6a
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Linkedin service.
+ *
+ * @author Antoine Corcy <contact@sbin.dk>
+ * @link http://developer.linkedin.com/documents/authentication
+ */
+class Linkedin extends AbstractService
+{
+ /**
+ * Defined scopes
+ * @link http://developer.linkedin.com/documents/authentication#granting
+ */
+ const SCOPE_R_BASICPROFILE = 'r_basicprofile';
+ const SCOPE_R_FULLPROFILE = 'r_fullprofile';
+ const SCOPE_R_EMAILADDRESS = 'r_emailaddress';
+ const SCOPE_R_NETWORK = 'r_network';
+ const SCOPE_R_CONTACTINFO = 'r_contactinfo';
+ const SCOPE_RW_NUS = 'rw_nus';
+ const SCOPE_RW_COMPANY_ADMIN = 'rw_company_admin';
+ const SCOPE_RW_GROUPS = 'rw_groups';
+ const SCOPE_W_MESSAGES = 'w_messages';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.linkedin.com/v1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.linkedin.com/uas/oauth2/authorization');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.linkedin.com/uas/oauth2/accessToken');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING_V2;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php
new file mode 100644
index 00000000..42abd3c1
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Mailchimp extends AbstractService
+{
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (is_null($this->baseApiUri) && $storage->hasAccessToken($this->service())) {
+ $this->setBaseApiUri($storage->retrieveAccessToken($this->service()));
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING_V3;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://login.mailchimp.com/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://login.mailchimp.com/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ // Parse JSON
+ $data = json_decode($responseBody, true);
+
+ // Do validation.
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ // Create token object.
+ $token = new StdOAuth2Token($data['access_token']);
+
+ // Set the right API endpoint.
+ $this->setBaseApiUri($token);
+
+ // Mailchimp tokens evidently never expire...
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ if (is_null($this->baseApiUri)) {
+ $this->setBaseApiUri($this->storage->retrieveAccessToken($this->service()));
+ }
+
+ return parent::request($path, $method, $body, $extraHeaders);
+ }
+
+ /**
+ * Set the right base endpoint.
+ *
+ * @param StdOAuth2Token $token
+ */
+ protected function setBaseApiUri(StdOAuth2Token $token)
+ {
+ // Make request uri.
+ $endpoint = 'https://login.mailchimp.com/oauth2/metadata?oauth_token='. $token->getAccessToken();
+
+ // Grab meta data about the token.
+ $response = $this->httpClient->retrieveResponse(new Uri($endpoint), array(), array(), 'GET');
+
+ // Parse JSON.
+ $meta = json_decode($response, true);
+
+ // Set base api uri.
+ $this->baseApiUri = new Uri('https://'. $meta['dc'] .'.api.mailchimp.com/2.0/');
+
+ // Allow chaining.
+ return $this;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php
new file mode 100644
index 00000000..183ef452
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Microsoft extends AbstractService
+{
+ const SCOPE_BASIC = 'wl.basic';
+ const SCOPE_OFFLINE = 'wl.offline_access';
+ const SCOPE_SIGNIN = 'wl.signin';
+ const SCOPE_BIRTHDAY = 'wl.birthday';
+ const SCOPE_CALENDARS = 'wl.calendars';
+ const SCOPE_CALENDARS_UPDATE = 'wl.calendars_update';
+ const SCOPE_CONTACTS_BIRTHDAY = 'wl.contacts_birthday';
+ const SCOPE_CONTACTS_CREATE = 'wl.contacts_create';
+ const SCOPE_CONTACTS_CALENDARS = 'wl.contacts_calendars';
+ const SCOPE_CONTACTS_PHOTOS = 'wl.contacts_photos';
+ const SCOPE_CONTACTS_SKYDRIVE = 'wl.contacts_skydrive';
+ const SCOPE_EMAILS = 'wl.emails';
+ const SCOPE_EVENTS_CREATE = 'wl.events_create';
+ const SCOPE_MESSENGER = 'wl.messenger';
+ const SCOPE_PHONE_NUMBERS = 'wl.phone_numbers';
+ const SCOPE_PHOTOS = 'wl.photos';
+ const SCOPE_POSTAL_ADDRESSES = 'wl.postal_addresses';
+ const SCOPE_SHARE = 'wl.share';
+ const SCOPE_SKYDRIVE = 'wl.skydrive';
+ const SCOPE_SKYDRIVE_UPDATE = 'wl.skydrive_update';
+ const SCOPE_WORK_PROFILE = 'wl.work_profile';
+ const SCOPE_APPLICATIONS = 'wl.applications';
+ const SCOPE_APPLICATIONS_CREATE = 'wl.applications_create';
+
+ /**
+ * MS uses some magical not officialy supported scope to get even moar info like full emailaddresses.
+ * They agree that giving 3rd party apps access to 3rd party emailaddresses is a pretty lame thing to do so in all
+ * their wisdom they added this scope because fuck you that's why.
+ *
+ * https://github.com/Lusitanian/PHPoAuthLib/issues/214
+ * http://social.msdn.microsoft.com/Forums/live/en-US/c6dcb9ab-aed4-400a-99fb-5650c393a95d/how-retrieve-users-
+ * contacts-email-address?forum=messengerconnect
+ *
+ * Considering this scope is not officially supported: use with care
+ */
+ const SCOPE_CONTACTS_EMAILS = 'wl.contacts_emails';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://apis.live.net/v5.0/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://login.live.com/oauth20_authorize.srf');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://login.live.com/oauth20_token.srf');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifetime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Paypal.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Paypal.php
new file mode 100644
index 00000000..761c09d6
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Paypal.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * PayPal service.
+ *
+ * @author Flávio Heleno <flaviohbatista@gmail.com>
+ * @link https://developer.paypal.com/webapps/developer/docs/integration/direct/log-in-with-paypal/detailed/
+ */
+class Paypal extends AbstractService
+{
+ /**
+ * Defined scopes
+ * @link https://developer.paypal.com/webapps/developer/docs/integration/direct/log-in-with-paypal/detailed/
+ * @see #attributes
+ */
+ const SCOPE_OPENID = 'openid';
+ const SCOPE_PROFILE = 'profile';
+ const SCOPE_PAYPALATTRIBUTES = 'https://uri.paypal.com/services/paypalattributes';
+ const SCOPE_EMAIL = 'email';
+ const SCOPE_ADDRESS = 'address';
+ const SCOPE_PHONE = 'phone';
+ const SCOPE_EXPRESSCHECKOUT = 'https://uri.paypal.com/services/expresscheckout';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.paypal.com/v1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.paypal.com/v1/identity/openidconnect/tokenservice');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['message'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['message'] . '"');
+ } elseif (isset($data['name'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['name'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php
new file mode 100644
index 00000000..8c955440
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Pocket extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+ if ($baseApiUri === null) {
+ $this->baseApiUri = new Uri('https://getpocket.com/v3/');
+ }
+ }
+
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('https://getpocket.com/v3/oauth/request');
+ }
+
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://getpocket.com/auth/authorize');
+ }
+
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://getpocket.com/v3/oauth/authorize');
+ }
+
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ )
+ );
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ public function requestRequestToken()
+ {
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getRequestTokenEndpoint(),
+ array(
+ 'consumer_key' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ )
+ );
+
+ $code = $this->parseRequestTokenResponse($responseBody);
+
+ return $code;
+ }
+
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['code'])) {
+ throw new TokenResponseException('Error in retrieving code.');
+ }
+ return $data['code'];
+ }
+
+ public function requestAccessToken($code)
+ {
+ $bodyParams = array(
+ 'consumer_key' => $this->credentials->getConsumerId(),
+ 'code' => $code,
+ );
+
+ $responseBody = $this->httpClient->retrieveResponse(
+ $this->getAccessTokenEndpoint(),
+ $bodyParams,
+ $this->getExtraOAuthHeaders()
+ );
+ $token = $this->parseAccessTokenResponse($responseBody);
+ $this->storage->storeAccessToken($this->service(), $token);
+
+ return $token;
+ }
+
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if ($data === null || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ #$token->setRequestToken($data['access_token']);
+ $token->setAccessToken($data['access_token']);
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php
new file mode 100644
index 00000000..9e524d12
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Reddit extends AbstractService
+{
+ /**
+ * Defined scopes
+ *
+ * @link http://www.reddit.com/dev/api/oauth
+ */
+ // User scopes
+ const SCOPE_EDIT = 'edit';
+ const SCOPE_HISTORY = 'history';
+ const SCOPE_IDENTITY = 'identity';
+ const SCOPE_MYSUBREDDITS = 'mysubreddits';
+ const SCOPE_PRIVATEMESSAGES = 'privatemessages';
+ const SCOPE_READ = 'read';
+ const SCOPE_SAVE = 'save';
+ const SCOPE_SUBMIT = 'submit';
+ const SCOPE_SUBSCRIBE = 'subscribe';
+ const SCOPE_VOTE = 'vote';
+ // Mod Scopes
+ const SCOPE_MODCONFIG = 'modconfig';
+ const SCOPE_MODFLAIR = 'modflair';
+ const SCOPE_MODLOG = 'modlog';
+ const SCOPE_MODPOST = 'modpost';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://oauth.reddit.com');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://ssl.reddit.com/api/v1/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://ssl.reddit.com/api/v1/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ // Reddit uses a Basic OAuth header
+ return array('Authorization' => 'Basic ' .
+ base64_encode($this->credentials->getConsumerId() . ':' . $this->credentials->getConsumerSecret()));
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/RunKeeper.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/RunKeeper.php
new file mode 100644
index 00000000..71584076
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/RunKeeper.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * RunKeeper service.
+ *
+ * @link http://runkeeper.com/developer/healthgraph/registration-authorization
+ */
+class RunKeeper extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.runkeeper.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ $parameters = array_merge(
+ $additionalParameters,
+ array(
+ 'client_id' => $this->credentials->getConsumerId(),
+ 'redirect_uri' => $this->credentials->getCallbackUrl(),
+ 'response_type' => 'code',
+ )
+ );
+
+ $parameters['scope'] = implode(' ', $this->scopes);
+
+ // Build the url
+ $url = clone $this->getAuthorizationEndpoint();
+ foreach ($parameters as $key => $val) {
+ $url->addToQuery($key, $val);
+ }
+
+ return $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://runkeeper.com/apps/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://runkeeper.com/apps/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php
new file mode 100644
index 00000000..583e4347
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Service\AbstractService;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class SalesforceService extends AbstractService
+{
+ /**
+ * Scopes
+ *
+ * @var string
+ */
+ const SCOPE_API = 'api',
+ SCOPE_REFRESH_TOKEN = 'refresh_token';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://login.salesforce.com/services/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://na1.salesforce.com/services/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ parse_str($responseBody, $data);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+ throw new TokenResponseException('Error in retrieving token.');
+ }
+
+ return $this->parseAccessTokenResponse($responseBody);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ // Salesforce tokens evidently never expire...
+ $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+ unset($data['access_token']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Accept' => 'application/json');
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php
new file mode 100644
index 00000000..f3d1bdad
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Service\ServiceInterface as BaseServiceInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Defines the common methods across OAuth 2 services.
+ */
+interface ServiceInterface extends BaseServiceInterface
+{
+ /**
+ * Authorization methods for various services
+ */
+ const AUTHORIZATION_METHOD_HEADER_OAUTH = 0;
+ const AUTHORIZATION_METHOD_HEADER_BEARER = 1;
+ const AUTHORIZATION_METHOD_QUERY_STRING = 2;
+ const AUTHORIZATION_METHOD_QUERY_STRING_V2 = 3;
+ const AUTHORIZATION_METHOD_QUERY_STRING_V3 = 4;
+
+ /**
+ * Retrieves and stores/returns the OAuth2 access token after a successful authorization.
+ *
+ * @param string $code The access code from the callback.
+ *
+ * @return TokenInterface $token
+ *
+ * @throws TokenResponseException
+ */
+ public function requestAccessToken($code);
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/SoundCloud.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/SoundCloud.php
new file mode 100644
index 00000000..32a3b46c
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/SoundCloud.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class SoundCloud extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.soundcloud.com/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://soundcloud.com/connect');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://api.soundcloud.com/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+
+ if (isset($data['expires_in'])) {
+ $token->setLifetime($data['expires_in']);
+ unset($data['expires_in']);
+ }
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php
new file mode 100644
index 00000000..7e558153
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Ustream extends AbstractService
+{
+ /**
+ * Scopes
+ *
+ * @var string
+ */
+ const SCOPE_OFFLINE = 'offline';
+ const SCOPE_BROADCASTER = 'broadcaster';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.ustream.tv/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.ustream.tv/oauth2/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.ustream.tv/oauth2/token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtraOAuthHeaders()
+ {
+ return array('Authorization' => 'Basic ' . $this->credentials->getConsumerSecret());
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php
new file mode 100644
index 00000000..4a7744ec
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Vkontakte extends AbstractService
+{
+ /**
+ * Defined scopes
+ *
+ * @link http://vk.com/dev/permissions
+ */
+ const SCOPE_EMAIL = 'email';
+ const SCOPE_NOTIFY = 'notify';
+ const SCOPE_FRIENDS = 'friends';
+ const SCOPE_PHOTOS = 'photos';
+ const SCOPE_AUDIO = 'audio';
+ const SCOPE_VIDEO = 'video';
+ const SCOPE_DOCS = 'docs';
+ const SCOPE_NOTES = 'notes';
+ const SCOPE_PAGES = 'pages';
+ const SCOPE_APP_LINK = '';
+ const SCOPE_STATUS = 'status';
+ const SCOPE_OFFERS = 'offers';
+ const SCOPE_QUESTIONS = 'questions';
+ const SCOPE_WALL = 'wall';
+ const SCOPE_GROUPS = 'groups';
+ const SCOPE_MESSAGES = 'messages';
+ const SCOPE_NOTIFICATIONS = 'notifications';
+ const SCOPE_STATS = 'stats';
+ const SCOPE_ADS = 'ads';
+ const SCOPE_OFFLINE = 'offline';
+ const SCOPE_NOHTTPS = 'nohttps';
+
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://api.vk.com/method/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://oauth.vk.com/authorize');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://oauth.vk.com/access_token');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']);
+ $token->setLifeTime($data['expires_in']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Yammer.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Yammer.php
new file mode 100644
index 00000000..994a2935
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Yammer.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Yammer extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+ if (null === $baseApiUri) {
+ $this->baseApiUri = new Uri('https://www.yammer.com/api/v1/');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('https://www.yammer.com/dialog/oauth');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('https://www.yammer.com/oauth2/access_token.json');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationMethod()
+ {
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ $data = json_decode($responseBody, true);
+
+ if (null === $data || !is_array($data)) {
+ throw new TokenResponseException('Unable to parse response.');
+ } elseif (isset($data['error'])) {
+ throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+ }
+
+ $token = new StdOAuth2Token();
+ $token->setAccessToken($data['access_token']['token']);
+ $token->setLifetime($data['access_token']['expires_at']);
+
+ if (isset($data['refresh_token'])) {
+ $token->setRefreshToken($data['refresh_token']);
+ unset($data['refresh_token']);
+ }
+
+ unset($data['access_token']);
+ unset($data['expires_in']);
+
+ $token->setExtraParams($data);
+
+ return $token;
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/StdOAuth2Token.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/StdOAuth2Token.php
new file mode 100644
index 00000000..eaaacac7
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/StdOAuth2Token.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace OAuth\OAuth2\Token;
+
+use OAuth\Common\Token\AbstractToken;
+
+/**
+ * Standard OAuth2 token implementation.
+ * Implements OAuth\OAuth2\Token\TokenInterface for any functionality that might not be provided by AbstractToken.
+ */
+class StdOAuth2Token extends AbstractToken implements TokenInterface
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/TokenInterface.php b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/TokenInterface.php
new file mode 100644
index 00000000..aa592aa1
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Token/TokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth\OAuth2\Token;
+
+use OAuth\Common\Token\TokenInterface as BaseTokenInterface;
+
+interface TokenInterface extends BaseTokenInterface
+{
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php b/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php
new file mode 100644
index 00000000..2be9c463
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php
@@ -0,0 +1,229 @@
+<?php
+
+/**
+ * OAuth service factory.
+ *
+ * PHP version 5.4
+ *
+ * @category OAuth
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2013 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+namespace OAuth;
+
+use OAuth\Common\Service\ServiceInterface;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Client\StreamClient;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Exception\Exception;
+use OAuth\OAuth1\Signature\Signature;
+
+class ServiceFactory
+{
+ /**
+ *@var ClientInterface
+ */
+ protected $httpClient;
+
+ /**
+ * @var array
+ */
+ protected $serviceClassMap = array(
+ 'OAuth1' => array(),
+ 'OAuth2' => array()
+ );
+
+ /**
+ * @var array
+ */
+ protected $serviceBuilders = array(
+ 'OAuth2' => 'buildV2Service',
+ 'OAuth1' => 'buildV1Service',
+ );
+
+ /**
+ * @param ClientInterface $httpClient
+ *
+ * @return ServiceFactory
+ */
+ public function setHttpClient(ClientInterface $httpClient)
+ {
+ $this->httpClient = $httpClient;
+
+ return $this;
+ }
+
+ /**
+ * Register a custom service to classname mapping.
+ *
+ * @param string $serviceName Name of the service
+ * @param string $className Class to instantiate
+ *
+ * @return ServiceFactory
+ *
+ * @throws Exception If the class is nonexistent or does not implement a valid ServiceInterface
+ */
+ public function registerService($serviceName, $className)
+ {
+ if (!class_exists($className)) {
+ throw new Exception(sprintf('Service class %s does not exist.', $className));
+ }
+
+ $reflClass = new \ReflectionClass($className);
+
+ foreach (array('OAuth2', 'OAuth1') as $version) {
+ if ($reflClass->implementsInterface('OAuth\\' . $version . '\\Service\\ServiceInterface')) {
+ $this->serviceClassMap[$version][ucfirst($serviceName)] = $className;
+
+ return $this;
+ }
+ }
+
+ throw new Exception(sprintf('Service class %s must implement ServiceInterface.', $className));
+ }
+
+ /**
+ * Builds and returns oauth services
+ *
+ * It will first try to build an OAuth2 service and if none found it will try to build an OAuth1 service
+ *
+ * @param string $serviceName Name of service to create
+ * @param CredentialsInterface $credentials
+ * @param TokenStorageInterface $storage
+ * @param array|null $scopes If creating an oauth2 service, array of scopes
+ * @param UriInterface|null $baseApiUri
+ *
+ * @return ServiceInterface
+ */
+ public function createService(
+ $serviceName,
+ CredentialsInterface $credentials,
+ TokenStorageInterface $storage,
+ $scopes = array(),
+ UriInterface $baseApiUri = null
+ ) {
+ if (!$this->httpClient) {
+ // for backwards compatibility.
+ $this->httpClient = new StreamClient();
+ }
+
+ foreach ($this->serviceBuilders as $version => $buildMethod) {
+ $fullyQualifiedServiceName = $this->getFullyQualifiedServiceName($serviceName, $version);
+
+ if (class_exists($fullyQualifiedServiceName)) {
+ return $this->$buildMethod($fullyQualifiedServiceName, $credentials, $storage, $scopes, $baseApiUri);
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets the fully qualified name of the service
+ *
+ * @param string $serviceName The name of the service of which to get the fully qualified name
+ * @param string $type The type of the service to get (either OAuth1 or OAuth2)
+ *
+ * @return string The fully qualified name of the service
+ */
+ private function getFullyQualifiedServiceName($serviceName, $type)
+ {
+ $serviceName = ucfirst($serviceName);
+
+ if (isset($this->serviceClassMap[$type][$serviceName])) {
+ return $this->serviceClassMap[$type][$serviceName];
+ }
+
+ return '\\OAuth\\' . $type . '\\Service\\' . $serviceName;
+ }
+
+ /**
+ * Builds v2 services
+ *
+ * @param string $serviceName The fully qualified service name
+ * @param CredentialsInterface $credentials
+ * @param TokenStorageInterface $storage
+ * @param array|null $scopes Array of scopes for the service
+ * @param UriInterface|null $baseApiUri
+ *
+ * @return ServiceInterface
+ *
+ * @throws Exception
+ */
+ private function buildV2Service(
+ $serviceName,
+ CredentialsInterface $credentials,
+ TokenStorageInterface $storage,
+ array $scopes,
+ UriInterface $baseApiUri = null
+ ) {
+ return new $serviceName(
+ $credentials,
+ $this->httpClient,
+ $storage,
+ $this->resolveScopes($serviceName, $scopes),
+ $baseApiUri
+ );
+ }
+
+ /**
+ * Resolves scopes for v2 services
+ *
+ * @param string $serviceName The fully qualified service name
+ * @param array $scopes List of scopes for the service
+ *
+ * @return array List of resolved scopes
+ */
+ private function resolveScopes($serviceName, array $scopes)
+ {
+ $reflClass = new \ReflectionClass($serviceName);
+ $constants = $reflClass->getConstants();
+
+ $resolvedScopes = array();
+ foreach ($scopes as $scope) {
+ $key = strtoupper('SCOPE_' . $scope);
+
+ if (array_key_exists($key, $constants)) {
+ $resolvedScopes[] = $constants[$key];
+ } else {
+ $resolvedScopes[] = $scope;
+ }
+ }
+
+ return $resolvedScopes;
+ }
+
+ /**
+ * Builds v1 services
+ *
+ * @param string $serviceName The fully qualified service name
+ * @param CredentialsInterface $credentials
+ * @param TokenStorageInterface $storage
+ * @param array $scopes
+ * @param UriInterface $baseApiUri
+ *
+ * @return ServiceInterface
+ *
+ * @throws Exception
+ */
+ private function buildV1Service(
+ $serviceName,
+ CredentialsInterface $credentials,
+ TokenStorageInterface $storage,
+ $scopes,
+ UriInterface $baseApiUri = null
+ ) {
+ if (!empty($scopes)) {
+ throw new Exception(
+ 'Scopes passed to ServiceFactory::createService but an OAuth1 service was requested.'
+ );
+ }
+
+ return new $serviceName($credentials, $this->httpClient, $storage, new Signature($credentials), $baseApiUri);
+ }
+}
diff --git a/vendor/lusitanian/oauth/src/OAuth/bootstrap.php b/vendor/lusitanian/oauth/src/OAuth/bootstrap.php
new file mode 100644
index 00000000..548678aa
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/bootstrap.php
@@ -0,0 +1,13 @@
+<?php
+
+/*
+ * Bootstrap the library.
+ */
+
+namespace OAuth;
+
+require_once __DIR__ . '/Common/AutoLoader.php';
+
+$autoloader = new Common\AutoLoader(__NAMESPACE__, dirname(__DIR__));
+
+$autoloader->register();
diff --git a/vendor/lusitanian/oauth/tests/Mocks/Common/FakeProject/NS/SomeClass.php b/vendor/lusitanian/oauth/tests/Mocks/Common/FakeProject/NS/SomeClass.php
new file mode 100644
index 00000000..c033c4e2
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/Common/FakeProject/NS/SomeClass.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace FakeProject\NS;
+
+class SomeClass
+{
+ public function isLoaded()
+ {
+ return true;
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Mocks/Common/Service/Mock.php b/vendor/lusitanian/oauth/tests/Mocks/Common/Service/Mock.php
new file mode 100644
index 00000000..a812c7d1
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/Common/Service/Mock.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OAuthTest\Mocks\Common\Service;
+
+use OAuth\Common\Service\AbstractService;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Mock extends AbstractService
+{
+ /**
+ * Sends an authenticated API request to the path provided.
+ * If the path provided is not an absolute URI, the base API Uri (service-specific) will be used.
+ *
+ * @param string|UriInterface $path
+ * @param string $method HTTP method
+ * @param array $body Request body if applicable (an associative array will
+ * automatically be converted into a urlencoded body)
+ * @param array $extraHeaders Extra headers if applicable. These will override service-specific
+ * any defaults.
+ *
+ * @return string
+ */
+ public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+ {
+ }
+
+ /**
+ * Returns the url to redirect to for authorization purposes.
+ *
+ * @param array $additionalParameters
+ *
+ * @return UriInterface
+ */
+ public function getAuthorizationUri(array $additionalParameters = array())
+ {
+ }
+
+ /**
+ * Returns the authorization API endpoint.
+ *
+ * @return UriInterface
+ */
+ public function getAuthorizationEndpoint()
+ {
+ }
+
+ /**
+ * Returns the access token API endpoint.
+ *
+ * @return UriInterface
+ */
+ public function getAccessTokenEndpoint()
+ {
+ }
+
+ public function testDetermineRequestUriFromPath($path, UriInterface $baseApiUri = null)
+ {
+ return $this->determineRequestUriFromPath($path, $baseApiUri);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Fake.php b/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Fake.php
new file mode 100644
index 00000000..5dac52e7
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Fake.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace OAuthTest\Mocks\OAuth1\Service;
+
+use OAuth\OAuth1\Service\AbstractService;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Fake extends AbstractService
+{
+ public function __construct(
+ CredentialsInterface $credentials,
+ ClientInterface $httpClient,
+ TokenStorageInterface $storage,
+ SignatureInterface $signature,
+ UriInterface $baseApiUri = null
+ ) {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRequestTokenEndpoint()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Mock.php b/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Mock.php
new file mode 100644
index 00000000..9f0bf27f
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/OAuth1/Service/Mock.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace OAuthTest\Mocks\OAuth1\Service;
+
+use OAuth\OAuth1\Service\AbstractService;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+
+class Mock extends AbstractService
+{
+ public function getRequestTokenEndpoint()
+ {
+ return new Uri('http://pieterhordijk.com/token');
+ }
+
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('http://pieterhordijk.com/auth');
+ }
+
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('http://pieterhordijk.com/access');
+ }
+
+ protected function parseRequestTokenResponse($responseBody)
+ {
+ return new StdOAuth1Token();
+ }
+
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ return new StdOAuth1Token();
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Fake.php b/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Fake.php
new file mode 100644
index 00000000..d8de2b00
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Fake.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuthTest\Mocks\OAuth2\Service;
+
+use OAuth\OAuth2\Service\AbstractService;
+
+class Fake extends AbstractService
+{
+ const SCOPE_FOO = 'https://www.pieterhordijk.com/auth';
+ const SCOPE_CUSTOM = 'custom';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorizationEndpoint()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAccessTokenEndpoint()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Mock.php b/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Mock.php
new file mode 100644
index 00000000..508aea00
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Mocks/OAuth2/Service/Mock.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuthTest\Mocks\OAuth2\Service;
+
+use OAuth\OAuth2\Service\AbstractService;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+
+class Mock extends AbstractService
+{
+ const SCOPE_MOCK = 'mock';
+ const SCOPE_MOCK_2 = 'mock2';
+
+ private $authorizationMethod = null;
+
+ public function getAuthorizationEndpoint()
+ {
+ return new Uri('http://pieterhordijk.com/auth');
+ }
+
+ public function getAccessTokenEndpoint()
+ {
+ return new Uri('http://pieterhordijk.com/access');
+ }
+
+ protected function parseAccessTokenResponse($responseBody)
+ {
+ return new StdOAuth2Token();
+ }
+
+ // this allows us to set different auth methods for tests
+ public function setAuthorizationMethod($method)
+ {
+ $this->authorizationMethod = $method;
+ }
+
+ /**
+ * Returns a class constant from ServiceInterface defining the authorization method used for the API
+ * Header is the sane default.
+ *
+ * @return int
+ */
+ protected function getAuthorizationMethod()
+ {
+ switch($this->authorizationMethod) {
+ case 'querystring':
+ return static::AUTHORIZATION_METHOD_QUERY_STRING;
+
+ case 'querystring2':
+ return static::AUTHORIZATION_METHOD_QUERY_STRING_V2;
+
+ case 'bearer':
+ return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+ }
+
+ return parent::getAuthorizationMethod();
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/AutoloaderTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/AutoloaderTest.php
new file mode 100644
index 00000000..eebc3408
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/AutoloaderTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace OAuthTest\Unit\Commen\Core;
+
+use OAuth\Common\AutoLoader;
+
+class AutoLoaderTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ */
+ public function testRegister()
+ {
+ $autoloader = new AutoLoader('Test', '/');
+
+ $this->assertTrue($autoloader->register());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::unregister
+ */
+ public function testUnregister()
+ {
+ $autoloader = new AutoLoader('Test', '/');
+
+ $this->assertTrue($autoloader->register());
+ $this->assertTrue($autoloader->unregister());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadSuccess()
+ {
+ $autoloader = new AutoLoader('FakeProject', dirname(__DIR__) . '/../Mocks/Common');
+
+ $this->assertTrue($autoloader->register());
+
+ $someClass = new \FakeProject\NS\SomeClass();
+
+ $this->assertTrue($someClass->isLoaded());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadSuccessExtraSlashedNamespace()
+ {
+ $autoloader = new AutoLoader('\\\\FakeProject', dirname(__DIR__) . '/../Mocks/Common');
+
+ $this->assertTrue($autoloader->register());
+
+ $someClass = new \FakeProject\NS\SomeClass();
+
+ $this->assertTrue($someClass->isLoaded());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadSuccessExtraForwardSlashedPath()
+ {
+ $autoloader = new AutoLoader('FakeProject', dirname(__DIR__) . '/../Mocks/Common//');
+
+ $this->assertTrue($autoloader->register());
+
+ $someClass = new \FakeProject\NS\SomeClass();
+
+ $this->assertTrue($someClass->isLoaded());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadSuccessExtraBackwardSlashedPath()
+ {
+ $autoloader = new AutoLoader('FakeProject', dirname(__DIR__) . '/../Mocks/Common\\');
+
+ $this->assertTrue($autoloader->register());
+
+ $someClass = new \FakeProject\NS\SomeClass();
+
+ $this->assertTrue($someClass->isLoaded());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadSuccessExtraMixedSlashedPath()
+ {
+ $autoloader = new AutoLoader('FakeProject', dirname(__DIR__) . '/../Mocks/Common\\\\/\\//');
+
+ $this->assertTrue($autoloader->register());
+
+ $someClass = new \FakeProject\NS\SomeClass();
+
+ $this->assertTrue($someClass->isLoaded());
+ }
+
+ /**
+ * @covers OAuth\Common\AutoLoader::__construct
+ * @covers OAuth\Common\AutoLoader::register
+ * @covers OAuth\Common\AutoLoader::load
+ */
+ public function testLoadUnknownClass()
+ {
+ $autoloader = new AutoLoader('FakeProject', dirname(__DIR__) . '/../Mocks/Common\\\\/\\//');
+
+ $this->assertTrue($autoloader->register());
+
+ $this->assertFalse($autoloader->load('IDontExistClass'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Consumer/CredentialsTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Consumer/CredentialsTest.php
new file mode 100644
index 00000000..1a895fbc
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Consumer/CredentialsTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace OAuth\Unit\Common\Consumer;
+
+use OAuth\Common\Consumer\Credentials;
+
+class CredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Consumer\Credentials::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $credentials = new Credentials('foo', 'bar', 'baz');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Consumer\\CredentialsInterface', $credentials);
+ }
+
+ /**
+ * @covers OAuth\Common\Consumer\Credentials::__construct
+ * @covers OAuth\Common\Consumer\Credentials::getConsumerId
+ */
+ public function testGetConsumerId()
+ {
+ $credentials = new Credentials('foo', 'bar', 'baz');
+
+ $this->assertSame('foo', $credentials->getConsumerId());
+ }
+
+ /**
+ * @covers OAuth\Common\Consumer\Credentials::__construct
+ * @covers OAuth\Common\Consumer\Credentials::getConsumerSecret
+ */
+ public function testGetConsumerSecret()
+ {
+ $credentials = new Credentials('foo', 'bar', 'baz');
+
+ $this->assertSame('bar', $credentials->getConsumerSecret());
+ }
+
+ /**
+ * @covers OAuth\Common\Consumer\Credentials::__construct
+ * @covers OAuth\Common\Consumer\Credentials::getCallbackUrl
+ */
+ public function testGetCallbackUrl()
+ {
+ $credentials = new Credentials('foo', 'bar', 'baz');
+
+ $this->assertSame('baz', $credentials->getCallbackUrl());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/AbstractClientTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/AbstractClientTest.php
new file mode 100644
index 00000000..b3531527
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/AbstractClientTest.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Http;
+
+class AbstractClientTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Http\Client\AbstractClient::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $client = $this->getMockForAbstractClass('\\OAuth\\Common\\Http\\Client\\AbstractClient');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\ClientInterface', $client);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\AbstractClient::__construct
+ * @covers OAuth\Common\Http\Client\AbstractClient::setMaxRedirects
+ */
+ public function testSetMaxRedirects()
+ {
+ $client = $this->getMockForAbstractClass('\\OAuth\\Common\\Http\\Client\\AbstractClient');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\AbstractClient', $client->setMaxRedirects(10));
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\ClientInterface', $client->setMaxRedirects(10));
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\AbstractClient::__construct
+ * @covers OAuth\Common\Http\Client\AbstractClient::setTimeout
+ */
+ public function testSetTimeout()
+ {
+ $client = $this->getMockForAbstractClass('\\OAuth\\Common\\Http\\Client\\AbstractClient');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\AbstractClient', $client->setTimeout(25));
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\ClientInterface', $client->setTimeout(25));
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\AbstractClient::__construct
+ * @covers OAuth\Common\Http\Client\AbstractClient::normalizeHeaders
+ */
+ public function testNormalizeHeaders()
+ {
+ $client = $this->getMockForAbstractClass('\\OAuth\\Common\\Http\\Client\\AbstractClient');
+
+ $original = array(
+ 'lowercasekey' => 'lowercasevalue',
+ 'UPPERCASEKEY' => 'UPPERCASEVALUE',
+ 'mIxEdCaSeKey' => 'MiXeDcAsEvAlUe',
+ '31i71casekey' => '31i71casevalue',
+ );
+
+ $goal = array(
+ 'lowercasekey' => 'Lowercasekey: lowercasevalue',
+ 'UPPERCASEKEY' => 'Uppercasekey: UPPERCASEVALUE',
+ 'mIxEdCaSeKey' => 'Mixedcasekey: MiXeDcAsEvAlUe',
+ '31i71casekey' => '31i71casekey: 31i71casevalue',
+ );
+
+ $client->normalizeHeaders($original);
+
+ $this->assertSame($goal, $original);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/CurlClientTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/CurlClientTest.php
new file mode 100644
index 00000000..f635ce89
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/CurlClientTest.php
@@ -0,0 +1,378 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Http\Client;
+
+use OAuth\Common\Http\Client\CurlClient;
+
+class CurlClientTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ *
+ */
+ public function testConstructCorrectInstance()
+ {
+ $client = new CurlClient();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\AbstractClient', $client);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::setForceSSL3
+ */
+ public function testSetForceSSL3()
+ {
+ $client = new CurlClient();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\CurlClient', $client->setForceSSL3(true));
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseThrowsExceptionOnGetRequestWithBody()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ $client = new CurlClient();
+
+ $client->retrieveResponse(
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ 'foo',
+ array(),
+ 'GET'
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseThrowsExceptionOnGetRequestWithBodyMethodConvertedToUpper()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ $client = new CurlClient();
+
+ $client->retrieveResponse(
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ 'foo',
+ array(),
+ 'get'
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseDefaultUserAgent()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array(),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('PHPoAuthLib', $response['headers']['User-Agent']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseCustomUserAgent()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new CurlClient('My Super Awesome Http Client');
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array(),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('My Super Awesome Http Client', $response['headers']['User-Agent']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseWithCustomContentType()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array('Content-Type' => 'foo/bar'),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('foo/bar', $response['headers']['Content-Type']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseWithFormUrlEncodedContentType()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ array('foo' => 'bar', 'baz' => 'fab'),
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('application/x-www-form-urlencoded', $response['headers']['Content-Type']);
+ $this->assertEquals(array('foo' => 'bar', 'baz' => 'fab'), $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseHost()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ array('foo' => 'bar', 'baz' => 'fab'),
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('httpbin.org', $response['headers']['Host']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponsePostRequestWithRequestBodyAsString()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $formData = array('baz' => 'fab', 'foo' => 'bar');
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ $formData,
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame($formData, $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponsePutRequestWithRequestBodyAsString()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/put'));
+
+ $formData = array('baz' => 'fab', 'foo' => 'bar');
+
+ $client = new CurlClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ $formData,
+ array(),
+ 'PUT'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame($formData, $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponsePutRequestWithRequestBodyAsStringNoRedirects()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/put'));
+
+ $formData = array('baz' => 'fab', 'foo' => 'bar');
+
+ $client = new CurlClient();
+
+ $client->setMaxRedirects(0);
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ $formData,
+ array(),
+ 'PUT'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame($formData, $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseWithForcedSsl3()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('https://httpbin.org/get'));
+
+ $client = new CurlClient();
+
+ $client->setForceSSL3(true);
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array('Content-Type' => 'foo/bar'),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('foo/bar', $response['headers']['Content-Type']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\CurlClient::retrieveResponse
+ */
+ public function testRetrieveResponseThrowsExceptionOnInvalidUrl()
+ {
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('jkehfkefcmekjhcnkerjh'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('jkehfkefcmekjhcnkerjh'));
+
+ $client = new CurlClient();
+
+ $client->setForceSSL3(true);
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array('Content-Type' => 'foo/bar'),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('foo/bar', $response['headers']['Content-Type']);
+ }
+
+ public function testAdditionalParameters()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/gzip'));
+
+ $client = new CurlClient();
+ $client->setCurlParameters(array(
+ CURLOPT_ENCODING => 'gzip',
+ ));
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array(),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertNotNull($response);
+ $this->assertSame('gzip', $response['headers']['Accept-Encoding']);
+ $this->assertTrue($response['gzipped']);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/StreamClientTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/StreamClientTest.php
new file mode 100644
index 00000000..f634f406
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Client/StreamClientTest.php
@@ -0,0 +1,283 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Http\Client;
+
+use OAuth\Common\Http\Client\StreamClient;
+
+class StreamClientTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ *
+ */
+ public function testConstructCorrectInstance()
+ {
+ $client = new StreamClient();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Client\\AbstractClient', $client);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ */
+ public function testRetrieveResponseThrowsExceptionOnGetRequestWithBody()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ $client = new StreamClient();
+
+ $client->retrieveResponse(
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ 'foo',
+ array(),
+ 'GET'
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ */
+ public function testRetrieveResponseThrowsExceptionOnGetRequestWithBodyMethodConvertedToUpper()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ $client = new StreamClient();
+
+ $client->retrieveResponse(
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ 'foo',
+ array(),
+ 'get'
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseDefaultUserAgent()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array(),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('PHPoAuthLib', $response['headers']['User-Agent']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseCustomUserAgent()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new StreamClient('My Super Awesome Http Client');
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array(),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('My Super Awesome Http Client', $response['headers']['User-Agent']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseWithCustomContentType()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/get'));
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array('Content-Type' => 'foo/bar'),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('foo/bar', $response['headers']['Content-Type']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseWithFormUrlEncodedContentType()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ array('foo' => 'bar', 'baz' => 'fab'),
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('application/x-www-form-urlencoded', $response['headers']['Content-Type']);
+ $this->assertEquals(array('foo' => 'bar', 'baz' => 'fab'), $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseHost()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ array('foo' => 'bar', 'baz' => 'fab'),
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('httpbin.org', $response['headers']['Host']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponsePostRequestWithRequestBodyAsString()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/post'));
+
+ $formData = array('baz' => 'fab', 'foo' => 'bar');
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ $formData,
+ array(),
+ 'POST'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame($formData, $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponsePutRequestWithRequestBodyAsString()
+ {
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('httpbin.org'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('http://httpbin.org/put'));
+
+ $formData = array('baz' => 'fab', 'foo' => 'bar');
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ $formData,
+ array(),
+ 'PUT'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame($formData, $response['form']);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Client\StreamClient::retrieveResponse
+ * @covers OAuth\Common\Http\Client\StreamClient::generateStreamContext
+ */
+ public function testRetrieveResponseThrowsExceptionOnInvalidRequest()
+ {
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $endPoint = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $endPoint->expects($this->any())
+ ->method('getHost')
+ ->will($this->returnValue('dskjhfckjhekrsfhkehfkreljfrekljfkre'));
+ $endPoint->expects($this->any())
+ ->method('getAbsoluteUri')
+ ->will($this->returnValue('dskjhfckjhekrsfhkehfkreljfrekljfkre'));
+
+ $client = new StreamClient();
+
+ $response = $client->retrieveResponse(
+ $endPoint,
+ '',
+ array('Content-Type' => 'foo/bar'),
+ 'get'
+ );
+
+ $response = json_decode($response, true);
+
+ $this->assertSame('foo/bar', $response['headers']['Content-Type']);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/HttpClientsTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/HttpClientsTest.php
new file mode 100644
index 00000000..6fa9eace
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/HttpClientsTest.php
@@ -0,0 +1,171 @@
+<?php
+
+/**
+ * @category OAuth
+ * @package Tests
+ * @author David Desberg <david@daviddesberg.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+namespace OAuth\Unit\Common\Http;
+
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Http\Client;
+
+class HttpClientsTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var object|\OAuth\Common\Http\Client\ClientInterface[]
+ */
+ protected $clients;
+
+ public function setUp()
+ {
+ $streamClient = new Client\StreamClient();
+ $streamClient->setTimeout(3);
+
+ $curlClient = new Client\CurlClient();
+ $curlClient->setTimeout(3);
+
+ $this->clients[] = $streamClient;
+ $this->clients[] = $curlClient;
+ }
+
+ public function tearDown()
+ {
+ foreach ($this->clients as $client) {
+ unset($client);
+ }
+ }
+
+ /**
+ * Test that extra headers are passed properly
+ */
+ public function testHeaders()
+ {
+ $testUri = new Uri('http://httpbin.org/get');
+
+ $me = $this;
+ $headerCb = function ($response) use ($me) {
+ $data = json_decode($response, true);
+ $me->assertEquals('extraheadertest', $data['headers']['Testingheader']);
+ };
+
+ $this->__doTestRetrieveResponse($testUri, array(), array('Testingheader' => 'extraheadertest'), 'GET', $headerCb);
+ }
+
+ /**
+ * Tests that we get an exception for a >= 400 status code
+ */
+ public function testException()
+ {
+ // sending a post here should get us a 405 which should trigger an exception
+ $testUri = new Uri('http://httpbin.org/delete');
+ foreach ($this->clients as $client) {
+ $this->setExpectedException('OAuth\Common\Http\Exception\TokenResponseException');
+ $client->retrieveResponse($testUri, array('blah' => 'blih'));
+ }
+ }
+
+ /**
+ * Tests the DELETE method
+ */
+ public function testDelete()
+ {
+ $testUri = new Uri('http://httpbin.org/delete');
+
+ $me = $this;
+ $deleteTestCb = function ($response) use ($me) {
+ $data = json_decode($response, true);
+ $me->assertEquals('', $data['data']);
+ };
+
+ $this->__doTestRetrieveResponse($testUri, array(), array(), 'DELETE', $deleteTestCb);
+ }
+
+ /**
+ * Tests the PUT method
+ */
+ public function testPut()
+ {
+ $testUri = new Uri('http://httpbin.org/put');
+
+ $me = $this;
+ $putTestCb = function ($response) use ($me) {
+ // verify the put response
+ $data = json_decode($response, true);
+ $me->assertEquals(json_encode(array('testKey' => 'testValue')), $data['data']);
+ };
+
+ $this->__doTestRetrieveResponse($testUri, json_encode(array('testKey' => 'testValue')), array('Content-Type' => 'application/json'), 'PUT', $putTestCb);
+ }
+
+ /**
+ * Tests the POST method
+ */
+ public function testPost()
+ {
+ // http test server
+ $testUri = new Uri('http://httpbin.org/post');
+
+ $me = $this;
+ $postTestCb = function ($response) use ($me) {
+ // verify the post response
+ $data = json_decode($response, true);
+ // note that we check this because the retrieveResponse wrapper function automatically adds a content-type
+ // if there isn't one and it
+ $me->assertEquals('testValue', $data['form']['testKey']);
+ };
+
+ $this->__doTestRetrieveResponse($testUri, array('testKey' => 'testValue'), array(), 'POST', $postTestCb);
+ }
+
+ /**
+ * Expect exception when we try to send a GET request with a body
+ */
+ public function testInvalidGet()
+ {
+ $testUri = new Uri('http://site.net');
+
+ foreach ($this->clients as $client) {
+ $this->setExpectedException('InvalidArgumentException');
+ $client->retrieveResponse($testUri, array('blah' => 'blih'), array(), 'GET');
+ }
+ }
+
+ /**
+ * Tests the GET method
+ */
+ public function testGet()
+ {
+ // test uri
+ $testUri = new Uri('http://httpbin.org/get?testKey=testValue');
+
+ $me = $this;
+ $getTestCb = function ($response) use ($me) {
+ $data = json_decode($response, true);
+ $me->assertEquals('testValue', $data['args']['testKey']);
+ };
+
+ $this->__doTestRetrieveResponse($testUri, array(), array(), 'GET', $getTestCb);
+ }
+
+ /**
+ * Test on all HTTP clients.
+ *
+ * @param UriInterface $uri
+ * @param array $param
+ * @param array $header
+ * @param string $method
+ * @param \Closure $responseCallback
+ */
+ protected function __doTestRetrieveResponse(UriInterface $uri, $param, array $header, $method, $responseCallback)
+ {
+ foreach ($this->clients as $client) {
+ $response = $client->retrieveResponse($uri, $param, $header, $method);
+ $responseCallback($response, $client);
+ }
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriFactoryTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriFactoryTest.php
new file mode 100644
index 00000000..ea743509
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriFactoryTest.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Http\Uri;
+
+use OAuth\Common\Http\Uri\UriFactory;
+use OAuth\Common\Http\Uri\Uri;
+
+class UriFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ *
+ */
+ public function testConstructCorrectInterface()
+ {
+ $factory = new UriFactory();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriFactoryInterface', $factory);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ */
+ public function testCreateFromSuperGlobalArrayUsingProxyStyle()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array('REQUEST_URI' => 'http://example.com'));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayHttp()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTPS' => 'off',
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * This looks wonky David. Should the port really fallback to 80 even when supplying https as scheme?
+ *
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayHttps()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTPS' => 'on',
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('https://example.com:80/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayPortSupplied()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'SERVER_PORT' => 21,
+ 'REQUEST_URI' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com:21/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayPortNotSet()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayRequestUriSet()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayRedirectUrlSet()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'REDIRECT_URL' => '/foo',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayThrowsExceptionOnDetectingPathMissingIndices()
+ {
+ $factory = new UriFactory();
+
+ $this->setExpectedException('\\RuntimeException');
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayWithQueryString()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo?param1=value1',
+ 'QUERY_STRING' => 'param1=value1',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayWithoutQueryString()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com',
+ 'REQUEST_URI' => '/foo',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromSuperGlobalArray
+ * @covers OAuth\Common\Http\Uri\UriFactory::attemptProxyStyleParse
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectScheme
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectHost
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPort
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectPath
+ * @covers OAuth\Common\Http\Uri\UriFactory::detectQuery
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromParts
+ */
+ public function testCreateFromSuperGlobalArrayHostWithColon()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromSuperGlobalArray(array(
+ 'HTTP_HOST' => 'example.com:80',
+ 'REQUEST_URI' => '/foo',
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com/foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\UriFactory::createFromAbsolute
+ */
+ public function testCreateFromAbsolute()
+ {
+ $factory = new UriFactory();
+
+ $uri = $factory->createFromAbsolute('http://example.com');
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $uri
+ );
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriTest.php
new file mode 100644
index 00000000..bc158ffa
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Http/Uri/UriTest.php
@@ -0,0 +1,898 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Http\Uri;
+
+use OAuth\Common\Http\Uri\Uri;
+
+class UriTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutUri()
+ {
+ $uri = new Uri();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriInterface', $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ */
+ public function testConstructThrowsExceptionOnInvalidUri()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ // http://lxr.php.net/xref/PHP_5_4/ext/standard/tests/url/urls.inc#92
+ $uri = new Uri('http://@:/');
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ */
+ public function testConstructThrowsExceptionOnUriWithoutScheme()
+ {
+ $this->setExpectedException('\\InvalidArgumentException');
+
+ $uri = new Uri('www.pieterhordijk.com');
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getScheme
+ */
+ public function testGetScheme()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('http', $uri->getScheme());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getUserInfo
+ */
+ public function testGetUserInfo()
+ {
+ $uri = new Uri('http://peehaa@example.com');
+
+ $this->assertSame('peehaa', $uri->getUserInfo());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getUserInfo
+ */
+ public function testGetUserInfoWithPass()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('peehaa:********', $uri->getUserInfo());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawUserInfo
+ */
+ public function testGetRawUserInfo()
+ {
+ $uri = new Uri('http://peehaa@example.com');
+
+ $this->assertSame('peehaa', $uri->getRawUserInfo());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawUserInfo
+ */
+ public function testGetRawUserInfoWithPass()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('peehaa:pass', $uri->getRawUserInfo());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getHost
+ */
+ public function testGetHost()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('example.com', $uri->getHost());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPort
+ */
+ public function testGetPortImplicitHttp()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame(80, $uri->getPort());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPort
+ */
+ public function testGetPortImplicitHttps()
+ {
+ $uri = new Uri('https://example.com');
+
+ $this->assertSame(443, $uri->getPort());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPort
+ */
+ public function testGetPortExplicit()
+ {
+ $uri = new Uri('http://example.com:21');
+
+ $this->assertSame(21, $uri->getPort());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPath
+ */
+ public function testGetPathNotSupplied()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('/', $uri->getPath());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPath
+ */
+ public function testGetPathSlash()
+ {
+ $uri = new Uri('http://example.com/');
+
+ $this->assertSame('/', $uri->getPath());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getPath
+ */
+ public function testGetPath()
+ {
+ $uri = new Uri('http://example.com/foo');
+
+ $this->assertSame('/foo', $uri->getPath());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getQuery
+ */
+ public function testGetQueryWithParams()
+ {
+ $uri = new Uri('http://example.com?param1=first&param2=second');
+
+ $this->assertSame('param1=first&param2=second', $uri->getQuery());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getQuery
+ */
+ public function testGetQueryWithoutParams()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('', $uri->getQuery());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getFragment
+ */
+ public function testGetFragmentExists()
+ {
+ $uri = new Uri('http://example.com#foo');
+
+ $this->assertSame('foo', $uri->getFragment());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getFragment
+ */
+ public function testGetFragmentNotExists()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('', $uri->getFragment());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAuthority
+ */
+ public function testGetAuthorityWithoutUserInfo()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('example.com', $uri->getAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAuthority
+ */
+ public function testGetAuthorityWithoutUserInfoWithExplicitPort()
+ {
+ $uri = new Uri('http://example.com:21');
+
+ $this->assertSame('example.com:21', $uri->getAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getAuthority
+ */
+ public function testGetAuthorityWithUsernameWithExplicitPort()
+ {
+ $uri = new Uri('http://peehaa@example.com:21');
+
+ $this->assertSame('peehaa@example.com:21', $uri->getAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getAuthority
+ */
+ public function testGetAuthorityWithUsernameAndPassWithExplicitPort()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com:21');
+
+ $this->assertSame('peehaa:********@example.com:21', $uri->getAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getAuthority
+ */
+ public function testGetAuthorityWithUsernameAndPassWithoutExplicitPort()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('peehaa:********@example.com', $uri->getAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ */
+ public function testGetRawAuthorityWithoutUserInfo()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('example.com', $uri->getRawAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ */
+ public function testGetRawAuthorityWithoutUserInfoWithExplicitPort()
+ {
+ $uri = new Uri('http://example.com:21');
+
+ $this->assertSame('example.com:21', $uri->getRawAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ */
+ public function testGetRawAuthorityWithUsernameWithExplicitPort()
+ {
+ $uri = new Uri('http://peehaa@example.com:21');
+
+ $this->assertSame('peehaa@example.com:21', $uri->getRawAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ */
+ public function testGetRawAuthorityWithUsernameAndPassWithExplicitPort()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com:21');
+
+ $this->assertSame('peehaa:pass@example.com:21', $uri->getRawAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ */
+ public function testGetRawAuthorityWithUsernameAndPassWithoutExplicitPort()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('peehaa:pass@example.com', $uri->getRawAuthority());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriBare()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithAuthority()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('http://peehaa:pass@example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithPath()
+ {
+ $uri = new Uri('http://example.com/foo');
+
+ $this->assertSame('http://example.com/foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithoutPath()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithoutPathExplicitTrailingSlash()
+ {
+ $uri = new Uri('http://example.com/');
+
+ $this->assertSame('http://example.com/', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithQuery()
+ {
+ $uri = new Uri('http://example.com?param1=value1');
+
+ $this->assertSame('http://example.com?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testGetAbsoluteUriWithFragment()
+ {
+ $uri = new Uri('http://example.com#foo');
+
+ $this->assertSame('http://example.com#foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getRelativeUri
+ */
+ public function testGetRelativeUriWithoutPath()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('', $uri->getRelativeUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getRelativeUri
+ */
+ public function testGetRelativeUriWithPath()
+ {
+ $uri = new Uri('http://example.com/foo');
+
+ $this->assertSame('/foo', $uri->getRelativeUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::getRelativeUri
+ */
+ public function testGetRelativeUriWithExplicitTrailingSlash()
+ {
+ $uri = new Uri('http://example.com/');
+
+ $this->assertSame('/', $uri->getRelativeUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringBare()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('http://example.com', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getRawAuthority
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithAuthority()
+ {
+ $uri = new Uri('http://peehaa:pass@example.com');
+
+ $this->assertSame('http://peehaa:********@example.com', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithPath()
+ {
+ $uri = new Uri('http://example.com/foo');
+
+ $this->assertSame('http://example.com/foo', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithoutPath()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertSame('http://example.com', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithoutPathExplicitTrailingSlash()
+ {
+ $uri = new Uri('http://example.com/');
+
+ $this->assertSame('http://example.com/', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithQuery()
+ {
+ $uri = new Uri('http://example.com?param1=value1');
+
+ $this->assertSame('http://example.com?param1=value1', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::__toString
+ */
+ public function testToStringWithFragment()
+ {
+ $uri = new Uri('http://example.com#foo');
+
+ $this->assertSame('http://example.com#foo', (string) $uri);
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPath
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPathEmpty()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPath('');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPath
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPathWithPath()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPath('/foo');
+
+ $this->assertSame('http://example.com/foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPath
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPathWithOnlySlash()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPath('/');
+
+ $this->assertSame('http://example.com/', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setQuery
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetQueryEmpty()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setQuery('');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setQuery
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetQueryFilled()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setQuery('param1=value1&param2=value2');
+
+ $this->assertSame('http://example.com?param1=value1&param2=value2', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::addToQuery
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testAddToQueryAppend()
+ {
+ $uri = new Uri('http://example.com?param1=value1');
+ $uri->addToQuery('param2', 'value2');
+
+ $this->assertSame('http://example.com?param1=value1&param2=value2', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::addToQuery
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testAddToQueryCreate()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->addToQuery('param1', 'value1');
+
+ $this->assertSame('http://example.com?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setFragment
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetFragmentEmpty()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setFragment('');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setFragment
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetFragmentWithData()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setFragment('foo');
+
+ $this->assertSame('http://example.com#foo', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setScheme
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetSchemeWithEmpty()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setScheme('');
+
+ $this->assertSame('://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setScheme
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetSchemeWithData()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setScheme('foo');
+
+ $this->assertSame('foo://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetUserInfoEmpty()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setUserInfo('');
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::protectUserInfo
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetUserInfoWithData()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setUserInfo('foo:bar');
+
+ $this->assertSame('http://foo:bar@example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPort
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPortCustom()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPort('21');
+
+ $this->assertSame('http://example.com:21', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPort
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPortHttpImplicit()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPort(80);
+
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPort
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPortHttpsImplicit()
+ {
+ $uri = new Uri('https://example.com');
+ $uri->setPort(443);
+
+ $this->assertSame('https://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPort
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPortHttpExplicit()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setPort(443);
+
+ $this->assertSame('http://example.com:443', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setPort
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetPortHttpsExplicit()
+ {
+ $uri = new Uri('https://example.com');
+ $uri->setPort(80);
+
+ $this->assertSame('https://example.com:80', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::setHost
+ * @covers OAuth\Common\Http\Uri\Uri::getAbsoluteUri
+ */
+ public function testSetHost()
+ {
+ $uri = new Uri('http://example.com');
+ $uri->setHost('pieterhordijk.com');
+
+ $this->assertSame('http://pieterhordijk.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::hasExplicitTrailingHostSlash
+ */
+ public function testHasExplicitTrailingHostSlashTrue()
+ {
+ $uri = new Uri('http://example.com/');
+
+ $this->assertTrue($uri->hasExplicitTrailingHostSlash());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::hasExplicitTrailingHostSlash
+ */
+ public function testHasExplicitTrailingHostSlashFalse()
+ {
+ $uri = new Uri('http://example.com/foo');
+
+ $this->assertFalse($uri->hasExplicitTrailingHostSlash());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::hasExplicitPortSpecified
+ */
+ public function testHasExplicitPortSpecifiedTrue()
+ {
+ $uri = new Uri('http://example.com:8080');
+
+ $this->assertTrue($uri->hasExplicitPortSpecified());
+ }
+
+ /**
+ * @covers OAuth\Common\Http\Uri\Uri::__construct
+ * @covers OAuth\Common\Http\Uri\Uri::parseUri
+ * @covers OAuth\Common\Http\Uri\Uri::hasExplicitPortSpecified
+ */
+ public function testHasExplicitPortSpecifiedFalse()
+ {
+ $uri = new Uri('http://example.com');
+
+ $this->assertFalse($uri->hasExplicitPortSpecified());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Service/AbstractServiceTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Service/AbstractServiceTest.php
new file mode 100644
index 00000000..2d8bff46
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Service/AbstractServiceTest.php
@@ -0,0 +1,171 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Service;
+
+use OAuthTest\Mocks\Common\Service\Mock;
+
+class AbstractServiceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\Common\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::getStorage
+ */
+ public function testGetStorage()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\Common\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $service->getStorage());
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::service
+ */
+ public function testService()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('Mock', $service->service());
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathUsingUriObject()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Http\\Uri\\UriInterface',
+ $service->testDetermineRequestUriFromPath($this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'))
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathUsingHttpPath()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $uri = $service->testDetermineRequestUriFromPath('http://example.com');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriInterface', $uri);
+ $this->assertSame('http://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathUsingHttpsPath()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $uri = $service->testDetermineRequestUriFromPath('https://example.com');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriInterface', $uri);
+ $this->assertSame('https://example.com', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathThrowsExceptionOnInvalidUri()
+ {
+ $this->setExpectedException('\\OAuth\\Common\\Exception\\Exception');
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $uri = $service->testDetermineRequestUriFromPath('example.com');
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathWithQueryString()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $uri = $service->testDetermineRequestUriFromPath(
+ 'path?param1=value1',
+ new \OAuth\Common\Http\Uri\Uri('https://example.com')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriInterface', $uri);
+ $this->assertSame('https://example.com/path?param1=value1', $uri->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\Common\Service\AbstractService::__construct
+ * @covers OAuth\Common\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testDetermineRequestUriFromPathWithLeadingSlashInPath()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $uri = $service->testDetermineRequestUriFromPath(
+ '/path',
+ new \OAuth\Common\Http\Uri\Uri('https://example.com')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\UriInterface', $uri);
+ $this->assertSame('https://example.com/path', $uri->getAbsoluteUri());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Storage/MemoryTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/MemoryTest.php
new file mode 100644
index 00000000..93a01a79
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/MemoryTest.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Storage;
+
+use OAuth\Common\Storage\Memory;
+
+class MemoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $storage = new Memory();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::storeAccessToken
+ */
+ public function testStoreAccessToken()
+ {
+ $storage = new Memory();
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Storage\\Memory',
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'))
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::storeAccessToken
+ * @covers OAuth\Common\Storage\Memory::retrieveAccessToken
+ * @covers OAuth\Common\Storage\Memory::hasAccessToken
+ */
+ public function testRetrieveAccessTokenValid()
+ {
+ $storage = new Memory();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Token\\TokenInterface', $storage->retrieveAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::retrieveAccessToken
+ * @covers OAuth\Common\Storage\Memory::hasAccessToken
+ */
+ public function testRetrieveAccessTokenThrowsExceptionWhenTokenIsNotFound()
+ {
+ $this->setExpectedException('\\OAuth\\Common\\Storage\\Exception\\TokenNotFoundException');
+
+ $storage = new Memory();
+
+ $storage->retrieveAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::storeAccessToken
+ * @covers OAuth\Common\Storage\Memory::hasAccessToken
+ */
+ public function testHasAccessTokenTrue()
+ {
+ $storage = new Memory();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::hasAccessToken
+ */
+ public function testHasAccessTokenFalse()
+ {
+ $storage = new Memory();
+
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::clearToken
+ */
+ public function testClearTokenIsNotSet()
+ {
+ $storage = new Memory();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Memory', $storage->clearToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::storeAccessToken
+ * @covers OAuth\Common\Storage\Memory::clearToken
+ */
+ public function testClearTokenSet()
+ {
+ $storage = new Memory();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Memory', $storage->clearToken('foo'));
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Memory::__construct
+ * @covers OAuth\Common\Storage\Memory::storeAccessToken
+ * @covers OAuth\Common\Storage\Memory::clearAllTokens
+ */
+ public function testClearAllTokens()
+ {
+ $storage = new Memory();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+ $storage->storeAccessToken('bar', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ $this->assertTrue($storage->hasAccessToken('bar'));
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Memory', $storage->clearAllTokens());
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ $this->assertFalse($storage->hasAccessToken('bar'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Storage/RedisTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/RedisTest.php
new file mode 100644
index 00000000..83e7a284
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/RedisTest.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @category OAuth
+ * @package Tests
+ * @author David Desberg <david@daviddesberg.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+namespace OAuth\Unit\Common\Storage;
+
+use OAuth\Common\Storage\Redis;
+use Predis\Client as Predis;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+
+class RedisTest extends \PHPUnit_Framework_TestCase
+{
+ protected $storage;
+
+ public function setUp()
+ {
+ // connect to a redis daemon
+ $predis = new Predis(array(
+ 'host' => $_ENV['redis_host'],
+ 'port' => $_ENV['redis_port'],
+ ));
+
+ // set it
+ $this->storage = new Redis($predis, 'test_user_token', 'test_user_state');
+
+ try {
+ $predis->connect();
+ } catch (\Predis\Connection\ConnectionException $e) {
+ $this->markTestSkipped('No redis instance available: ' . $e->getMessage());
+ }
+ }
+
+ public function tearDown()
+ {
+ // delete
+ $this->storage->clearAllTokens();
+
+ // close connection
+ $this->storage->getRedis()->quit();
+ }
+
+ /**
+ * Check that the token gets properly stored.
+ */
+ public function testStorage()
+ {
+ // arrange
+ $service_1 = 'Facebook';
+ $service_2 = 'Foursquare';
+
+ $token_1 = new StdOAuth2Token('access_1', 'refresh_1', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+ $token_2 = new StdOAuth2Token('access_2', 'refresh_2', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service_1, $token_1);
+ $this->storage->storeAccessToken($service_2, $token_2);
+
+ // assert
+ $extraParams = $this->storage->retrieveAccessToken($service_1)->getExtraParams();
+ $this->assertEquals('param', $extraParams['extra']);
+ $this->assertEquals($token_1, $this->storage->retrieveAccessToken($service_1));
+ $this->assertEquals($token_2, $this->storage->retrieveAccessToken($service_2));
+ }
+
+ /**
+ * Test hasAccessToken.
+ */
+ public function testHasAccessToken()
+ {
+ // arrange
+ $service = 'Facebook';
+ $this->storage->clearToken($service);
+
+ // act
+ // assert
+ $this->assertFalse($this->storage->hasAccessToken($service));
+ }
+
+ /**
+ * Check that the token gets properly deleted.
+ */
+ public function testStorageClears()
+ {
+ // arrange
+ $service = 'Facebook';
+ $token = new StdOAuth2Token('access', 'refresh', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service, $token);
+ $this->storage->clearToken($service);
+
+ // assert
+ $this->setExpectedException('OAuth\Common\Storage\Exception\TokenNotFoundException');
+ $this->storage->retrieveAccessToken($service);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SessionTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SessionTest.php
new file mode 100644
index 00000000..72f38b1a
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SessionTest.php
@@ -0,0 +1,245 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Storage;
+
+use OAuth\Common\Storage\Session;
+
+class SessionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ *
+ * @runInSeparateProcess
+ */
+ public function testConstructCorrectInterface()
+ {
+ $storage = new Session();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ *
+ * @runInSeparateProcess
+ */
+ public function testConstructWithoutStartingSession()
+ {
+ session_start();
+
+ $storage = new Session(false);
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ *
+ * @runInSeparateProcess
+ */
+ public function testConstructTryingToStartWhileSessionAlreadyExists()
+ {
+ session_start();
+
+ $storage = new Session();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ *
+ * @runInSeparateProcess
+ */
+ public function testConstructWithExistingSessionKey()
+ {
+ session_start();
+
+ $_SESSION['lusitanian_oauth_token'] = array();
+
+ $storage = new Session();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testStoreAccessTokenIsAlreadyArray()
+ {
+ $storage = new Session();
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Storage\\Session',
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'))
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testStoreAccessTokenIsNotArray()
+ {
+ $storage = new Session();
+
+ $_SESSION['lusitanian_oauth_token'] = 'foo';
+
+ $this->assertInstanceOf(
+ '\\OAuth\\Common\\Storage\\Session',
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'))
+ );
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ * @covers OAuth\Common\Storage\Session::retrieveAccessToken
+ * @covers OAuth\Common\Storage\Session::hasAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testRetrieveAccessTokenValid()
+ {
+ $storage = new Session();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Token\\TokenInterface', $storage->retrieveAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::retrieveAccessToken
+ * @covers OAuth\Common\Storage\Session::hasAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testRetrieveAccessTokenThrowsExceptionWhenTokenIsNotFound()
+ {
+ $this->setExpectedException('\\OAuth\\Common\\Storage\\Exception\\TokenNotFoundException');
+
+ $storage = new Session();
+
+ $storage->retrieveAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ * @covers OAuth\Common\Storage\Session::hasAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testHasAccessTokenTrue()
+ {
+ $storage = new Session();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::hasAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testHasAccessTokenFalse()
+ {
+ $storage = new Session();
+
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::clearToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testClearTokenIsNotSet()
+ {
+ $storage = new Session();
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Session', $storage->clearToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ * @covers OAuth\Common\Storage\Session::clearToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testClearTokenSet()
+ {
+ $storage = new Session();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Session', $storage->clearToken('foo'));
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ * @covers OAuth\Common\Storage\Session::clearAllTokens
+ *
+ * @runInSeparateProcess
+ */
+ public function testClearAllTokens()
+ {
+ $storage = new Session();
+
+ $storage->storeAccessToken('foo', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+ $storage->storeAccessToken('bar', $this->getMock('\\OAuth\\Common\\Token\\TokenInterface'));
+
+ $this->assertTrue($storage->hasAccessToken('foo'));
+ $this->assertTrue($storage->hasAccessToken('bar'));
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\Session', $storage->clearAllTokens());
+ $this->assertFalse($storage->hasAccessToken('foo'));
+ $this->assertFalse($storage->hasAccessToken('bar'));
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::__construct
+ * @covers OAuth\Common\Storage\Session::__destruct
+ *
+ * @runInSeparateProcess
+ */
+ public function testDestruct()
+ {
+ $storage = new Session();
+
+ unset($storage);
+ }
+
+ /**
+ * @covers OAuth\Common\Storage\Session::storeAccessToken
+ * @covers OAuth\Common\Storage\Session::retrieveAccessToken
+ *
+ * @runInSeparateProcess
+ */
+ public function testSerializeUnserialize()
+ {
+ $mock = $this->getMock('\\OAuth\\Common\\Token\\AbstractToken', array('__sleep'));
+ $mock->expects($this->once())
+ ->method('__sleep')
+ ->will($this->returnValue(array('accessToken')));
+
+ $storage = new Session();
+ $storage->storeAccessToken('foo', $mock);
+ $retrievedToken = $storage->retrieveAccessToken('foo');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Token\\AbstractToken', $retrievedToken);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Storage/StorageTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/StorageTest.php
new file mode 100644
index 00000000..3fe19906
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/StorageTest.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @category OAuth
+ * @package Tests
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Hannes Van De Vreken <vandevreken.hannes@gmail.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+namespace OAuth\Unit\Common\Storage;
+
+use \OAuth\OAuth2\Token\StdOAuth2Token;
+
+abstract class StorageTest extends \PHPUnit_Framework_TestCase
+{
+ protected $storage;
+
+ /**
+ * Check that the token gets properly stored.
+ */
+ public function testStorage()
+ {
+ // arrange
+ $service_1 = 'Facebook';
+ $service_2 = 'Foursquare';
+
+ $token_1 = new StdOAuth2Token('access_1', 'refresh_1', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+ $token_2 = new StdOAuth2Token('access_2', 'refresh_2', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service_1, $token_1);
+ $this->storage->storeAccessToken($service_2, $token_2);
+
+ // assert
+ $extraParams = $this->storage->retrieveAccessToken($service_1)->getExtraParams();
+ $this->assertEquals('param', $extraParams['extra']);
+ $this->assertEquals($token_1, $this->storage->retrieveAccessToken($service_1));
+ $this->assertEquals($token_2, $this->storage->retrieveAccessToken($service_2));
+ }
+
+ /**
+ * Test hasAccessToken.
+ */
+ public function testHasAccessToken()
+ {
+ // arrange
+ $service = 'Facebook';
+ $this->storage->clearToken($service);
+
+ // act
+ // assert
+ $this->assertFalse($this->storage->hasAccessToken($service));
+ }
+
+ /**
+ * Check that the token gets properly deleted.
+ */
+ public function testStorageClears()
+ {
+ // arrange
+ $service = 'Facebook';
+ $token = new StdOAuth2Token('access', 'refresh', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service, $token);
+ $this->storage->clearToken($service);
+
+ // assert
+ $this->setExpectedException('OAuth\Common\Storage\Exception\TokenNotFoundException');
+ $this->storage->retrieveAccessToken($service);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SymfonySessionTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SymfonySessionTest.php
new file mode 100644
index 00000000..c6434612
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Storage/SymfonySessionTest.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * @category OAuth
+ * @package Tests
+ * @author David Desberg <david@daviddesberg.com>
+ * @copyright Copyright (c) 2012 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+namespace OAuth\Unit\Common\Storage;
+
+use OAuth\Common\Storage\SymfonySession;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
+
+class SymfonySessionTest extends \PHPUnit_Framework_TestCase
+{
+ protected $session;
+
+ protected $storage;
+
+ public function setUp()
+ {
+ // set it
+ $this->session = new Session(new MockArraySessionStorage());
+ $this->storage = new SymfonySession($this->session);
+ }
+
+ public function tearDown()
+ {
+ // delete
+ $this->storage->getSession()->clear();
+ unset($this->storage);
+ }
+
+ /**
+ * Check that the token survives the constructor
+ */
+ public function testStorageSurvivesConstructor()
+ {
+ $service = 'Facebook';
+ $token = new StdOAuth2Token('access', 'refresh', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service, $token);
+ $this->storage = null;
+ $this->storage = new SymfonySession($this->session);
+
+ // assert
+ $extraParams = $this->storage->retrieveAccessToken($service)->getExtraParams();
+ $this->assertEquals('param', $extraParams['extra']);
+ $this->assertEquals($token, $this->storage->retrieveAccessToken($service));
+ }
+
+ /**
+ * Check that the token gets properly stored.
+ */
+ public function testStorage()
+ {
+ // arrange
+ $service_1 = 'Facebook';
+ $service_2 = 'Foursquare';
+
+ $token_1 = new StdOAuth2Token('access_1', 'refresh_1', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+ $token_2 = new StdOAuth2Token('access_2', 'refresh_2', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service_1, $token_1);
+ $this->storage->storeAccessToken($service_2, $token_2);
+
+ // assert
+ $extraParams = $this->storage->retrieveAccessToken($service_1)->getExtraParams();
+ $this->assertEquals('param', $extraParams['extra']);
+ $this->assertEquals($token_1, $this->storage->retrieveAccessToken($service_1));
+ $this->assertEquals($token_2, $this->storage->retrieveAccessToken($service_2));
+ }
+
+ /**
+ * Test hasAccessToken.
+ */
+ public function testHasAccessToken()
+ {
+ // arrange
+ $service = 'Facebook';
+ $this->storage->clearToken($service);
+
+ // act
+ // assert
+ $this->assertFalse($this->storage->hasAccessToken($service));
+ }
+
+ /**
+ * Check that the token gets properly deleted.
+ */
+ public function testStorageClears()
+ {
+ // arrange
+ $service = 'Facebook';
+ $token = new StdOAuth2Token('access', 'refresh', StdOAuth2Token::EOL_NEVER_EXPIRES, array('extra' => 'param'));
+
+ // act
+ $this->storage->storeAccessToken($service, $token);
+ $this->storage->clearToken($service);
+
+ // assert
+ $this->setExpectedException('OAuth\Common\Storage\Exception\TokenNotFoundException');
+ $this->storage->retrieveAccessToken($service);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/Common/Token/AbstractTokenTest.php b/vendor/lusitanian/oauth/tests/Unit/Common/Token/AbstractTokenTest.php
new file mode 100644
index 00000000..54b3bb63
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/Common/Token/AbstractTokenTest.php
@@ -0,0 +1,189 @@
+<?php
+
+namespace OAuthTest\Unit\Common\Token;
+
+use \OAuth\Common\Token\AbstractToken;
+
+class AbstractTokenTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Token\\TokenInterface', $token);
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getAccessToken
+ */
+ public function testGetAccessTokenNotSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $this->assertNull($token->getAccessToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getAccessToken
+ */
+ public function testGetAccessTokenSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo'));
+
+ $this->assertSame('foo', $token->getAccessToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getAccessToken
+ * @covers OAuth\Common\Token\AbstractToken::setAccessToken
+ */
+ public function testSetAccessToken()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $token->setAccessToken('foo');
+
+ $this->assertSame('foo', $token->getAccessToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getRefreshToken
+ */
+ public function testGetRefreshToken()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $this->assertNull($token->getRefreshToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getRefreshToken
+ */
+ public function testGetRefreshTokenSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo', 'bar'));
+
+ $this->assertSame('bar', $token->getRefreshToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getRefreshToken
+ * @covers OAuth\Common\Token\AbstractToken::setRefreshToken
+ */
+ public function testSetRefreshToken()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $token->setRefreshToken('foo');
+
+ $this->assertSame('foo', $token->getRefreshToken());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getExtraParams
+ */
+ public function testGetExtraParamsNotSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $this->assertSame(array(), $token->getExtraParams());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::getExtraParams
+ */
+ public function testGetExtraParamsSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo', 'bar', null, array('foo', 'bar')));
+
+ $this->assertEquals(array('foo', 'bar'), $token->getExtraParams());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setExtraParams
+ * @covers OAuth\Common\Token\AbstractToken::getExtraParams
+ */
+ public function testSetExtraParams()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $token->setExtraParams(array('foo', 'bar'));
+
+ $this->assertSame(array('foo', 'bar'), $token->getExtraParams());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setLifetime
+ * @covers OAuth\Common\Token\AbstractToken::getEndOfLife
+ */
+ public function testGetEndOfLifeNotSet()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $this->assertSame(AbstractToken::EOL_UNKNOWN, $token->getEndOfLife());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setLifetime
+ * @covers OAuth\Common\Token\AbstractToken::getEndOfLife
+ */
+ public function testGetEndOfLifeZero()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo', 'bar', 0));
+
+ $this->assertSame(AbstractToken::EOL_NEVER_EXPIRES, $token->getEndOfLife());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setLifetime
+ * @covers OAuth\Common\Token\AbstractToken::getEndOfLife
+ */
+ public function testGetEndOfLifeNeverExpires()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo', 'bar', AbstractToken::EOL_NEVER_EXPIRES));
+
+ $this->assertSame(AbstractToken::EOL_NEVER_EXPIRES, $token->getEndOfLife());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setLifetime
+ * @covers OAuth\Common\Token\AbstractToken::getEndOfLife
+ */
+ public function testGetEndOfLifeNeverExpiresFiveMinutes()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken', array('foo', 'bar', 5 * 60));
+
+ $this->assertSame(time() + (5*60), $token->getEndOfLife());
+ }
+
+ /**
+ * @covers OAuth\Common\Token\AbstractToken::__construct
+ * @covers OAuth\Common\Token\AbstractToken::setLifetime
+ * @covers OAuth\Common\Token\AbstractToken::getEndOfLife
+ * @covers OAuth\Common\Token\AbstractToken::setEndOfLife
+ */
+ public function testSetEndOfLife()
+ {
+ $token = $this->getMockForAbstractClass('\\OAuth\\Common\\Token\\AbstractToken');
+
+ $token->setEndOfLife(10);
+
+ $this->assertSame(10, $token->getEndOfLife());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/AbstractServiceTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/AbstractServiceTest.php
new file mode 100644
index 00000000..ab5417b2
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/AbstractServiceTest.php
@@ -0,0 +1,215 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuthTest\Mocks\OAuth1\Service\Mock;
+
+class AbstractServiceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\OAuth1\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectParent()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\OAuth1\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::requestRequestToken
+ * @covers OAuth\OAuth1\Service\AbstractService::buildAuthorizationHeaderForTokenRequest
+ * @covers OAuth\OAuth1\Service\AbstractService::getBasicAuthorizationHeaderInfo
+ * @covers OAuth\OAuth1\Service\AbstractService::generateNonce
+ * @covers OAuth\OAuth1\Service\AbstractService::getSignatureMethod
+ * @covers OAuth\OAuth1\Service\AbstractService::getVersion
+ * @covers OAuth\OAuth1\Service\AbstractService::getExtraOAuthHeaders
+ * @covers OAuth\OAuth1\Service\AbstractService::parseRequestTokenResponse
+ */
+ public function testRequestRequestTokenBuildAuthHeaderTokenRequestWithoutParams()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($endpoint, $array, $headers) {
+ \PHPUnit_Framework_Assert::assertSame('http://pieterhordijk.com/token', $endpoint->getAbsoluteUri());
+ }));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::getAuthorizationUri
+ * @covers OAuth\OAuth1\Service\AbstractService::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationUriWithoutParameters()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('http://pieterhordijk.com/auth', $service->getAuthorizationUri()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::getAuthorizationUri
+ * @covers OAuth\OAuth1\Service\AbstractService::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationUriWithParameters()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('http://pieterhordijk.com/auth?foo=bar&baz=beer', $service->getAuthorizationUri(array(
+ 'foo' => 'bar',
+ 'baz' => 'beer',
+ ))->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::requestAccessToken
+ * @covers OAuth\OAuth1\Service\AbstractService::service
+ * @covers OAuth\OAuth1\Service\AbstractService::buildAuthorizationHeaderForAPIRequest
+ * @covers OAuth\OAuth1\Service\AbstractService::getBasicAuthorizationHeaderInfo
+ * @covers OAuth\OAuth1\Service\AbstractService::generateNonce
+ * @covers OAuth\OAuth1\Service\AbstractService::getSignatureMethod
+ * @covers OAuth\OAuth1\Service\AbstractService::getVersion
+ * @covers OAuth\OAuth1\Service\AbstractService::getAccessTokenEndpoint
+ * @covers OAuth\OAuth1\Service\AbstractService::getExtraOAuthHeaders
+ * @covers OAuth\OAuth1\Service\AbstractService::parseAccessTokenResponse
+ */
+ public function testRequestAccessTokenWithoutSecret()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($endpoint, $array, $headers) {
+ \PHPUnit_Framework_Assert::assertSame('http://pieterhordijk.com/access', $endpoint->getAbsoluteUri());
+ }));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getRequestTokenSecret')->will($this->returnValue('baz'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::requestAccessToken
+ * @covers OAuth\OAuth1\Service\AbstractService::service
+ * @covers OAuth\OAuth1\Service\AbstractService::buildAuthorizationHeaderForAPIRequest
+ * @covers OAuth\OAuth1\Service\AbstractService::getBasicAuthorizationHeaderInfo
+ * @covers OAuth\OAuth1\Service\AbstractService::generateNonce
+ * @covers OAuth\OAuth1\Service\AbstractService::getSignatureMethod
+ * @covers OAuth\OAuth1\Service\AbstractService::getVersion
+ * @covers OAuth\OAuth1\Service\AbstractService::getAccessTokenEndpoint
+ * @covers OAuth\OAuth1\Service\AbstractService::getExtraOAuthHeaders
+ * @covers OAuth\OAuth1\Service\AbstractService::parseAccessTokenResponse
+ */
+ public function testRequestAccessTokenWithSecret()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($endpoint, $array, $headers) {
+ \PHPUnit_Framework_Assert::assertSame('http://pieterhordijk.com/access', $endpoint->getAbsoluteUri());
+ }));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\AbstractService::request
+ * @covers OAuth\OAuth1\Service\AbstractService::determineRequestUriFromPath
+ * @covers OAuth\OAuth1\Service\AbstractService::service
+ * @covers OAuth\OAuth1\Service\AbstractService::getExtraApiHeaders
+ * @covers OAuth\OAuth1\Service\AbstractService::buildAuthorizationHeaderForAPIRequest
+ * @covers OAuth\OAuth1\Service\AbstractService::getBasicAuthorizationHeaderInfo
+ * @covers OAuth\OAuth1\Service\AbstractService::generateNonce
+ * @covers OAuth\OAuth1\Service\AbstractService::getSignatureMethod
+ * @covers OAuth\OAuth1\Service\AbstractService::getVersion
+ */
+ public function testRequest()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('response!'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+ //$token->expects($this->once())->method('getRequestTokenSecret')->will($this->returnValue('baz'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('response!', $service->request('/my/awesome/path'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/BitBucketTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/BitBucketTest.php
new file mode 100644
index 00000000..87be98b1
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/BitBucketTest.php
@@ -0,0 +1,278 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\BitBucket;
+
+class BitBucketTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://bitbucket.org/!api/1.0/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://bitbucket.org/!api/1.0/oauth/authenticate',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://bitbucket.org/!api/1.0/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\BitBucket::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\BitBucket::__construct
+ * @covers OAuth\OAuth1\Service\BitBucket::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\BitBucket::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new BitBucket(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/EtsyTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/EtsyTest.php
new file mode 100644
index 00000000..97ad3cdd
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/EtsyTest.php
@@ -0,0 +1,286 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Etsy;
+
+class EtsyTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://openapi.etsy.com/v2/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+
+ $service->setScopes(array('email_r', 'cart_rw'));
+
+ $this->assertSame(
+ 'https://openapi.etsy.com/v2/oauth/request_token?scope=email_r%20cart_rw',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://openapi.etsy.com/v2/',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://openapi.etsy.com/v2/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Etsy::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Etsy::__construct
+ * @covers OAuth\OAuth1\Service\Etsy::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Etsy::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Etsy(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FitBitTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FitBitTest.php
new file mode 100644
index 00000000..a8b7ae2d
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FitBitTest.php
@@ -0,0 +1,278 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\FitBit;
+
+class FitBitTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.fitbit.com/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.fitbit.com/oauth/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.fitbit.com/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\FitBit::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\FitBit::__construct
+ * @covers OAuth\OAuth1\Service\FitBit::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\FitBit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new FitBit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FlickrTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FlickrTest.php
new file mode 100644
index 00000000..ee88f714
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/FlickrTest.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Flickr;
+
+class FlickrTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.flickr.com/services/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.flickr.com/services/oauth/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.flickr.com/services/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Flickr::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::__construct
+ * @covers OAuth\OAuth1\Service\Flickr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Flickr::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Flickr::request
+ */
+ public function testRequest()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('response!'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Flickr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('response!', $service->request('/my/awesome/path'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/ScoopItTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/ScoopItTest.php
new file mode 100644
index 00000000..4ba83fa6
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/ScoopItTest.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\ScoopIt;
+
+class ScoopItTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.scoop.it/oauth/request',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.scoop.it/oauth/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.scoop.it/oauth/access',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::__construct
+ * @covers OAuth\OAuth1\Service\ScoopIt::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\ScoopIt::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\ScoopIt::request
+ */
+ public function testRequest()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('response!'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new ScoopIt(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('response!', $service->request('/my/awesome/path'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TumblrTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TumblrTest.php
new file mode 100644
index 00000000..f1467ad6
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TumblrTest.php
@@ -0,0 +1,278 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Tumblr;
+
+class TumblrTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.tumblr.com/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.tumblr.com/oauth/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.tumblr.com/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Tumblr::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Tumblr::__construct
+ * @covers OAuth\OAuth1\Service\Tumblr::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Tumblr::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Tumblr(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TwitterTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TwitterTest.php
new file mode 100644
index 00000000..bb31fa29
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/TwitterTest.php
@@ -0,0 +1,307 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Twitter;
+
+class TwitterTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.twitter.com/oauth/request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertTrue(
+ in_array(
+ strtolower($service->getAuthorizationEndpoint()->getAbsoluteUri()),
+ array(\OAuth\OAuth1\Service\Twitter::ENDPOINT_AUTHENTICATE, \OAuth\OAuth1\Service\Twitter::ENDPOINT_AUTHORIZE)
+ )
+ );
+
+ $service->setAuthorizationEndpoint( \OAuth\OAuth1\Service\Twitter::ENDPOINT_AUTHORIZE );
+
+ $this->assertTrue(
+ in_array(
+ strtolower($service->getAuthorizationEndpoint()->getAbsoluteUri()),
+ array(\OAuth\OAuth1\Service\Twitter::ENDPOINT_AUTHENTICATE, \OAuth\OAuth1\Service\Twitter::ENDPOINT_AUTHORIZE)
+ )
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::setAuthorizationEndpoint
+ */
+ public function testSetAuthorizationEndpoint()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Exception\\Exception');
+
+ $service->setAuthorizationEndpoint('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.twitter.com/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Twitter::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Twitter::__construct
+ * @covers OAuth\OAuth1\Service\Twitter::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Twitter::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Twitter(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/XingTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/XingTest.php
new file mode 100644
index 00000000..d3a5f4ae
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/XingTest.php
@@ -0,0 +1,239 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Xing;
+
+class XingTest extends \PHPUnit_Framework_TestCase
+{
+ private $client;
+ private $storage;
+ private $xing;
+
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $this->storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+
+ $this->xing = new Xing(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->client,
+ $this->storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $this->assertInstanceOf(
+ '\\OAuth\\OAuth1\\Service\\ServiceInterface', $this->xing
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $this->assertInstanceOf(
+ '\\OAuth\\OAuth1\\Service\\AbstractService', $this->xing
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Xing(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->client,
+ $this->storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $this->assertSame(
+ 'https://api.xing.com/v1/request_token',
+ $this->xing->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $this->assertSame(
+ 'https://api.xing.com/v1/authorize',
+ $this->xing->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $this->assertSame(
+ 'https://api.xing.com/v1/access_token',
+ $this->xing->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue(null));
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $this->xing->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue('notanarray'));
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $this->xing->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue('foo=bar'));
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $this->xing->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue('oauth_callback_confirmed=false'));
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $this->xing->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Xing::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $this->assertInstanceOf(
+ '\\OAuth\\OAuth1\\Token\\StdOAuth1Token',
+ $this->xing->requestRequestToken()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $this->storage
+ ->expects($this->any())
+ ->method('retrieveAccessToken')
+ ->will($this->returnValue($token));
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $this->xing->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Xing::__construct
+ * @covers OAuth\OAuth1\Service\Xing::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Xing::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $this->client
+ ->expects($this->once())
+ ->method('retrieveResponse')
+ ->will($this->returnValue('oauth_token=foo&oauth_token_secret=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $this->storage
+ ->expects($this->any())
+ ->method('retrieveAccessToken')
+ ->will($this->returnValue($token));
+
+
+ $this->assertInstanceOf(
+ '\\OAuth\\OAuth1\\Token\\StdOAuth1Token',
+ $this->xing->requestAccessToken('foo', 'bar', $token)
+ );
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/YahooTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/YahooTest.php
new file mode 100644
index 00000000..e8feb5dc
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Service/YahooTest.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Service;
+
+use OAuth\OAuth1\Service\Yahoo;
+
+class YahooTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ */
+ public function testGetRequestTokenEndpoint()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.login.yahoo.com/oauth/v2/get_request_token',
+ $service->getRequestTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.login.yahoo.com/oauth/v2/request_auth',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.login.yahoo.com/oauth/v2/get_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseNotAnArray()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('notanarray'));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotSet()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('foo=bar'));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseRequestTokenResponse
+ */
+ public function testParseRequestTokenResponseThrowsExceptionOnResponseCallbackNotTrue()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=false'
+ ));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestRequestToken();
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseRequestTokenResponse
+ * @covers OAuth\OAuth1\Service\Yahoo::parseAccessTokenResponse
+ */
+ public function testParseRequestTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_callback_confirmed=true&oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=bar'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo', 'bar', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::__construct
+ * @covers OAuth\OAuth1\Service\Yahoo::getRequestTokenEndpoint
+ * @covers OAuth\OAuth1\Service\Yahoo::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(
+ 'oauth_token=foo&oauth_token_secret=bar'
+ ));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\StdOAuth1Token', $service->requestAccessToken('foo', 'bar', $token));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Service\Yahoo::request
+ */
+ public function testRequest()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('response!'));
+
+ $token = $this->getMock('\\OAuth\\OAuth1\\Token\\TokenInterface');
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->any())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Yahoo(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ $this->getMock('\\OAuth\\OAuth1\\Signature\\SignatureInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertSame('response!', $service->request('/my/awesome/path'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Signature/SignatureTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Signature/SignatureTest.php
new file mode 100644
index 00000000..44c731f5
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Signature/SignatureTest.php
@@ -0,0 +1,325 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Signature;
+
+use OAuth\OAuth1\Signature\Signature;
+
+class SignatureTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $signature = new Signature($this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'));
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Signature\\SignatureInterface', $signature);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ */
+ public function testSetHashingAlgorithm()
+ {
+ $signature = new Signature($this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'));
+
+ $this->assertNull($signature->setHashingAlgorithm('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ */
+ public function testSetTokenSecret()
+ {
+ $signature = new Signature($this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'));
+
+ $this->assertNull($signature->setTokenSecret('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureBareUri()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+ $signature->setTokenSecret('foo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue(''));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue(''));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/foo'));
+
+ $this->assertSame('uoCpiII/Lg/cPiF0XrU2pj4eGFQ=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureWithQueryString()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+ $signature->setTokenSecret('foo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue(''));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/foo'));
+
+ $this->assertSame('LxtD+WjJBRppIUvEI79iQ7I0hSo=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureWithAuthority()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+ $signature->setTokenSecret('foo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue('peehaa:pass'));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/foo'));
+
+ $this->assertSame('MHvkRndIntLrxiPkjkiCNsMEqv4=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureWithBarePathNonExplicitTrailingHostSlash()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+ $signature->setTokenSecret('foo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue('peehaa:pass'));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+ $uri->expects($this->any())
+ ->method('hasExplicitTrailingHostSlash')
+ ->will($this->returnValue(false));
+
+ $this->assertSame('iFELDoiI5Oj9ixB3kHzoPvBpq0w=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureWithBarePathWithExplicitTrailingHostSlash()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+ $signature->setTokenSecret('foo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue('peehaa:pass'));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+ $uri->expects($this->any())
+ ->method('hasExplicitTrailingHostSlash')
+ ->will($this->returnValue(true));
+
+ $this->assertSame('IEhUsArSTLvbQ3QYr0zzn+Rxpjg=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureNoTokenSecretSet()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('HMAC-SHA1');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue('peehaa:pass'));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+ $uri->expects($this->any())
+ ->method('hasExplicitTrailingHostSlash')
+ ->will($this->returnValue(true));
+
+ $this->assertSame('YMHF7FYmLq7wzGnnHWYtd1VoBBE=', $signature->getSignature($uri, array('pee' => 'haa')));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Signature\Signature::__construct
+ * @covers OAuth\OAuth1\Signature\Signature::setHashingAlgorithm
+ * @covers OAuth\OAuth1\Signature\Signature::setTokenSecret
+ * @covers OAuth\OAuth1\Signature\Signature::getSignature
+ * @covers OAuth\OAuth1\Signature\Signature::buildSignatureDataString
+ * @covers OAuth\OAuth1\Signature\Signature::hash
+ * @covers OAuth\OAuth1\Signature\Signature::getSigningKey
+ */
+ public function testGetSignatureThrowsExceptionOnUnsupportedAlgo()
+ {
+ $this->setExpectedException('\\OAuth\\OAuth1\\Signature\\Exception\\UnsupportedHashAlgorithmException');
+
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())
+ ->method('getConsumerSecret')
+ ->will($this->returnValue('foo'));
+
+
+ $signature = new Signature($credentials);
+
+ $signature->setHashingAlgorithm('UnsupportedAlgo');
+
+ $uri = $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface');
+ $uri->expects($this->any())
+ ->method('getQuery')
+ ->will($this->returnValue('param1=value1'));
+ $uri->expects($this->any())
+ ->method('getScheme')
+ ->will($this->returnValue('http'));
+ $uri->expects($this->any())
+ ->method('getRawAuthority')
+ ->will($this->returnValue('peehaa:pass'));
+ $uri->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+ $uri->expects($this->any())
+ ->method('hasExplicitTrailingHostSlash')
+ ->will($this->returnValue(true));
+
+ $signature->getSignature($uri, array('pee' => 'haa'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth1/Token/StdOAuth1TokenTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Token/StdOAuth1TokenTest.php
new file mode 100644
index 00000000..9b065b1e
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth1/Token/StdOAuth1TokenTest.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth1\Token;
+
+use OAuth\OAuth1\Token\StdOAuth1Token;
+
+class StdOAuth1TokenTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ *
+ */
+ public function testConstructCorrectInterfaces()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Token\\TokenInterface', $token);
+ $this->assertInstanceOf('\\OAuth\\Common\\Token\\AbstractToken', $token);
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setRequestToken
+ */
+ public function testSetRequestToken()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setRequestToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setRequestToken
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::getRequestToken
+ */
+ public function testGetRequestToken()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setRequestToken('foo'));
+ $this->assertSame('foo', $token->getRequestToken());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setRequestTokenSecret
+ */
+ public function testSetRequestTokenSecret()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setRequestTokenSecret('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setRequestTokenSecret
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::getRequestTokenSecret
+ */
+ public function testGetRequestTokenSecret()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setRequestTokenSecret('foo'));
+ $this->assertSame('foo', $token->getRequestTokenSecret());
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setAccessTokenSecret
+ */
+ public function testSetAccessTokenSecret()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setAccessTokenSecret('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::setAccessTokenSecret
+ * @covers OAuth\OAuth1\Token\StdOAuth1Token::getAccessTokenSecret
+ */
+ public function testGetAccessTokenSecret()
+ {
+ $token = new StdOAuth1Token();
+
+ $this->assertNull($token->setAccessTokenSecret('foo'));
+ $this->assertSame('foo', $token->getAccessTokenSecret());
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AbstractServiceTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AbstractServiceTest.php
new file mode 100644
index 00000000..595db2a3
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AbstractServiceTest.php
@@ -0,0 +1,401 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuthTest\Mocks\OAuth2\Service\Mock;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Token\TokenInterface;
+
+class AbstractServiceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectInterface()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\OAuth2\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectParent()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\OAuth2\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ */
+ public function testConstructCorrectParentCustomUri()
+ {
+ $service = $this->getMockForAbstractClass(
+ '\\OAuth\\OAuth2\\Service\\AbstractService',
+ array(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface'),
+ )
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::isValidScope
+ */
+ public function testConstructThrowsExceptionOnInvalidScope()
+ {
+ $this->setExpectedException('\\OAuth\\OAuth2\\Service\\Exception\\InvalidScopeException');
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array('invalidscope')
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationUri
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationUriWithoutParametersOrScopes()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->once())->method('getConsumerId')->will($this->returnValue('foo'));
+ $credentials->expects($this->once())->method('getCallbackUrl')->will($this->returnValue('bar'));
+
+ $service = new Mock(
+ $credentials,
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'http://pieterhordijk.com/auth?type=web_server&client_id=foo&redirect_uri=bar&response_type=code&scope=',
+ $service->getAuthorizationUri()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationUri
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationUriWithParametersWithoutScopes()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->once())->method('getConsumerId')->will($this->returnValue('foo'));
+ $credentials->expects($this->once())->method('getCallbackUrl')->will($this->returnValue('bar'));
+
+ $service = new Mock(
+ $credentials,
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'http://pieterhordijk.com/auth?foo=bar&baz=beer&type=web_server&client_id=foo&redirect_uri=bar&response_type=code&scope=',
+ $service->getAuthorizationUri(array('foo' => 'bar', 'baz' => 'beer'))->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::isValidScope
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationUri
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationUriWithParametersAndScopes()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->once())->method('getConsumerId')->will($this->returnValue('foo'));
+ $credentials->expects($this->once())->method('getCallbackUrl')->will($this->returnValue('bar'));
+
+ $service = new Mock(
+ $credentials,
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array('mock', 'mock2')
+ );
+
+ $this->assertSame(
+ 'http://pieterhordijk.com/auth?foo=bar&baz=beer&type=web_server&client_id=foo&redirect_uri=bar&response_type=code&scope=mock+mock2',
+ $service->getAuthorizationUri(array('foo' => 'bar', 'baz' => 'beer'))->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::requestAccessToken
+ * @covers OAuth\OAuth2\Service\AbstractService::getAccessTokenEndpoint
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraOAuthHeaders
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\AbstractService::service
+ */
+ public function testRequestAccessToken()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceof('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('code'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::request
+ * @covers OAuth\OAuth2\Service\AbstractService::determineRequestUriFromPath
+ */
+ public function testRequestThrowsExceptionWhenTokenIsExpired()
+ {
+ $tokenExpiration = new \DateTime('26-03-1984 00:00:00');
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->any())->method('getEndOfLife')->will($this->returnValue($tokenExpiration->format('U')));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $storage
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Token\\Exception\\ExpiredTokenException', 'Token expired on 03/26/1984 at 12:00:00 AM');
+
+ $service->request('https://pieterhordijk.com/my/awesome/path');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::request
+ * @covers OAuth\OAuth2\Service\AbstractService::determineRequestUriFromPath
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationMethod
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\AbstractService::service
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraApiHeaders
+ */
+ public function testRequestOauthAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('OAuth foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::request
+ * @covers OAuth\OAuth2\Service\AbstractService::determineRequestUriFromPath
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationMethod
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\AbstractService::service
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraApiHeaders
+ */
+ public function testRequestQueryStringMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $service->setAuthorizationMethod('querystring');
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::request
+ * @covers OAuth\OAuth2\Service\AbstractService::determineRequestUriFromPath
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationMethod
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\AbstractService::service
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraApiHeaders
+ */
+ public function testRequestQueryStringTwoMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $service->setAuthorizationMethod('querystring2');
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('oauth2_access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::request
+ * @covers OAuth\OAuth2\Service\AbstractService::determineRequestUriFromPath
+ * @covers OAuth\OAuth2\Service\AbstractService::getAuthorizationMethod
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\AbstractService::service
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraApiHeaders
+ */
+ public function testRequestBearerMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $service->setAuthorizationMethod('bearer');
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::getStorage
+ */
+ public function testGetStorage()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\Common\\Storage\\TokenStorageInterface', $service->getStorage());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::refreshAccessToken
+ * @covers OAuth\OAuth2\Service\AbstractService::getAccessTokenEndpoint
+ * @covers OAuth\OAuth2\Service\AbstractService::getExtraOAuthHeaders
+ * @covers OAuth\OAuth2\Service\AbstractService::parseAccessTokenResponse
+ */
+ public function testRefreshAccessTokenSuccess()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\StdOAuth2Token');
+ $token->expects($this->once())->method('getRefreshToken')->will($this->returnValue('foo'));
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->refreshAccessToken($token));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::isValidScope
+ */
+ public function testIsValidScopeTrue()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertTrue($service->isValidScope('mock'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\AbstractService::__construct
+ * @covers OAuth\OAuth2\Service\AbstractService::isValidScope
+ */
+ public function testIsValidScopeFalse()
+ {
+ $service = new Mock(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertFalse($service->isValidScope('invalid'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AmazonTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AmazonTest.php
new file mode 100644
index 00000000..f70fe401
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/AmazonTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Amazon;
+use OAuth\Common\Token\TokenInterface;
+
+class AmazonTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.amazon.com/ap/oa', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.amazon.com/ap/oatoken', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Amazon::__construct
+ * @covers OAuth\OAuth2\Service\Amazon::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Amazon(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BitlyTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BitlyTest.php
new file mode 100644
index 00000000..9944b260
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BitlyTest.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Bitly;
+use OAuth\Common\Token\TokenInterface;
+
+class BitlyTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ * @covers OAuth\OAuth2\Service\Bitly::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://bitly.com/oauth/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ * @covers OAuth\OAuth2\Service\Bitly::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api-ssl.bitly.com/oauth/access_token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ * @covers OAuth\OAuth2\Service\Bitly::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ * @covers OAuth\OAuth2\Service\Bitly::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Bitly::__construct
+ * @covers OAuth\OAuth2\Service\Bitly::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\Bitly::requestAccessToken
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('access_token=foo'));
+
+ $service = new Bitly(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BoxTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BoxTest.php
new file mode 100644
index 00000000..b5b2a789
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BoxTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Box;
+use OAuth\Common\Token\TokenInterface;
+
+class BoxTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.box.com/api/oauth2/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.box.com/api/oauth2/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Box::__construct
+ * @covers OAuth\OAuth2\Service\Box::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Box(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BufferTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BufferTest.php
new file mode 100644
index 00000000..29726d0a
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/BufferTest.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Buffer;
+use OAuth\Common\Token\TokenInterface;
+
+class BufferTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ * @covers OAuth\OAuth2\Service\Buffer::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://bufferapp.com/oauth2/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ * @covers OAuth\OAuth2\Service\Buffer::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api.bufferapp.com/1/oauth2/token.json', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ * @covers OAuth\OAuth2\Service\Buffer::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ * @covers OAuth\OAuth2\Service\Buffer::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Buffer::__construct
+ * @covers OAuth\OAuth2\Service\Buffer::parseAccessTokenResponse
+ * @covers OAuth\OAuth2\Service\Buffer::requestAccessToken
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo"}'));
+
+ $service = new Buffer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+} \ No newline at end of file
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DailymotionTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DailymotionTest.php
new file mode 100644
index 00000000..f3fbaa8e
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DailymotionTest.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Dailymotion;
+use OAuth\Common\Token\TokenInterface;
+
+class DailymotionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api.dailymotion.com/oauth/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api.dailymotion.com/oauth/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('OAuth foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dailymotion::__construct
+ * @covers OAuth\OAuth2\Service\Dailymotion::getExtraOAuthHeaders
+ */
+ public function testGetExtraOAuthHeaders()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($uri, $params, $extraHeaders) {
+ \PHPUnit_Framework_Assert::assertTrue(array_key_exists('Accept', $extraHeaders));
+ \PHPUnit_Framework_Assert::assertTrue(in_array('application/json', $extraHeaders, true));
+
+ return '{"access_token":"foo","expires_in":"bar"}';
+ }));
+
+ $service = new Dailymotion(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DropboxTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DropboxTest.php
new file mode 100644
index 00000000..8f052c6b
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/DropboxTest.php
@@ -0,0 +1,231 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Dropbox;
+use OAuth\Common\Token\TokenInterface;
+
+class DropboxTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::getAuthorizationUri
+ */
+ public function testGetAuthorizationUriWithoutAdditionalParams()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->once())->method('getConsumerId')->will($this->returnValue('foo'));
+ $credentials->expects($this->once())->method('getCallbackUrl')->will($this->returnValue('bar'));
+
+ $service = new Dropbox(
+ $credentials,
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.dropbox.com/1/oauth2/authorize?client_id=foo&redirect_uri=bar&response_type=code&scope=',
+ $service->getAuthorizationUri()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::getAuthorizationUri
+ */
+ public function testGetAuthorizationUriWithAdditionalParams()
+ {
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->once())->method('getConsumerId')->will($this->returnValue('foo'));
+ $credentials->expects($this->once())->method('getCallbackUrl')->will($this->returnValue('bar'));
+
+ $service = new Dropbox(
+ $credentials,
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.dropbox.com/1/oauth2/authorize?client_id=foo&redirect_uri=bar&response_type=code&scope=',
+ $service->getAuthorizationUri()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.dropbox.com/1/oauth2/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api.dropbox.com/1/oauth2/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Dropbox::__construct
+ * @covers OAuth\OAuth2\Service\Dropbox::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Dropbox(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FacebookTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FacebookTest.php
new file mode 100644
index 00000000..f2fed463
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FacebookTest.php
@@ -0,0 +1,242 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Facebook;
+use OAuth\Common\Token\TokenInterface;
+
+class FacebookTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.facebook.com/dialog/oauth', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://graph.facebook.com/oauth/access_token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('OAuth foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('access_token=foo&expires=bar'));
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('access_token=foo&expires=bar&refresh_token=baz'));
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::getDialogUri
+ */
+ public function testGetDialogUriRedirectUriMissing()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Exception\\Exception');
+
+ $service->getDialogUri('feed', array());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::getDialogUri
+ */
+ public function testGetDialogUriInstanceofUri()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+
+ $service = new Facebook(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $dialogUri = $service->getDialogUri(
+ 'feed',
+ array(
+ 'redirect_uri' => 'http://www.facebook.com',
+ 'state' => 'Random state'
+ )
+ );
+ $this->assertInstanceOf('\\OAuth\\Common\\Http\\Uri\\Uri',$dialogUri);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Facebook::__construct
+ * @covers OAuth\OAuth2\Service\Facebook::getDialogUri
+ */
+ public function testGetDialogUriContainsAppIdAndOtherParameters()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $credentials = $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface');
+ $credentials->expects($this->any())->method('getConsumerId')->will($this->returnValue('application_id'));
+
+
+ $service = new Facebook(
+ $credentials,
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $dialogUri = $service->getDialogUri(
+ 'feed',
+ array(
+ 'redirect_uri' => 'http://www.facebook.com',
+ 'state' => 'Random state'
+ )
+ );
+
+ $queryString = $dialogUri->getQuery();
+ parse_str($queryString, $queryArray);
+
+ $this->assertArrayHasKey('app_id', $queryArray);
+ $this->assertArrayHasKey('redirect_uri', $queryArray);
+ $this->assertArrayHasKey('state', $queryArray);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FoursquareTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FoursquareTest.php
new file mode 100644
index 00000000..96356ec5
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/FoursquareTest.php
@@ -0,0 +1,197 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Foursquare;
+use OAuth\Common\Token\TokenInterface;
+
+class FoursquareTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://foursquare.com/oauth2/authenticate', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://foursquare.com/oauth2/access_token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('OAuth foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"error":"some_error"}'));
+
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Foursquare::__construct
+ * @covers OAuth\OAuth2\Service\Foursquare::request
+ */
+ public function testRequest()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Foursquare(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $this->assertSame(
+ 'https://api.foursquare.com/v2/https://pieterhordijk.com/my/awesome/path?v=20130829',
+ $service->request('https://pieterhordijk.com/my/awesome/path')->getAbsoluteUri()
+ );
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GitHubTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GitHubTest.php
new file mode 100644
index 00000000..edb0fee3
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GitHubTest.php
@@ -0,0 +1,220 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\GitHub;
+use OAuth\Common\Token\TokenInterface;
+
+class GitHubTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://github.com/login/oauth/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://github.com/login/oauth/access_token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"error":"some_error"}'));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::getExtraOAuthHeaders
+ */
+ public function testGetExtraOAuthHeaders()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($uri, $params, $extraHeaders) {
+ \PHPUnit_Framework_Assert::assertTrue(array_key_exists('Accept', $extraHeaders));
+ \PHPUnit_Framework_Assert::assertTrue(in_array('application/json', $extraHeaders, true));
+
+ return '{"access_token":"foo","expires_in":"bar"}';
+ }));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\GitHub::__construct
+ * @covers OAuth\OAuth2\Service\GitHub::getExtraApiHeaders
+ */
+ public function testGetExtraApiHeaders()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new GitHub(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Accept', $headers));
+ $this->assertSame('application/vnd.github.beta+json', $headers['Accept']);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GoogleTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GoogleTest.php
new file mode 100644
index 00000000..b55808d2
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/GoogleTest.php
@@ -0,0 +1,195 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Google;
+use OAuth\Common\Token\TokenInterface;
+
+class GoogleTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://accounts.google.com/o/oauth2/auth?access_type=online',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+
+ // Verify that 'offine' works
+ $service->setAccessType('offline');
+ $this->assertSame(
+ 'https://accounts.google.com/o/oauth2/auth?access_type=offline',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpointException()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('OAuth\OAuth2\Service\Exception\InvalidAccessTypeException');
+
+ try {
+ $service->setAccessType('invalid');
+ } catch (InvalidAccessTypeException $e) {
+ return;
+ }
+ $this->fail('Expected InvalidAccessTypeException not thrown');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://accounts.google.com/o/oauth2/token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Google::__construct
+ * @covers OAuth\OAuth2\Service\Google::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Google(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/HerokuTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/HerokuTest.php
new file mode 100644
index 00000000..cc2c0f69
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/HerokuTest.php
@@ -0,0 +1,261 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Heroku;
+use OAuth\Common\Token\TokenInterface;
+
+class HerokuTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://id.heroku.com/oauth/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://id.heroku.com/oauth/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::getExtraOAuthHeaders
+ */
+ public function testGetExtraOAuthHeaders()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnCallback(function($uri, $params, $extraHeaders) {
+ \PHPUnit_Framework_Assert::assertTrue(array_key_exists('Accept', $extraHeaders));
+ \PHPUnit_Framework_Assert::assertTrue(in_array('application/vnd.heroku+json; version=3', $extraHeaders, true));
+
+ return '{"access_token":"foo","expires_in":"bar"}';
+ }));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Heroku::__construct
+ * @covers OAuth\OAuth2\Service\Heroku::getExtraApiHeaders
+ */
+ public function testGetExtraApiHeaders()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Heroku(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Accept', $headers));
+ $this->assertSame('application/vnd.heroku+json; version=3', $headers['Accept']);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/InstagramTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/InstagramTest.php
new file mode 100644
index 00000000..bf9d764c
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/InstagramTest.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Instagram;
+use OAuth\Common\Token\TokenInterface;
+
+class InstagramTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.instagram.com/oauth/authorize/',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.instagram.com/oauth/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Instagram::__construct
+ * @covers OAuth\OAuth2\Service\Instagram::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Instagram(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/LinkedinTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/LinkedinTest.php
new file mode 100644
index 00000000..c7f5c76e
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/LinkedinTest.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Linkedin;
+use OAuth\Common\Token\TokenInterface;
+
+class LinkedinTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.linkedin.com/uas/oauth2/authorization',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.linkedin.com/uas/oauth2/accessToken',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('oauth2_access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Linkedin::__construct
+ * @covers OAuth\OAuth2\Service\Linkedin::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Linkedin(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MailchimpTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MailchimpTest.php
new file mode 100644
index 00000000..e7f955e1
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MailchimpTest.php
@@ -0,0 +1,179 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Mailchimp;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\Common\Http\Uri\Uri;
+
+class MailchimpTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://login.mailchimp.com/oauth2/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://login.mailchimp.com/oauth2/token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\StdOAuth2Token');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage,
+ array(),
+ new Uri('https://us1.api.mailchimp.com/2.0/')
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('apikey=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Mailchimp::__construct
+ * @covers OAuth\OAuth2\Service\Mailchimp::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValid()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->at(0))->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+ $client->expects($this->at(1))->method('retrieveResponse')->will($this->returnValue('{"dc": "us7"}'));
+
+ $service = new Mailchimp(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MicrosoftTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MicrosoftTest.php
new file mode 100644
index 00000000..4001e1e4
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/MicrosoftTest.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Microsoft;
+use OAuth\Common\Token\TokenInterface;
+
+class MicrosoftTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://login.live.com/oauth20_authorize.srf',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://login.live.com/oauth20_token.srf',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(0));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $uri = $service->request('https://pieterhordijk.com/my/awesome/path');
+ $absoluteUri = parse_url($uri->getAbsoluteUri());
+
+ $this->assertSame('access_token=foo', $absoluteUri['query']);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Microsoft::__construct
+ * @covers OAuth\OAuth2\Service\Microsoft::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Microsoft(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/PaypalTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/PaypalTest.php
new file mode 100644
index 00000000..5396326f
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/PaypalTest.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Paypal;
+use OAuth\Common\Token\TokenInterface;
+
+class PaypalTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://api.paypal.com/v1/identity/openidconnect/tokenservice',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnMessage()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('message=some_error'));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnName()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('name=some_error'));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Paypal::__construct
+ * @covers OAuth\OAuth2\Service\Paypal::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Paypal(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RedditTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RedditTest.php
new file mode 100644
index 00000000..e8741e6f
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RedditTest.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Reddit;
+use OAuth\Common\Token\TokenInterface;
+
+class RedditTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://ssl.reddit.com/api/v1/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://ssl.reddit.com/api/v1/access_token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Reddit::__construct
+ * @covers OAuth\OAuth2\Service\Reddit::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Reddit(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RunKeeperTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RunKeeperTest.php
new file mode 100644
index 00000000..671bd0cf
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/RunKeeperTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\RunKeeper;
+use OAuth\Common\Token\TokenInterface;
+
+class RunKeeperTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://runkeeper.com/apps/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://runkeeper.com/apps/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('/user');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnErrorDescription()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error_description=some_error'));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\RunKeeper::__construct
+ * @covers OAuth\OAuth2\Service\RunKeeper::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new RunKeeper(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/SoundCloudTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/SoundCloudTest.php
new file mode 100644
index 00000000..ac988ba2
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/SoundCloudTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\SoundCloud;
+use OAuth\Common\Token\TokenInterface;
+
+class SoundCloudTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://soundcloud.com/connect', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://api.soundcloud.com/oauth2/token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\SoundCloud::__construct
+ * @covers OAuth\OAuth2\Service\SoundCloud::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new SoundCloud(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/UstreamTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/UstreamTest.php
new file mode 100644
index 00000000..48965ae0
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/UstreamTest.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Ustream;
+use OAuth\Common\Token\TokenInterface;
+
+class UstreamTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.ustream.tv/oauth2/authorize',
+ $service->getAuthorizationEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame(
+ 'https://www.ustream.tv/oauth2/token',
+ $service->getAccessTokenEndpoint()->getAbsoluteUri()
+ );
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Ustream::__construct
+ * @covers OAuth\OAuth2\Service\Ustream::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Ustream(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/VkontakteTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/VkontakteTest.php
new file mode 100644
index 00000000..7a8279b2
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/VkontakteTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Vkontakte;
+use OAuth\Common\Token\TokenInterface;
+
+class VkontakteTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://oauth.vk.com/authorize', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://oauth.vk.com/access_token', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar"}'));
+
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Vkontakte::__construct
+ * @covers OAuth\OAuth2\Service\Vkontakte::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":"foo","expires_in":"bar","refresh_token":"baz"}'));
+
+ $service = new Vkontakte(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/YammerTest.php b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/YammerTest.php
new file mode 100644
index 00000000..86440395
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/OAuth2/Service/YammerTest.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace OAuthTest\Unit\OAuth2\Service;
+
+use OAuth\OAuth2\Service\Yammer;
+use OAuth\Common\Token\TokenInterface;
+
+class YammerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ */
+ public function testConstructCorrectInterfaceWithoutCustomUri()
+ {
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\ServiceInterface', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ */
+ public function testConstructCorrectInstanceWithoutCustomUri()
+ {
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ */
+ public function testConstructCorrectInstanceWithCustomUri()
+ {
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array(),
+ $this->getMock('\\OAuth\\Common\\Http\\Uri\\UriInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\AbstractService', $service);
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::getAuthorizationEndpoint
+ */
+ public function testGetAuthorizationEndpoint()
+ {
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.yammer.com/dialog/oauth', $service->getAuthorizationEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::getAccessTokenEndpoint
+ */
+ public function testGetAccessTokenEndpoint()
+ {
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertSame('https://www.yammer.com/oauth2/access_token.json', $service->getAccessTokenEndpoint()->getAbsoluteUri());
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::getAuthorizationMethod
+ */
+ public function testGetAuthorizationMethod()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnArgument(2));
+
+ $token = $this->getMock('\\OAuth\\OAuth2\\Token\\TokenInterface');
+ $token->expects($this->once())->method('getEndOfLife')->will($this->returnValue(TokenInterface::EOL_NEVER_EXPIRES));
+ $token->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo'));
+
+ $storage = $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface');
+ $storage->expects($this->once())->method('retrieveAccessToken')->will($this->returnValue($token));
+
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $storage
+ );
+
+ $headers = $service->request('https://pieterhordijk.com/my/awesome/path');
+
+ $this->assertTrue(array_key_exists('Authorization', $headers));
+ $this->assertTrue(in_array('Bearer foo', $headers, true));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnNulledResponse()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue(null));
+
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseThrowsExceptionOnError()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('error=some_error'));
+
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->setExpectedException('\\OAuth\\Common\\Http\\Exception\\TokenResponseException');
+
+ $service->requestAccessToken('foo');
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithoutRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":{"token":"foo", "expires_at":null}}'));
+
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+
+ /**
+ * @covers OAuth\OAuth2\Service\Yammer::__construct
+ * @covers OAuth\OAuth2\Service\Yammer::parseAccessTokenResponse
+ */
+ public function testParseAccessTokenResponseValidWithRefreshToken()
+ {
+ $client = $this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface');
+ $client->expects($this->once())->method('retrieveResponse')->will($this->returnValue('{"access_token":{"token":"foo", "expires_at":null},"refresh_token":"baz"}'));
+
+ $service = new Yammer(
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $client,
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Token\\StdOAuth2Token', $service->requestAccessToken('foo'));
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/Unit/ServiceFactoryTest.php b/vendor/lusitanian/oauth/tests/Unit/ServiceFactoryTest.php
new file mode 100644
index 00000000..26588dc0
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/Unit/ServiceFactoryTest.php
@@ -0,0 +1,311 @@
+<?php
+/**
+ * @category OAuth
+ * @package Tests
+ * @author David Desberg <david@daviddesberg.com>
+ * @author Chris Heng <bigblah@gmail.com>
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @copyright Copyright (c) 2013 The authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+namespace OAuth\Unit;
+
+use OAuth\ServiceFactory;
+
+class ServiceFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers OAuth\ServiceFactory::setHttpClient
+ */
+ public function testSetHttpClient()
+ {
+ $factory = new ServiceFactory();
+
+ $this->assertInstanceOf(
+ '\\OAuth\\ServiceFactory',
+ $factory->setHttpClient($this->getMock('\\OAuth\\Common\\Http\\Client\\ClientInterface'))
+ );
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ */
+ public function testRegisterServiceThrowsExceptionNonExistentClass()
+ {
+ $this->setExpectedException('\\OAuth\Common\Exception\Exception');
+
+ $factory = new ServiceFactory();
+ $factory->registerService('foo', 'bar');
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ */
+ public function testRegisterServiceThrowsExceptionWithClassIncorrectImplementation()
+ {
+ $this->setExpectedException('\\OAuth\Common\Exception\Exception');
+
+ $factory = new ServiceFactory();
+ $factory->registerService('foo', 'OAuth\\ServiceFactory');
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ */
+ public function testRegisterServiceSuccessOAuth1()
+ {
+ $factory = new ServiceFactory();
+
+ $this->assertInstanceOf(
+ '\\OAuth\\ServiceFactory',
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake')
+ );
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ */
+ public function testRegisterServiceSuccessOAuth2()
+ {
+ $factory = new ServiceFactory();
+
+ $this->assertInstanceOf(
+ '\\OAuth\\ServiceFactory',
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake')
+ );
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV1Service
+ */
+ public function testCreateServiceOAuth1NonRegistered()
+ {
+ $factory = new ServiceFactory();
+
+ $service = $factory->createService(
+ 'twitter',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth1\\Service\\Twitter', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV1Service
+ */
+ public function testCreateServiceOAuth1Registered()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth1\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV1Service
+ */
+ public function testCreateServiceOAuth1RegisteredAndNonRegisteredSameName()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('twitter', '\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'twitter',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth1\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServiceOAuth2NonRegistered()
+ {
+ $factory = new ServiceFactory();
+
+ $service = $factory->createService(
+ 'facebook',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\\OAuth2\\Service\\Facebook', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServiceOAuth2Registered()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth2\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServiceOAuth2RegisteredAndNonRegisteredSameName()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('facebook', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'facebook',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth2\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV1Service
+ */
+ public function testCreateServiceThrowsExceptionOnPassingScopesToV1Service()
+ {
+ $this->setExpectedException('\\OAuth\Common\Exception\Exception');
+
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array('bar')
+ );
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ */
+ public function testCreateServiceNonExistentService()
+ {
+ $factory = new ServiceFactory();
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertNull($service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::registerService
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServicePrefersOauth2()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth1\\Service\\Fake');
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth2\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServiceOAuth2RegisteredWithClassConstantsAsScope()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array('FOO')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth2\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake', $service);
+ }
+
+ /**
+ * @covers OAuth\ServiceFactory::createService
+ * @covers OAuth\ServiceFactory::getFullyQualifiedServiceName
+ * @covers OAuth\ServiceFactory::buildV2Service
+ * @covers OAuth\ServiceFactory::resolveScopes
+ */
+ public function testCreateServiceOAuth2RegisteredWithCustomScope()
+ {
+ $factory = new ServiceFactory();
+
+ $factory->registerService('foo', '\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake');
+
+ $service = $factory->createService(
+ 'foo',
+ $this->getMock('\\OAuth\\Common\\Consumer\\CredentialsInterface'),
+ $this->getMock('\\OAuth\\Common\\Storage\\TokenStorageInterface'),
+ array('custom')
+ );
+
+ $this->assertInstanceOf('\\OAuth\OAuth2\Service\\ServiceInterface', $service);
+ $this->assertInstanceOf('\\OAuthTest\\Mocks\\OAuth2\\Service\\Fake', $service);
+ }
+}
diff --git a/vendor/lusitanian/oauth/tests/bootstrap.php b/vendor/lusitanian/oauth/tests/bootstrap.php
new file mode 100644
index 00000000..193b857a
--- /dev/null
+++ b/vendor/lusitanian/oauth/tests/bootstrap.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Bootstrap the tests
+ *
+ * PHP version 5.3
+ *
+ * @category OAuthTest
+ * @author Pieter Hordijk <info@pieterhordijk.com>
+ * @author David Desberg <david@daviddesberg.com>
+ * @copyright Copyright (c) 2012 Pieter Hordijk
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+namespace OAuthTest;
+
+/**
+ * Setting up the default timezone. because well... PHP sucks
+ */
+date_default_timezone_set('Europe/Amsterdam');
+
+/**
+ * Simple SPL autoloader for the OAuthTest mocks
+ *
+ * @param string $class The class name to load
+ *
+ * @return void
+ */
+spl_autoload_register(function ($class) {
+ $nslen = strlen(__NAMESPACE__);
+ if (substr($class, 0, $nslen) !== __NAMESPACE__) {
+ return;
+ }
+ $path = substr(str_replace('\\', '/', $class), $nslen);
+ $path = __DIR__ . $path . '.php';
+ if (file_exists($path)) {
+ require $path;
+ }
+});
+
+/**
+ * Fire up the autoloader
+ */
+require_once __DIR__ . '/../vendor/autoload.php';