LinkedInProviderTest.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace Laravel\Socialite\Tests;
  3. use GuzzleHttp\Client;
  4. use GuzzleHttp\RequestOptions;
  5. use Illuminate\Http\Request;
  6. use Laravel\Socialite\Two\LinkedInProvider;
  7. use Laravel\Socialite\Two\User;
  8. use Mockery as m;
  9. use PHPUnit\Framework\TestCase;
  10. use Psr\Http\Message\ResponseInterface;
  11. use Psr\Http\Message\StreamInterface;
  12. class LinkedInProviderTest extends TestCase
  13. {
  14. protected function tearDown(): void
  15. {
  16. parent::tearDown();
  17. m::close();
  18. }
  19. public function test_it_can_map_a_user_without_an_email_address()
  20. {
  21. $request = m::mock(Request::class);
  22. $request->allows('input')->with('code')->andReturns('fake-code');
  23. $stream = m::mock(StreamInterface::class);
  24. $stream->allows('__toString')->andReturns(json_encode(['access_token' => 'fake-token']));
  25. $accessTokenResponse = m::mock(ResponseInterface::class);
  26. $accessTokenResponse->allows('getBody')->andReturns($stream);
  27. $basicProfileStream = m::mock(StreamInterface::class);
  28. $basicProfileStream->allows('__toString')->andReturns(json_encode(['id' => $userId = 1]));
  29. $basicProfileResponse = m::mock(ResponseInterface::class);
  30. $basicProfileResponse->allows('getBody')->andReturns($basicProfileStream);
  31. $emailAddressStream = m::mock(StreamInterface::class);
  32. $emailAddressStream->allows('__toString')->andReturns(json_encode(['elements' => []]));
  33. // Make sure email address response contains no values.
  34. $emailAddressResponse = m::mock(ResponseInterface::class);
  35. $emailAddressResponse->allows('getBody')->andReturns($emailAddressStream);
  36. $guzzle = m::mock(Client::class);
  37. $guzzle->expects('post')->andReturns($accessTokenResponse);
  38. $guzzle->allows('get')->with('https://api.linkedin.com/v2/me', [
  39. RequestOptions::HEADERS => [
  40. 'Authorization' => 'Bearer fake-token',
  41. 'X-RestLi-Protocol-Version' => '2.0.0',
  42. ],
  43. RequestOptions::QUERY => [
  44. 'projection' => '(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName)',
  45. ],
  46. ])->andReturns($basicProfileResponse);
  47. $guzzle->allows('get')->with('https://api.linkedin.com/v2/emailAddress', [
  48. RequestOptions::HEADERS => [
  49. 'Authorization' => 'Bearer fake-token',
  50. 'X-RestLi-Protocol-Version' => '2.0.0',
  51. ],
  52. RequestOptions::QUERY => [
  53. 'q' => 'members',
  54. 'projection' => '(elements*(handle~))',
  55. ],
  56. ])->andReturns($emailAddressResponse);
  57. $provider = new LinkedInProvider($request, 'client_id', 'client_secret', 'redirect');
  58. $provider->stateless();
  59. $provider->setHttpClient($guzzle);
  60. $user = $provider->user();
  61. $this->assertInstanceOf(User::class, $user);
  62. $this->assertSame($userId, $user->getId());
  63. $this->assertNull($user->getEmail());
  64. }
  65. }