Ver Fonte

add tests for Api1RequestService

Olivier Massot há 3 anos atrás
pai
commit
220645bbd0

+ 1 - 0
src/Service/Api1/Api1RequestService.php

@@ -38,6 +38,7 @@ class Api1RequestService extends ApiRequestService
         $headers = [
             'authorization' => 'BEARER ' . $_REQUEST['BEARER'],
             'Accept' => '*/*',
+            'Charset' => 'UTF-8',
             'Accept-Encoding' => 'gzip, deflate, br',
             'Content-Type' => 'application/ld+json',
         ];

+ 194 - 0
tests/Service/Api1/Api1RequestServiceTest.php

@@ -0,0 +1,194 @@
+<?php /** @noinspection DuplicatedCode */
+
+namespace App\Test\Service\Api1;
+
+use App\Entity\Access\Access;
+use App\Service\Api1\Api1RequestService;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\Security\Core\Authentication\Token\NullToken;
+use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
+use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
+use Symfony\Component\Security\Core\Security;
+use Symfony\Contracts\HttpClient\HttpClientInterface;
+use Symfony\Contracts\HttpClient\ResponseInterface;
+
+class Api1RequestServiceTest extends TestCase
+{
+    private HttpClientInterface $api1_client;
+    private Security $security;
+
+    public function setUp(): void
+    {
+        $this->api1_client = $this->getMockBuilder(HttpClientInterface::class)->disableOriginalConstructor()->getMock();
+        $this->security = $this->getMockBuilder(Security::class)->disableOriginalConstructor()->getMock();
+    }
+
+    public function testRequest(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $user->method('getId')->willReturn(1);
+
+        $token = $this->getMockBuilder(UsernamePasswordToken::class)->disableOriginalConstructor()->getMock();
+        $token->method('getUser')->willReturn($user);
+
+        $this->security->method('getToken')->willReturn($token);
+
+        $_REQUEST['BEARER'] = '123';
+        $expectedHeaders = [
+            'custom' => 'foo',
+            'authorization' => 'BEARER 123',
+            'Accept' => '*/*',
+            'Charset' => 'UTF-8',
+            'Accept-Encoding' => 'gzip, deflate, br',
+            'Content-Type' => 'application/ld+json',
+            'x-accessid' => '1'
+        ];
+
+        $response = $this->getMockBuilder(ResponseInterface::class)->disableOriginalConstructor()->getMock();
+
+        $this->api1_client
+            ->expects(self::once())
+            ->method('request')
+            ->with('GET', 'an/url', ['headers' => $expectedHeaders])
+            ->willReturn($response);
+
+        $api1RequestService->request(
+            'GET',
+            '/an/url',
+            [],
+            ['headers' => ['custom' => 'foo']]
+        );
+    }
+
+    public function testRequestNoToken(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $this->security->method('getToken')->willReturn(null);
+
+        $this->expectException(HttpException::class);
+        $this->expectExceptionMessage('Request error : Invalid security token');
+
+        $api1RequestService->request('GET', '/an/url');
+    }
+
+    public function testRequestNullToken(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $token = $this->getMockBuilder(NullToken::class)->disableOriginalConstructor()->getMock();
+
+        $this->security->method('getToken')->willReturn($token);
+
+        $this->expectException(HttpException::class);
+        $this->expectExceptionMessage('Request error : Invalid security token');
+
+        $api1RequestService->request('GET', '/an/url');
+    }
+
+    public function testRequestInvalidToken(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $token = $this->getMockBuilder(UsernamePasswordToken::class)->disableOriginalConstructor()->getMock();
+        $token->method('getUser')->willReturn(null);
+
+        $this->security->method('getToken')->willReturn($token);
+
+        $this->expectException(HttpException::class);
+        $this->expectExceptionMessage('Request error : Invalid security token');
+
+        $api1RequestService->request('GET', '/an/url');
+    }
+
+    public function testRequestSwitchUser(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $user->method('getId')->willReturn(10);
+
+        $originalUser = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $originalUser->method('getId')->willReturn(20);
+
+        $originalToken = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
+        $originalToken->method('getUser')->willReturn($originalUser);
+
+        $token = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
+        $token->method('getUser')->willReturn($user);
+        $token->method('getOriginalToken')->willReturn($originalToken);
+
+        $this->security->method('getToken')->willReturn($token);
+
+        $_REQUEST['BEARER'] = '123';
+
+        $expectedHeaders = [
+            'authorization' => 'BEARER 123',
+            'Accept' => '*/*',
+            'Charset' => 'UTF-8',
+            'Accept-Encoding' => 'gzip, deflate, br',
+            'Content-Type' => 'application/ld+json',
+            'x-accessid' => '20',
+            'x-switch-access' => '10',
+        ];
+
+        $response = $this->getMockBuilder(ResponseInterface::class)->disableOriginalConstructor()->getMock();
+
+        $this->api1_client
+            ->expects(self::once())
+            ->method('request')
+            ->with('GET', 'an/url', ['headers' => $expectedHeaders])
+            ->willReturn($response);
+
+        $api1RequestService->request('GET', '/an/url');
+    }
+
+    public function testRequestSwitchInvalidUser(): void
+    {
+        $api1RequestService = $this
+            ->getMockBuilder(Api1RequestService::class)
+            ->setConstructorArgs([$this->api1_client, $this->security])
+            ->setMethodsExcept(['request'])
+            ->getMock();
+
+        $user = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $user->method('getId')->willReturn(10);
+
+        $originalToken = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
+        $originalToken->method('getUser')->willReturn(null);
+
+        $token = $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
+        $token->method('getUser')->willReturn($user);
+        $token->method('getOriginalToken')->willReturn($originalToken);
+
+        $this->security->method('getToken')->willReturn($token);
+
+        $this->expectException(HttpException::class);
+        $this->expectExceptionMessage('Request error : Switch original user missing');
+
+        $api1RequestService->request('GET', '/an/url');
+    }
+}