LinkedInOpenIdProviderTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace Laravel\Socialite\Tests;
  3. use GuzzleHttp\Client;
  4. use GuzzleHttp\RequestOptions;
  5. use Illuminate\Http\Request;
  6. use Laravel\Socialite\Contracts\User as UserContract;
  7. use Laravel\Socialite\Two\LinkedInOpenIdProvider;
  8. use Laravel\Socialite\Two\User;
  9. use Mockery as m;
  10. use PHPUnit\Framework\TestCase;
  11. use Psr\Http\Message\ResponseInterface;
  12. use Psr\Http\Message\StreamInterface;
  13. class LinkedInOpenIdProviderTest extends TestCase
  14. {
  15. protected function tearDown(): void
  16. {
  17. parent::tearDown();
  18. m::close();
  19. }
  20. public function test_response()
  21. {
  22. $user = $this->fromResponse([
  23. 'sub' => 'asdfgh',
  24. 'given_name' => 'Nuno',
  25. 'picture' => 'https://media.licdn.com/dms/image/D4D03AQmZFgJNqeNNk',
  26. 'name' => 'Nuno Maduro',
  27. 'family_name' => 'Maduro',
  28. 'email' => 'nuno@laravel.com',
  29. ]);
  30. $this->assertInstanceOf(User::class, $user);
  31. $this->assertSame('asdfgh', $user->getId());
  32. $this->assertNull($user->getNickname());
  33. $this->assertSame('Nuno Maduro', $user->getName());
  34. $this->assertSame('nuno@laravel.com', $user->getEmail());
  35. $this->assertSame('https://media.licdn.com/dms/image/D4D03AQmZFgJNqeNNk', $user->getAvatar());
  36. $this->assertSame([
  37. 'id' => 'asdfgh',
  38. 'nickname' => null,
  39. 'name' => 'Nuno Maduro',
  40. 'first_name' => 'Nuno',
  41. 'last_name' => 'Maduro',
  42. 'email' => 'nuno@laravel.com',
  43. 'avatar' => 'https://media.licdn.com/dms/image/D4D03AQmZFgJNqeNNk',
  44. 'avatar_original' => 'https://media.licdn.com/dms/image/D4D03AQmZFgJNqeNNk',
  45. ], $user->attributes);
  46. }
  47. public function test_missing_email_and_avatar()
  48. {
  49. $user = $this->fromResponse([
  50. 'sub' => 'asdfgh',
  51. 'given_name' => 'Nuno',
  52. 'name' => 'Nuno Maduro',
  53. 'family_name' => 'Maduro',
  54. ]);
  55. $this->assertInstanceOf(User::class, $user);
  56. $this->assertSame('asdfgh', $user->getId());
  57. $this->assertNull($user->getNickname());
  58. $this->assertSame('Nuno Maduro', $user->getName());
  59. $this->assertNull($user->getEmail());
  60. $this->assertNull($user->getAvatar());
  61. $this->assertSame([
  62. 'id' => 'asdfgh',
  63. 'nickname' => null,
  64. 'name' => 'Nuno Maduro',
  65. 'first_name' => 'Nuno',
  66. 'last_name' => 'Maduro',
  67. 'email' => null,
  68. 'avatar' => null,
  69. 'avatar_original' => null,
  70. ], $user->attributes);
  71. }
  72. protected function fromResponse(array $response): UserContract
  73. {
  74. $request = m::mock(Request::class);
  75. $request->allows('input')->with('code')->andReturns('fake-code');
  76. $stream = m::mock(StreamInterface::class);
  77. $stream->allows('__toString')->andReturns(json_encode(['access_token' => 'fake-token']));
  78. $accessTokenResponse = m::mock(ResponseInterface::class);
  79. $accessTokenResponse->allows('getBody')->andReturns($stream);
  80. $basicProfileStream = m::mock(StreamInterface::class);
  81. $basicProfileStream->allows('__toString')->andReturns(json_encode($response));
  82. $basicProfileResponse = m::mock(ResponseInterface::class);
  83. $basicProfileResponse->allows('getBody')->andReturns($basicProfileStream);
  84. $guzzle = m::mock(Client::class);
  85. $guzzle->expects('post')->andReturns($accessTokenResponse);
  86. $guzzle->allows('get')->with('https://api.linkedin.com/v2/userinfo', [
  87. RequestOptions::HEADERS => [
  88. 'Authorization' => 'Bearer fake-token',
  89. 'X-RestLi-Protocol-Version' => '2.0.0',
  90. ],
  91. RequestOptions::QUERY => [
  92. 'projection' => '(sub,email,name,given_name,family_name,picture)',
  93. ],
  94. ])->andReturns($basicProfileResponse);
  95. $provider = new LinkedInOpenIdProvider($request, 'client_id', 'client_secret', 'redirect');
  96. $provider->stateless();
  97. $provider->setHttpClient($guzzle);
  98. return $provider->user();
  99. }
  100. }