onlyGuzzle6(); $this->mockFetcher = $this ->getMockBuilder('Google\Auth\FetchAuthTokenInterface') ->getMock(); $this->mockCacheItem = $this ->getMockBuilder('Psr\Cache\CacheItemInterface') ->getMock(); $this->mockCache = $this ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') ->getMock(); $this->mockRequest = $this ->getMockBuilder('GuzzleHttp\Psr7\Request') ->disableOriginalConstructor() ->getMock(); } public function testOnlyTouchesWhenAuthConfigScoped() { $this->mockFetcher ->expects($this->any()) ->method('fetchAuthToken') ->will($this->returnValue([])); $this->mockRequest ->expects($this->never()) ->method('withHeader'); $middleware = new AuthTokenMiddleware($this->mockFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'not_google_auth']); } public function testAddsTheTokenAsAnAuthorizationHeader() { $authResult = ['access_token' => '1/abcdef1234567890']; $this->mockFetcher ->expects($this->once()) ->method('fetchAuthToken') ->will($this->returnValue($authResult)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->with('authorization', 'Bearer ' . $authResult['access_token']) ->will($this->returnValue($this->mockRequest)); // Run the test. $middleware = new AuthTokenMiddleware($this->mockFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); } public function testDoesNotAddAnAuthorizationHeaderOnNoAccessToken() { $authResult = ['not_access_token' => '1/abcdef1234567890']; $this->mockFetcher ->expects($this->once()) ->method('fetchAuthToken') ->will($this->returnValue($authResult)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->with('authorization', 'Bearer ') ->will($this->returnValue($this->mockRequest)); // Run the test. $middleware = new AuthTokenMiddleware($this->mockFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); } public function testUsesCachedAuthToken() { $cacheKey = 'myKey'; $cachedValue = '2/abcdef1234567890'; $this->mockCacheItem ->expects($this->once()) ->method('isHit') ->will($this->returnValue(true)); $this->mockCacheItem ->expects($this->once()) ->method('get') ->will($this->returnValue($cachedValue)); $this->mockCache ->expects($this->once()) ->method('getItem') ->with($this->equalTo($cacheKey)) ->will($this->returnValue($this->mockCacheItem)); $this->mockFetcher ->expects($this->never()) ->method('fetchAuthToken'); $this->mockFetcher ->expects($this->any()) ->method('getCacheKey') ->will($this->returnValue($cacheKey)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->with('authorization', 'Bearer ' . $cachedValue) ->will($this->returnValue($this->mockRequest)); // Run the test. $cachedFetcher = new FetchAuthTokenCache( $this->mockFetcher, null, $this->mockCache ); $middleware = new AuthTokenMiddleware($cachedFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); } public function testGetsCachedAuthTokenUsingCacheOptions() { $prefix = 'test_prefix_'; $cacheKey = 'myKey'; $cachedValue = '2/abcdef1234567890'; $this->mockCacheItem ->expects($this->once()) ->method('isHit') ->will($this->returnValue(true)); $this->mockCacheItem ->expects($this->once()) ->method('get') ->will($this->returnValue($cachedValue)); $this->mockCache ->expects($this->once()) ->method('getItem') ->with($this->equalTo($prefix . $cacheKey)) ->will($this->returnValue($this->mockCacheItem)); $this->mockFetcher ->expects($this->never()) ->method('fetchAuthToken'); $this->mockFetcher ->expects($this->any()) ->method('getCacheKey') ->will($this->returnValue($cacheKey)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->with('authorization', 'Bearer ' . $cachedValue) ->will($this->returnValue($this->mockRequest)); // Run the test. $cachedFetcher = new FetchAuthTokenCache( $this->mockFetcher, ['prefix' => $prefix], $this->mockCache ); $middleware = new AuthTokenMiddleware($cachedFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); } public function testShouldSaveValueInCacheWithSpecifiedPrefix() { $prefix = 'test_prefix_'; $lifetime = '70707'; $cacheKey = 'myKey'; $token = '1/abcdef1234567890'; $authResult = ['access_token' => $token]; $this->mockCacheItem ->expects($this->any()) ->method('get') ->will($this->returnValue(null)); $this->mockCacheItem ->expects($this->once()) ->method('set') ->with($this->equalTo($token)) ->will($this->returnValue(false)); $this->mockCacheItem ->expects($this->once()) ->method('expiresAfter') ->with($this->equalTo($lifetime)); $this->mockCache ->expects($this->any()) ->method('getItem') ->with($this->equalTo($prefix . $cacheKey)) ->will($this->returnValue($this->mockCacheItem)); $this->mockFetcher ->expects($this->any()) ->method('getCacheKey') ->will($this->returnValue($cacheKey)); $this->mockFetcher ->expects($this->once()) ->method('fetchAuthToken') ->will($this->returnValue($authResult)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->with('authorization', 'Bearer ' . $token) ->will($this->returnValue($this->mockRequest)); // Run the test. $cachedFetcher = new FetchAuthTokenCache( $this->mockFetcher, ['prefix' => $prefix, 'lifetime' => $lifetime], $this->mockCache ); $middleware = new AuthTokenMiddleware($cachedFetcher); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); } /** @dataProvider provideShouldNotifyTokenCallback */ public function testShouldNotifyTokenCallback(callable $tokenCallback) { $prefix = 'test_prefix_'; $cacheKey = 'myKey'; $token = '1/abcdef1234567890'; $authResult = ['access_token' => $token]; $this->mockCacheItem ->expects($this->any()) ->method('get') ->will($this->returnValue(null)); $this->mockCache ->expects($this->any()) ->method('getItem') ->with($this->equalTo($prefix . $cacheKey)) ->will($this->returnValue($this->mockCacheItem)); $this->mockFetcher ->expects($this->any()) ->method('getCacheKey') ->will($this->returnValue($cacheKey)); $this->mockFetcher ->expects($this->once()) ->method('fetchAuthToken') ->will($this->returnValue($authResult)); $this->mockRequest ->expects($this->once()) ->method('withHeader') ->will($this->returnValue($this->mockRequest)); MiddlewareCallback::$expectedKey = $this->getValidKeyName($prefix . $cacheKey); MiddlewareCallback::$expectedValue = $token; MiddlewareCallback::$called = false; // Run the test. $cachedFetcher = new FetchAuthTokenCache( $this->mockFetcher, ['prefix' => $prefix], $this->mockCache ); $middleware = new AuthTokenMiddleware( $cachedFetcher, null, $tokenCallback ); $mock = new MockHandler([new Response(200)]); $callable = $middleware($mock); $callable($this->mockRequest, ['auth' => 'google_auth']); $this->assertTrue(MiddlewareCallback::$called); } public function provideShouldNotifyTokenCallback() { MiddlewareCallback::$phpunit = $this; $anonymousFunc = function ($key, $value) { MiddlewareCallback::staticInvoke($key, $value); }; return [ ['Google\Auth\Tests\MiddlewareCallbackFunction'], ['Google\Auth\Tests\MiddlewareCallback::staticInvoke'], [['Google\Auth\Tests\MiddlewareCallback', 'staticInvoke']], [$anonymousFunc], [[new MiddlewareCallback, 'staticInvoke']], [[new MiddlewareCallback, 'methodInvoke']], [new MiddlewareCallback], ]; } } class MiddlewareCallback { public static $phpunit; public static $expectedKey; public static $expectedValue; public static $called = false; public function __invoke($key, $value) { self::$phpunit->assertEquals(self::$expectedKey, $key); self::$phpunit->assertEquals(self::$expectedValue, $value); self::$called = true; } public function methodInvoke($key, $value) { return $this($key, $value); } public static function staticInvoke($key, $value) { $instance = new self(); return $instance($key, $value); } } function MiddlewareCallbackFunction($key, $value) { return MiddlewareCallback::staticInvoke($key, $value); }