Vincent GUFFON 4 лет назад
Родитель
Сommit
5343177504

+ 11 - 11
config/opentalent/modulesbyconditions.yaml

@@ -5,67 +5,67 @@ opentalent:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isLastParentAndCMF
         CotisationStructure:
             roles:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isStructureAndCMF
         CotisationRate:
             roles:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isManagerAndLastParentAndCMF
         CotisationTransmissionState:
             roles:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isManagerAndCMF
         CotisationTransmission:
             roles:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isManagerAndNotLastParentAndCMF
         CotisationCMFAdministration:
             roles:
                 - ROLE_COTISATION
             conditions:
                 service:
-                    name: 'App\Service\Organization\Utils'
+                    name: App\Service\Organization\Utils
                     function: isOrganizationIsCMF
         Admin2IOS:
             roles:
                 - ROLE_ADMIN2IOS
             conditions:
                 service:
-                    name: 'App\Service\Organization\Utils'
+                    name: App\Service\Organization\Utils
                     function: isOrganizationIs2ios
         StatisticFederation:
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isManagerAndNotLastParentAndCMF
         StatisticStructure:
             conditions:
                 service:
-                    name: 'App\Service\Cotisation\Utils'
+                    name: App\Service\Cotisation\Utils
                     function: isManagerAndCMF
         Network:
             conditions:
                 service:
-                    name: 'App\Service\Network\Utils'
+                    name: App\Service\Network\Utils
                     function: isCMF
         NetworkOrganization:
             conditions:
                 service:
-                    name: 'App\Service\Network\Utils'
+                    name: App\Service\Network\Utils
                     function: isCMF

+ 16 - 8
src/Service/Utils/GpsCoordinateUtils.php

@@ -4,6 +4,7 @@ declare(strict_types=1);
 namespace App\Service\Utils;
 
 use App\ApiResources\Utils\GpsCoordinate;
+use App\Tests\Service\Utils\GpsCoordinateUtilsTest;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Contracts\HttpClient\HttpClientInterface;
 
@@ -32,12 +33,15 @@ class GpsCoordinateUtils
      * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
      * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
      * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
+     * @see GpsCoordinateUtilsTest::testSearchGpsCoordinates()
      */
     public function searchGpsCoordinates(?string $street, ?string $cp, ?string $city): array {
-        $url = sprintf('search?addressdetails=1&format=json&limit=10&street=%s&postalcode=%s&city=%s', $street, $cp, $city);
-        $response = $this->clientOpenStreetMap->request('GET', $url)->getContent();
-        if(empty($response))
-            throw new NotFoundHttpException('no_cooresponding_gps_coordinate');
+        try{
+            $url = sprintf('search?addressdetails=1&format=json&limit=10&street=%s&postalcode=%s&city=%s', $street, $cp, $city);
+            $response = $this->clientOpenStreetMap->request('GET', $url)->getContent();
+        }catch(\Exception $e){
+            throw new NotFoundHttpException('no_reverse_gps_coordinate', $e, 404);
+        }
 
         return json_decode($response, true);
     }
@@ -51,12 +55,15 @@ class GpsCoordinateUtils
      * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
      * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
      * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
+     * @see GpsCoordinateUtilsTest::testReverseGpsCoordinates()
      */
     public function reverseGpsCoordinates(float $latitude, float $longitude): array {
-        $url = sprintf('reverse?addressdetails=1&format=json&lat=%s&lon=%s', $latitude, $longitude);
-        $response = $this->clientOpenStreetMap->request('GET', $url)->getContent();
-        if(empty($response))
-            throw new NotFoundHttpException('no_reverse_gps_coordinate');
+        try{
+            $url = sprintf('reverse?addressdetails=1&format=json&lat=%s&lon=%s', $latitude, $longitude);
+            $response = $this->clientOpenStreetMap->request('GET', $url)->getContent();
+        }catch(\Exception $e){
+            throw new NotFoundHttpException('no_reverse_gps_coordinate', $e, 404);
+        }
 
         return json_decode($response, true);
     }
@@ -65,6 +72,7 @@ class GpsCoordinateUtils
      * Transforme une réponse d'API en ressource GpsCoordinate
      * @param array $gpsApiResponse
      * @return GpsCoordinate
+     * @see GpsCoordinateUtilsTest::testCreateGpsCoordinate()
      */
     public function createGpsCoordinate(array $gpsApiResponse):GpsCoordinate{
         $address = $this->transformAddress($gpsApiResponse['address']);

+ 8 - 4
tests/Service/Security/ModuleTest.php

@@ -52,12 +52,16 @@ class ModuleTest extends TestCase
         $organizationMock = $this->getMockBuilder(Organization::class)->getMock();
         $this->reflectionMock
             ->method('dynamicInvokeServiceWithArgsAndMethod')
-            ->with('opentalent.network.utils', 'isCMF', array($organizationMock))
-            ->willReturn(true);
-
+            ->withConsecutive(
+                ['App\\Service\\Cotisation\\Utils', 'isLastParentAndCMF', array($organizationMock)]
+            )
+            ->willReturnOnConsecutiveCalls(
+                [true]
+            )
+        ;
 
         $module = new Module($this->reflectionMock, $this->parser, self::OPENTALENT_CONFIG);
-        $value = "Network";
+        $value = "CotisationCall";
         // assert function to test whether 'value' is a value of array
         $this->assertContains($value, $module->getModulesByConditions($organizationMock)) ;
     }

+ 110 - 0
tests/Service/Utils/GpsCoordinateUtilsTest.php

@@ -0,0 +1,110 @@
+<?php
+namespace App\Tests\Service\Utils;
+
+use App\ApiResources\Utils\GpsCoordinate;
+use App\Service\Utils\GpsCoordinateUtils;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpClient\MockHttpClient;
+use Symfony\Component\HttpClient\Response\MockResponse;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+class GpsCoordinateUtilsTest extends TestCase
+{
+    private $response;
+    private $responseReverse;
+
+    public function setUp(): void
+    {
+        $this->response = '[{"place_id":124047700,"licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright","osm_type":"way","osm_id":146744176,"boundingbox":["46.040309","46.0413942","6.584711","6.5864561"],"lat":"46.0405718","lon":"6.5857964","display_name":"Chemin des Rirets, La Frasse, Romme, Nancy-sur-Cluses, Bonneville, Haute-Savoie, Auvergne-Rhône-Alpes, France métropolitaine, 74300, France","place_rank":26,"category":"highway","type":"residential","importance":0.8099999999999999}]';
+        $this->responseReverse = '{"place_id":124302276,"licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright","osm_type":"way","osm_id":146744171,"lat":"46.04082792421903","lon":"6.585562827387761","place_rank":26,"category":"highway","type":"unclassified","importance":0.09999999999999998,"addresstype":"road","name":"Chemin des Larrets","display_name":"Chemin des Larrets, La Frasse, Romme, Nancy-sur-Cluses, Bonneville, Haute-Savoie, Auvergne-Rhône-Alpes, France métropolitaine, 74300, France","address":{"road":"Chemin des Larrets","hamlet":"La Frasse","village":"Romme","municipality":"Bonneville","county":"Haute-Savoie","state":"Auvergne-Rhône-Alpes","country":"France","postcode":"74300","country_code":"fr"},"boundingbox":["46.0404896","46.040881","6.585013","6.5874704"]}';
+    }
+
+    /**
+     * @see GpsCoordinateUtils::searchGpsCoordinates()
+     */
+    public function testSearchGpsCoordinates():void
+    {
+        $responses = [new MockResponse($this->response, ['http_code' => 200])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $content = $gpsCoordinateUtils->searchGpsCoordinates('11 chemin des rirtes', '74300', 'nancy-sur-cluses');
+
+        $this->assertIsArray($content);
+        $this->assertCount(1, $content);
+        $this->assertEquals("Chemin des Rirets, La Frasse, Romme, Nancy-sur-Cluses, Bonneville, Haute-Savoie, Auvergne-Rhône-Alpes, France métropolitaine, 74300, France", $content[0]['display_name']);
+    }
+
+    /**
+     * @see GpsCoordinateUtils::searchGpsCoordinates()
+     */
+    public function testSearchGpsCoordinatesFailed():void
+    {
+        $responses = [new MockResponse('...', ['http_code' => 404])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $this->expectException(NotFoundHttpException::class);
+        $gpsCoordinateUtils->searchGpsCoordinates('...', '74300', '...');
+    }
+
+    /**
+     * @see GpsCoordinateUtils::reverseGpsCoordinates()
+     */
+    public function testReverseGpsCoordinates():void
+    {
+        $responses = [new MockResponse($this->responseReverse, ['http_code' => 200])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $content = $gpsCoordinateUtils->reverseGpsCoordinates(46.04085160266434, 6.585583549999978);
+
+        $this->assertIsArray($content);
+        $this->assertArrayHasKey('place_id', $content);
+        $this->assertEquals("Chemin des Larrets, La Frasse, Romme, Nancy-sur-Cluses, Bonneville, Haute-Savoie, Auvergne-Rhône-Alpes, France métropolitaine, 74300, France", $content['display_name']);
+    }
+
+    /**
+     * @see GpsCoordinateUtils::reverseGpsCoordinates()
+     */
+    public function testReverseGpsCoordinatesFailed():void
+    {
+        $responses = [new MockResponse('...', ['http_code' => 404])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $this->expectException(NotFoundHttpException::class);
+        $gpsCoordinateUtils->reverseGpsCoordinates(0000, 0000);
+    }
+
+    /**
+     * @see GpsCoordinateUtils::createGpsCoordinate()
+     */
+    public function testCreateGpsCoordinate():void
+    {
+        $responses = [new MockResponse('...', ['http_code' => 200])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $this->assertInstanceOf(GpsCoordinate::class, $gpsCoordinateUtils->createGpsCoordinate(json_decode($this->responseReverse, true)));
+    }
+
+    /**
+     * @see GpsCoordinateUtils::transformAddress()
+     */
+    public function testTransformAddress():void
+    {
+        $responses = [new MockResponse('...', ['http_code' => 200])];
+        $client = new MockHttpClient($responses, 'https://nominatim.openstreetmap.org/');
+
+        $gpsCoordinateUtils = new GpsCoordinateUtils($client);
+        $arrayAddress = json_decode($this->responseReverse, true);
+        $addressTransformed = $gpsCoordinateUtils->transformAddress($arrayAddress['address']);
+        $this->assertEquals([
+              "streetAddress" => "Chemin des Larrets",
+              "streetAddressSecond" => "La Frasse",
+              "city" => "Romme",
+              "cp" => "74300"
+            ], $addressTransformed);
+    }
+}