Bläddra i källkod

Merge branch 'hotfix/hf-time-constraint'

Vincent 6 månader sedan
förälder
incheckning
08c7a17c5c

+ 7 - 2
src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php

@@ -36,9 +36,14 @@ abstract class AbstractTimeFilter extends SQLFilter
      */
     protected static ?string $annotationEndField = null;
 
-    public function setDisabled(bool $disabled): void
+    public function disable(): void
     {
-        $this->disabled = $disabled;
+        $this->disabled = true;
+    }
+
+    public function enable(): void
+    {
+        $this->disabled = false;
     }
 
     public function isDisabled(): bool

+ 43 - 16
src/Service/Doctrine/FiltersConfigurationService.php

@@ -66,23 +66,42 @@ class FiltersConfigurationService
     public function suspendTimeConstraintFilters(): void
     {
         if ($this->previousTimeConstraintState !== null) {
-            throw new \RuntimeException('date_time_filter is already suspended');
+            throw new \RuntimeException('time constraints is already suspended');
         }
 
-        $filters = $this->entityManager->getFilters();
-
-        if (!$filters->isEnabled('date_time_filter')) {
+        if ($this->timeFiltersAlreadyDisabled()) {
             $this->previousTimeConstraintState = false;
 
             return;
         }
 
-        /** @var AbstractTimeFilter $filter */
-        $filter = $filters->getFilter('date_time_filter');
+        $this->disableFilter('date_time_filter');
+        $this->disableFilter('activity_year_filter');
+
+        $this->previousTimeConstraintState = true;
+    }
+
+    /**
+     * Test si les filtres de temps sont déjà désactivés.
+     */
+    protected function timeFiltersAlreadyDisabled(): bool
+    {
+        $filters = $this->getFilters();
 
-        $this->previousTimeConstraintState = $filter->isDisabled() === false;
+        return !$filters->isEnabled('date_time_filter') && !$filters->isEnabled('activity_year_filter');
+    }
 
-        $filter->setDisabled(true);
+    /**
+     * Suspend le filtre.
+     *
+     * @param string $name : nom du filtre à suspendre
+     */
+    protected function disableFilter(string $name): void
+    {
+        $filters = $this->getFilters();
+        /** @var AbstractTimeFilter $dateTimeFilter */
+        $dateTimeFilter = $filters->getFilter($name);
+        $dateTimeFilter->disable();
     }
 
     /**
@@ -94,17 +113,25 @@ class FiltersConfigurationService
     public function restoreTimeConstraintFilters(): void
     {
         if ($this->previousTimeConstraintState === null) {
-            throw new \RuntimeException('date_time_filter has not been suspended, can not be restored');
+            throw new \RuntimeException('time constraints has not been suspended, can not be restored');
         }
 
-        $filters = $this->entityManager->getFilters();
-
-        if ($filters->isEnabled('date_time_filter')) {
-            /** @var AbstractTimeFilter $filter */
-            $filter = $filters->getFilter('date_time_filter');
-            $filter->setDisabled($this->previousTimeConstraintState);
-        }
+        $this->enableFilter('date_time_filter');
+        $this->enableFilter('activity_year_filter');
 
         $this->previousTimeConstraintState = null;
     }
+
+    /**
+     * Restaure le filtre.
+     *
+     * @return void
+     */
+    protected function enableFilter(string $name)
+    {
+        $filters = $this->getFilters();
+        /** @var AbstractTimeFilter $dateTimeFilter */
+        $dateTimeFilter = $filters->getFilter($name);
+        $dateTimeFilter->enable();
+    }
 }

+ 98 - 49
tests/Unit/Service/Doctrine/FiltersConfigurationServiceTest.php

@@ -2,6 +2,7 @@
 
 namespace App\Tests\Unit\Service\Doctrine;
 
+use App\Filter\Doctrine\TimeConstraint\AbstractTimeFilter;
 use App\Filter\Doctrine\TimeConstraint\ActivityYearFilter;
 use App\Filter\Doctrine\TimeConstraint\DatetimeFilter;
 use App\Service\Constraint\ActivityYearConstraint;
@@ -19,6 +20,21 @@ class TestableFiltersConfigurationService extends FiltersConfigurationService
         return parent::getFilters();
     }
 
+    public function timeFiltersAlreadyDisabled(): bool
+    {
+        return parent::timeFiltersAlreadyDisabled();
+    }
+
+    public function disableFilter(string $name): void
+    {
+        parent::disableFilter($name);
+    }
+
+    public function enableFilter(string $name): void
+    {
+        parent::enableFilter($name);
+    }
+
     public function setPreviousTimeConstraintState(?bool $value): void
     {
         $this->previousTimeConstraintState = $value;
@@ -43,7 +59,7 @@ class FiltersConfigurationServiceTest extends TestCase
         $this->activityYearConstraint = $this->getMockBuilder(ActivityYearConstraint::class)->disableOriginalConstructor()->getMock();
     }
 
-    public function getSUTMockForMethod(string $methodName): MockObject|TestableFiltersConfigurationService
+    public function getFiltersConfigurationServiceMockFor(string $methodName): MockObject|TestableFiltersConfigurationService
     {
         return $this
             ->getMockBuilder(TestableFiltersConfigurationService::class)
@@ -54,7 +70,7 @@ class FiltersConfigurationServiceTest extends TestCase
 
     public function testGetFilters(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('getFilters');
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('getFilters');
 
         $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
 
@@ -68,7 +84,7 @@ class FiltersConfigurationServiceTest extends TestCase
 
     public function testConfigureTimeConstraintFilters(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('configureTimeConstraintFilters');
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('configureTimeConstraintFilters');
 
         $accessId = 123;
 
@@ -100,20 +116,10 @@ class FiltersConfigurationServiceTest extends TestCase
 
     public function testSuspendTimeConstraintFilters(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('suspendTimeConstraintFilters');
-
-        $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
-
-        $this->em->expects(self::once())->method('getFilters')->willReturn($filterCollection);
-
-        $filterCollection->method('isEnabled')->with('date_time_filter')->willReturn(true);
-
-        $datetimeFilter = $this->getMockBuilder(DatetimeFilter::class)->disableOriginalConstructor()->getMock();
-
-        $filterCollection->method('getFilter')->with('date_time_filter')->willReturn($datetimeFilter);
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('suspendTimeConstraintFilters');
 
-        $datetimeFilter->method('isDisabled')->willReturn(false);
-        $datetimeFilter->expects(self::once())->method('setDisabled')->with(true);
+        $filterConfigurationService->expects(self::once())->method('timeFiltersAlreadyDisabled')->willReturn(false);
+        $filterConfigurationService->expects(self::exactly(2))->method('disableFilter')->withConsecutive(['date_time_filter'], ['activity_year_filter']);
 
         $filterConfigurationService->suspendTimeConstraintFilters();
 
@@ -125,25 +131,21 @@ class FiltersConfigurationServiceTest extends TestCase
 
     public function testSuspendTimeConstraintFiltersAlreadySuspended(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('suspendTimeConstraintFilters');
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('suspendTimeConstraintFilters');
 
         $filterConfigurationService->setPreviousTimeConstraintState(true);
 
         $this->expectException(\RuntimeException::class);
-        $this->expectExceptionMessage('date_time_filter is already suspended');
+        $this->expectExceptionMessage('time constraints is already suspended');
 
         $filterConfigurationService->suspendTimeConstraintFilters();
     }
 
     public function testSuspendTimeConstraintFiltersAlreadyDisabled(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('suspendTimeConstraintFilters');
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('suspendTimeConstraintFilters');
 
-        $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
-
-        $this->em->expects(self::once())->method('getFilters')->willReturn($filterCollection);
-
-        $filterCollection->method('isEnabled')->with('date_time_filter')->willReturn(false);
+        $filterConfigurationService->expects(self::once())->method('timeFiltersAlreadyDisabled')->willReturn(true);
 
         $filterConfigurationService->suspendTimeConstraintFilters();
 
@@ -153,61 +155,108 @@ class FiltersConfigurationServiceTest extends TestCase
         );
     }
 
-    public function testRestoreTimeConstraintFilters(): void
+    public function testTimeFiltersAlreadyDisabledReturnTrue(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('restoreTimeConstraintFilters');
-
-        $filterConfigurationService->setPreviousTimeConstraintState(true);
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('timeFiltersAlreadyDisabled');
 
         $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
+        $filterConfigurationService->expects(self::once())->method('getFilters')->willReturn($filterCollection);
 
-        $this->em->expects(self::once())->method('getFilters')->willReturn($filterCollection);
+        $filterCollection->expects(self::exactly(2))->method('isEnabled')->withConsecutive(['date_time_filter'], ['activity_year_filter'])->willReturnOnConsecutiveCalls(false, false);
 
-        $filterCollection->method('isEnabled')->with('date_time_filter')->willReturn(true);
+        $this->assertEquals(
+            true,
+            $filterConfigurationService->timeFiltersAlreadyDisabled()
+        );
+    }
 
-        $datetimeFilter = $this->getMockBuilder(DatetimeFilter::class)->disableOriginalConstructor()->getMock();
+    public function testTimeFiltersAlreadyDisabledReturnFalseFirstArgTrue(): void
+    {
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('timeFiltersAlreadyDisabled');
 
-        $filterCollection->method('getFilter')->with('date_time_filter')->willReturn($datetimeFilter);
+        $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
+        $filterConfigurationService->expects(self::once())->method('getFilters')->willReturn($filterCollection);
 
-        $datetimeFilter->expects(self::once())->method('setDisabled')->with(true);
+        $filterCollection->expects(self::once())->method('isEnabled')->withConsecutive(['date_time_filter'])->willReturn(true);
 
-        $filterConfigurationService->restoreTimeConstraintFilters();
+        $this->assertEquals(
+            false,
+            $filterConfigurationService->timeFiltersAlreadyDisabled()
+        );
+    }
+
+    public function testTimeFiltersAlreadyDisabledReturnFalseSecondArgTrue(): void
+    {
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('timeFiltersAlreadyDisabled');
+
+        $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
+        $filterConfigurationService->expects(self::once())->method('getFilters')->willReturn($filterCollection);
+
+        $filterCollection->expects(self::exactly(2))->method('isEnabled')->withConsecutive(['date_time_filter'], ['activity_year_filter'])->willReturnOnConsecutiveCalls(false, true);
 
         $this->assertEquals(
-            $filterConfigurationService->getPreviousTimeConstraintState(),
-            null
+            false,
+            $filterConfigurationService->timeFiltersAlreadyDisabled()
         );
     }
 
-    public function testRestoreTimeConstraintFiltersNotSuspended(): void
+    public function testDisableFilters(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('restoreTimeConstraintFilters');
+        $fooFilter = 'filter_name';
 
-        $this->expectException(\RuntimeException::class);
-        $this->expectExceptionMessage('date_time_filter has not been suspended, can not be restored');
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('disableFilter');
 
-        $filterConfigurationService->restoreTimeConstraintFilters();
+        $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
+        $filterConfigurationService->expects(self::once())->method('getFilters')->willReturn($filterCollection);
+
+        $abstractTimeFilter = $this->getMockBuilder(AbstractTimeFilter::class)->disableOriginalConstructor()->getMock();
+        $filterCollection->expects(self::once())->method('getFilter')->withConsecutive([$fooFilter])->willReturn($abstractTimeFilter);
+
+        $abstractTimeFilter->expects(self::once())->method('disable');
+
+        $filterConfigurationService->disableFilter($fooFilter);
     }
 
-    public function testRestoreTimeConstraintFiltersNotEnabled(): void
+    public function testEnableFilter(): void
     {
-        $filterConfigurationService = $this->getSUTMockForMethod('restoreTimeConstraintFilters');
+        $fooFilter = 'filter_name';
 
-        $filterConfigurationService->setPreviousTimeConstraintState(true);
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('enableFilter');
 
         $filterCollection = $this->getMockBuilder(FilterCollection::class)->disableOriginalConstructor()->getMock();
+        $filterConfigurationService->expects(self::once())->method('getFilters')->willReturn($filterCollection);
 
-        $this->em->expects(self::once())->method('getFilters')->willReturn($filterCollection);
+        $abstractTimeFilter = $this->getMockBuilder(AbstractTimeFilter::class)->disableOriginalConstructor()->getMock();
+        $filterCollection->expects(self::once())->method('getFilter')->withConsecutive([$fooFilter])->willReturn($abstractTimeFilter);
+
+        $abstractTimeFilter->expects(self::once())->method('enable');
+
+        $filterConfigurationService->enableFilter($fooFilter);
+    }
 
-        $filterCollection->method('isEnabled')->with('date_time_filter')->willReturn(false);
+    public function testRestoreTimeConstraintFilters(): void
+    {
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('restoreTimeConstraintFilters');
+
+        $filterConfigurationService->setPreviousTimeConstraintState(true);
 
-        $filterCollection->expects(self::never())->method('getFilter')->with('date_time_filter');
+        $filterConfigurationService->expects(self::exactly(2))->method('enableFilter')->withConsecutive(['date_time_filter'], ['activity_year_filter']);
 
         $filterConfigurationService->restoreTimeConstraintFilters();
 
         $this->assertEquals(
-            $filterConfigurationService->getPreviousTimeConstraintState(),
-            null
+            null,
+            $filterConfigurationService->getPreviousTimeConstraintState()
         );
     }
+
+    public function testRestoreTimeConstraintFiltersNotAlreadySuspended(): void
+    {
+        $filterConfigurationService = $this->getFiltersConfigurationServiceMockFor('restoreTimeConstraintFilters');
+
+        $this->expectException(\RuntimeException::class);
+        $this->expectExceptionMessage('time constraints has not been suspended, can not be restored');
+
+        $filterConfigurationService->restoreTimeConstraintFilters();
+    }
 }