ApiLegacyRequestServiceTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace App\Tests\Service\ApiLegacy;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Person\Person;
  5. use App\Service\ApiLegacy\ApiLegacyRequestService;
  6. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  7. use PHPUnit\Framework\MockObject\MockObject;
  8. use PHPUnit\Framework\TestCase;
  9. use Symfony\Component\HttpKernel\Exception\HttpException;
  10. use Symfony\Component\Security\Core\Authentication\Token\NullToken;
  11. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  12. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  13. use Symfony\Bundle\SecurityBundle\Security;
  14. use Symfony\Contracts\HttpClient\HttpClientInterface;
  15. use Symfony\Contracts\HttpClient\ResponseInterface;
  16. class ApiLegacyRequestServiceTest extends TestCase
  17. {
  18. private HttpClientInterface $apiLegacyClient;
  19. private Security $security;
  20. private JWTTokenManagerInterface $jwtManager;
  21. const internalRequestsToken = 'azerty';
  22. public function setUp(): void
  23. {
  24. $this->apiLegacyClient = $this->getMockBuilder(HttpClientInterface::class)->disableOriginalConstructor()->getMock();
  25. $this->security = $this->getMockBuilder(Security::class)->disableOriginalConstructor()->getMock();
  26. $this->jwtManager = $this->getMockBuilder(JWTTokenManagerInterface::class)->disableOriginalConstructor()->getMock();
  27. }
  28. public function getApiLegacyRequestServiceMockFor(string $methodName): ApiLegacyRequestService | MockObject {
  29. return $this
  30. ->getMockBuilder(ApiLegacyRequestService::class)
  31. ->setConstructorArgs([$this->apiLegacyClient, $this->security, $this->jwtManager, self::internalRequestsToken])
  32. ->setMethodsExcept([$methodName])
  33. ->getMock();
  34. }
  35. /**
  36. * @see ApiLegacyRequestService::request()
  37. */
  38. public function testRequest(): void
  39. {
  40. $api1RequestService = $this->getApiLegacyRequestServiceMockFor('request');
  41. $person = $this->getMockBuilder(Person::class)->disableOriginalConstructor()->getMock();
  42. $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  43. $user->method('getId')->willReturn(1);
  44. $user->method('getPerson')->willReturn($person);
  45. $token = $this->getMockBuilder(UsernamePasswordToken::class)->disableOriginalConstructor()->getMock();
  46. $token->method('getUser')->willReturn($user);
  47. $this->security->method('getToken')->willReturn($token);
  48. $this->jwtManager->method('create')->with($person)->willReturn('XYZ');
  49. $_REQUEST['BEARER'] = 'XYZ';
  50. $expectedHeaders = [
  51. 'custom' => 'foo',
  52. 'authorization' => 'BEARER XYZ',
  53. 'Accept' => '*/*',
  54. 'Charset' => 'UTF-8',
  55. 'Accept-Encoding' => 'gzip, deflate, br',
  56. 'Content-Type' => 'application/ld+json',
  57. 'x-accessid' => '1',
  58. 'internal-requests-token' => self::internalRequestsToken
  59. ];
  60. $response = $this->getMockBuilder(ResponseInterface::class)->disableOriginalConstructor()->getMock();
  61. $this->apiLegacyClient
  62. ->expects(self::once())
  63. ->method('request')
  64. ->with('GET', 'an/url', ['headers' => $expectedHeaders])
  65. ->willReturn($response);
  66. $api1RequestService->request(
  67. 'GET',
  68. '/an/url',
  69. [],
  70. ['headers' => ['custom' => 'foo']]
  71. );
  72. }
  73. /**
  74. * @see ApiLegacyRequestService::request()
  75. */
  76. public function testRequestSwitchUser(): void
  77. {
  78. $api1RequestService = $this->getApiLegacyRequestServiceMockFor('request');
  79. $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  80. $user->method('getId')->willReturn(10);
  81. $person = $this->getMockBuilder(Person::class)->disableOriginalConstructor()->getMock();
  82. $originalUser = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  83. $originalUser->method('getId')->willReturn(20);
  84. $originalUser->method('getPerson')->willReturn($person);
  85. $originalToken = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
  86. $originalToken->method('getUser')->willReturn($originalUser);
  87. $token = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
  88. $token->method('getUser')->willReturn($user);
  89. $token->method('getOriginalToken')->willReturn($originalToken);
  90. $this->security->method('getToken')->willReturn($token);
  91. $this->jwtManager->method('create')->with($person)->willReturn('123');
  92. $_REQUEST['BEARER'] = '123';
  93. $expectedHeaders = [
  94. 'authorization' => 'BEARER 123',
  95. 'Accept' => '*/*',
  96. 'Charset' => 'UTF-8',
  97. 'Accept-Encoding' => 'gzip, deflate, br',
  98. 'Content-Type' => 'application/ld+json',
  99. 'x-accessid' => '20',
  100. 'x-switch-access' => '10',
  101. 'internal-requests-token' => self::internalRequestsToken
  102. ];
  103. $response = $this->getMockBuilder(ResponseInterface::class)->disableOriginalConstructor()->getMock();
  104. $this->apiLegacyClient
  105. ->expects(self::once())
  106. ->method('request')
  107. ->with('GET', 'an/url', ['headers' => $expectedHeaders])
  108. ->willReturn($response);
  109. $api1RequestService->request('GET', '/an/url');
  110. }
  111. /**
  112. * @see ApiLegacyRequestService::request()
  113. */
  114. public function testRequestSwitchInvalidUser(): void
  115. {
  116. $api1RequestService = $this->getApiLegacyRequestServiceMockFor('request');
  117. $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  118. $user->method('getId')->willReturn(10);
  119. $originalToken = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
  120. $originalToken->method('getUser')->willReturn(null);
  121. $token = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
  122. $token->method('getUser')->willReturn($user);
  123. $token->method('getOriginalToken')->willReturn($originalToken);
  124. $this->security->method('getToken')->willReturn($token);
  125. $this->expectException(HttpException::class);
  126. $this->expectExceptionMessage('Request error : Switch original user missing');
  127. $api1RequestService->request('GET', '/an/url');
  128. }
  129. }