FreemiumEventProviderTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\tests\Unit\State\Provider;
  4. use ApiPlatform\Metadata\Get;
  5. use ApiPlatform\Metadata\GetCollection;
  6. use ApiPlatform\State\Pagination\TraversablePaginator;
  7. use App\ApiResources\Freemium\FreemiumEvent;
  8. use App\Entity\Booking\Event;
  9. use App\Entity\Core\Categories;
  10. use App\Repository\Booking\EventRepository;
  11. use App\Service\Doctrine\FiltersConfigurationService;
  12. use App\Service\State\Provider\ProviderUtils;
  13. use App\State\Provider\Freemium\FreemiumEventProvider;
  14. use Doctrine\Common\Collections\ArrayCollection;
  15. use PHPUnit\Framework\MockObject\MockObject;
  16. use PHPUnit\Framework\TestCase;
  17. use Symfony\Component\ObjectMapper\ObjectMapperInterface;
  18. /**
  19. * Unit tests for ShopService.
  20. */
  21. class FreemiumEventProviderTest extends TestCase
  22. {
  23. private readonly MockObject|ProviderUtils $providerUtils;
  24. private readonly MockObject|ObjectMapperInterface $objectMapper;
  25. private readonly MockObject|EventRepository $eventRepository;
  26. private readonly MockObject|FiltersConfigurationService $filtersConfigurationService;
  27. public function setUp(): void
  28. {
  29. $this->providerUtils = $this->getMockBuilder(ProviderUtils::class)->disableOriginalConstructor()->getMock();
  30. $this->objectMapper = $this->getMockBuilder(ObjectMapperInterface::class)->disableOriginalConstructor()->getMock();
  31. $this->eventRepository = $this->getMockBuilder(EventRepository::class)->disableOriginalConstructor()->getMock();
  32. $this->filtersConfigurationService = $this->getMockBuilder(FiltersConfigurationService::class)->disableOriginalConstructor()->getMock();
  33. }
  34. private function getFreemiumEventProviderMockFor(string $methodName): FreemiumEventProvider|MockObject
  35. {
  36. $freemiumEventProvider = $this
  37. ->getMockBuilder(FreemiumEventProvider::class)
  38. ->setConstructorArgs(
  39. [
  40. $this->providerUtils,
  41. $this->objectMapper,
  42. $this->eventRepository,
  43. $this->filtersConfigurationService,
  44. ]
  45. )
  46. ->setMethodsExcept([$methodName])
  47. ->getMock();
  48. return $freemiumEventProvider;
  49. }
  50. /**
  51. * Test provide method for GetCollection operation.
  52. */
  53. public function testProvideGetCollectionMethod(): void
  54. {
  55. $freemiumEventProvide = $this->getFreemiumEventProviderMockFor('provide');
  56. $operation = new GetCollection();
  57. $freemiumEventProvide->expects(self::once())
  58. ->method('provideCollection')
  59. ->with($operation, [])
  60. ->willReturn(new TraversablePaginator(new \ArrayIterator([]), 0, 10, 0))
  61. ;
  62. $freemiumEventProvide->provide($operation);
  63. }
  64. /**
  65. * Test provide method for Get operation.
  66. */
  67. public function testProvideGetMethod(): void
  68. {
  69. $freemiumEventProvide = $this->getFreemiumEventProviderMockFor('provide');
  70. $freemiumEvent = $this->getMockBuilder(FreemiumEvent::class)->getMock();
  71. $operation = new Get();
  72. $freemiumEventProvide->expects(self::once())
  73. ->method('provideItem')
  74. ->with([], [])
  75. ->willReturn($freemiumEvent)
  76. ;
  77. $freemiumEventProvide->provide($operation);
  78. }
  79. /**
  80. * Test provideCollection method.
  81. */
  82. public function testProvideCollectionMethod(): void
  83. {
  84. $freemiumEventProvide = $this->getFreemiumEventProviderMockFor('provideCollection');
  85. $freemiumEvent = $this->getMockBuilder(FreemiumEvent::class)->getMock();
  86. $operation = new GetCollection();
  87. $this->filtersConfigurationService->expects(self::once())
  88. ->method('suspendTimeConstraintFilters');
  89. $traversable = new TraversablePaginator(new \ArrayIterator([$freemiumEvent, $freemiumEvent]), 0, 10, 2);
  90. $this->providerUtils->expects(self::once())
  91. ->method('applyCollectionExtensionsAndPagination')
  92. ->with(Event::class, $operation, [])
  93. ->willReturn($traversable);
  94. $this->objectMapper->expects(self::exactly(2))
  95. ->method('map')
  96. ->willReturnOnConsecutiveCalls($freemiumEvent, $freemiumEvent);
  97. $this->filtersConfigurationService->expects(self::once())
  98. ->method('restoreTimeConstraintFilters');
  99. $this->providerUtils->expects(self::once())
  100. ->method('getTraversablePaginator')
  101. ->with([$freemiumEvent, $freemiumEvent], $traversable)
  102. ->willReturn($traversable)
  103. ;
  104. $freemiumEventProvide->provideCollection($operation, []);
  105. }
  106. /**
  107. * Test provideItem method.
  108. */
  109. public function testProvideItemMethod(): void
  110. {
  111. $uriVariables = ['id' => 1];
  112. $freemiumEventProvide = $this->getFreemiumEventProviderMockFor('provideItem');
  113. $event = $this->getMockBuilder(Event::class)->getMock();
  114. $category = $this->getMockBuilder(Categories::class)->getMock();
  115. $categories = new ArrayCollection([$category, $category]);
  116. $event->method('getCategories')->willReturn($categories);
  117. $this->filtersConfigurationService->expects(self::once())
  118. ->method('suspendTimeConstraintFilters');
  119. $this->eventRepository->expects(self::once())
  120. ->method('find')
  121. ->with(1)
  122. ->willReturn($event)
  123. ;
  124. $this->filtersConfigurationService->expects(self::once())
  125. ->method('restoreTimeConstraintFilters');
  126. $freemiumEvent = new FreemiumEvent();
  127. $this->objectMapper->expects(self::once())
  128. ->method('map')
  129. ->willReturn($freemiumEvent);
  130. $event->expects(self::once())
  131. ->method('getCategories')
  132. ->willReturn($categories)
  133. ;
  134. $freemiumEventProvide->provideItem($uriVariables, []);
  135. $this->assertEquals(2, count($freemiumEvent->getCategories()));
  136. }
  137. }