From a00e1e8c301d734fafc9b567afda9bf14fee689b Mon Sep 17 00:00:00 2001 From: Peter Elmered Date: Tue, 17 Sep 2024 00:39:55 +0200 Subject: [PATCH] Add more tests --- src/AccessToken.php | 26 ++++++++++++++++++- tests/TestCase.php | 10 +++----- tests/Unit/ArchTest.php | 2 +- tests/Unit/RefreshTokenTest.php | 44 ++++++++++++++++++++++++++++++++- 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/AccessToken.php b/src/AccessToken.php index 24b4e2e..062a4ab 100644 --- a/src/AccessToken.php +++ b/src/AccessToken.php @@ -5,6 +5,7 @@ use Carbon\Carbon; use Closure; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use InvalidArgumentException; final class AccessToken @@ -63,7 +64,7 @@ public function getHttpClient(PendingRequest $httpClient): PendingRequest self::TOKEN_TYPE_BEARER => $httpClient->withToken($this->accessToken), self::TOKEN_TYPE_QUERY => $httpClient->withQueryParameters([$this->tokenName => $this->accessToken]), self::TOKEN_TYPE_CUSTOM => $this->resolveCustomAuth($httpClient), - default => throw new InvalidArgumentException('Invalid auth type') + default => throw new InvalidArgumentException('Invalid auth type') }; } @@ -75,4 +76,27 @@ protected function resolveCustomAuth(PendingRequest $httpClient): PendingRequest return ($this->customCallback)($httpClient); } + + public static function parseQueryTokenFromResponse(Response $response, string $queryKey = 'token'): ?string + { + $uri = $response->effectiveUri(); + + if (! $uri) { + return null; + } + + return self::parseTokenFromQueryString($response->effectiveUri()?->getQuery(), $queryKey); + } + + public static function parseQueryTokenFromUrl(string $url, string $queryKey = 'token'): string + { + return self::parseTokenFromQueryString(parse_url($url, PHP_URL_QUERY), $queryKey); + } + + public static function parseTokenFromQueryString(string $queryString, string $queryKey = 'token'): string + { + parse_str($queryString, $output); + + return $output[$queryKey]; + } } diff --git a/tests/TestCase.php b/tests/TestCase.php index b1c6926..d07bf98 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; +use Pelmered\LaravelHttpOAuthHelper\AccessToken; use Pelmered\LaravelHttpOAuthHelper\LaravelHttpOAuthHelperServiceProvider; class TestCase extends \Orchestra\Testbench\TestCase @@ -17,7 +18,7 @@ protected function setUp(): void Http::preventStrayRequests(); Http::fake( - static function (Request $request) { + function (Request $request) { if ($request->url() === 'https://example.com/oauth/token') { if ($request->token = 'my_refresh_token') { return Http::response([ @@ -49,10 +50,7 @@ static function (Request $request) { } if (Str::of($request->url())->startsWith('https://example.com/api?token=')) { - - $url = parse_url($request->url(), PHP_URL_QUERY); - parse_str($url, $output); - $token = $output['token']; + $token = AccessToken::parseQueryTokenFromUrl($request->url()); return Http::response([ 'data' => 'some data with query string token', @@ -63,8 +61,6 @@ static function (Request $request) { return Http::response([], 200); } ); - - //Cache::spy(); } protected function defineEnvironment($app) diff --git a/tests/Unit/ArchTest.php b/tests/Unit/ArchTest.php index 1c487c2..68c2af8 100644 --- a/tests/Unit/ArchTest.php +++ b/tests/Unit/ArchTest.php @@ -1,6 +1,6 @@ preset()->laravel(); -arch()->preset()->security(); +arch()->preset()->security()->ignoring('parse_str');; arch()->expect('dd')->not->toBeUsed(); diff --git a/tests/Unit/RefreshTokenTest.php b/tests/Unit/RefreshTokenTest.php index 7db3bf0..82208b2 100644 --- a/tests/Unit/RefreshTokenTest.php +++ b/tests/Unit/RefreshTokenTest.php @@ -6,6 +6,7 @@ use Illuminate\Http\Client\Factory; use Illuminate\Http\Client\PendingRequest; use Illuminate\Http\Client\Request; +use Illuminate\Http\Client\Response; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; use Pelmered\LaravelHttpOAuthHelper\AccessToken; @@ -262,7 +263,7 @@ ->and($accessToken->getCustomCallback())->toBeNull(); }); - test('token type custom', function () { + test('custom token type', function () { $accessToken = app(RefreshToken::class)( 'https://example.com/oauth/token', @@ -285,4 +286,45 @@ expect($options['headers']['MyCustomAuthHeader'])->toBe('my_custom_token'); }); + test('custom auth token type', function () { + + app(RefreshToken::class)( + 'https://example.com/oauth/token', + new Credentials(function (PendingRequest $httpClient) { + return $httpClient->withHeader('MyCustomAuthHeader', 'my_custom_token'); + }), + new Options( + scopes: ['scope1', 'scope2'], + ), + ); + Http::assertSent(static function (Request $request) { + return $request->hasHeader('MyCustomAuthHeader', 'my_custom_token') + && $request->url() === 'https://example.com/oauth/token'; + }); + }); + test('auth type query', function () { + + app(RefreshToken::class)( + 'https://example.com/oauth/token', + new Credentials('my_query_token'), + new Options( + scopes: ['scope1', 'scope2'], + authType: Credentials::AUTH_TYPE_QUERY, + tokenName: 'custom_token_name', + accessToken: function (Response $response) { + return AccessToken::parseQueryTokenFromResponse($response, 'custom_token_name'); + } + ), + ); + Http::assertSent(function (Request $request) { + + $token = AccessToken::parseQueryTokenFromUrl($request->url(), 'custom_token_name'); + + expect($token)->toBe('my_query_token'); + + + return $request->url() === 'https://example.com/oauth/token?custom_token_name=my_query_token'; + }); + }); + })->done(assignee: 'pelmered');