OnSubdomainChangeTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. namespace App\Tests\Service\OnChange\Organization;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Organization\Organization;
  5. use App\Entity\Organization\Subdomain;
  6. use App\Message\Command\MailerCommand;
  7. use App\Message\Command\Typo3\Typo3UpdateCommand;
  8. use App\Service\Mailer\Model\SubdomainChangeModel;
  9. use App\Service\OnChange\OnChangeContext;
  10. use App\Service\OnChange\Organization\OnSubdomainChange;
  11. use App\Service\Organization\Utils as OrganizationUtils;
  12. use App\Service\Typo3\BindFileService;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use PHPUnit\Framework\MockObject\MockObject;
  16. use PHPUnit\Framework\TestCase;
  17. use Symfony\Component\Messenger\Envelope;
  18. use Symfony\Component\Messenger\MessageBusInterface;
  19. use Symfony\Bundle\SecurityBundle\Security;
  20. class OnSubdomainChangeTest extends TestCase
  21. {
  22. private OrganizationUtils $organizationUtils;
  23. private Security $security;
  24. private BindFileService $bindFileService;
  25. private MessageBusInterface $messageBus;
  26. private EntityManagerInterface $entityManager;
  27. public function setUp():void
  28. {
  29. $this->organizationUtils = $this->getMockBuilder(OrganizationUtils::class)->disableOriginalConstructor()->getMock();
  30. $this->security = $this->getMockBuilder(Security::class)->disableOriginalConstructor()->getMock();
  31. $this->bindFileService = $this->getMockBuilder(BindFileService::class)->disableOriginalConstructor()->getMock();
  32. $this->messageBus = $this->getMockBuilder(MessageBusInterface::class)->disableOriginalConstructor()->getMock();
  33. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  34. }
  35. private function makeOnSubdomainChangeMock(string $methodName): MockObject | OnSubdomainChange {
  36. return $this->getMockBuilder(OnSubdomainChange::class)
  37. ->setConstructorArgs([$this->organizationUtils, $this->bindFileService, $this->messageBus, $this->security, $this->entityManager])
  38. ->setMethodsExcept([$methodName])
  39. ->getMock();
  40. }
  41. /**
  42. * @see OnSubdomainChange::validate()
  43. */
  44. public function testValidateIsOk(): void
  45. {
  46. $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate');
  47. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  48. $context->method('isPostRequest')->willReturn(true);
  49. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  50. $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([1,2]));
  51. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  52. $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization);
  53. $onSubdomainChange->validate($subdomain, $context);
  54. }
  55. /**
  56. * @see OnSubdomainChange::validate()
  57. */
  58. public function testValidateIsPutRequest(): void
  59. {
  60. $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate');
  61. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  62. $context->method('isPostRequest')->willReturn(false);
  63. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  64. $subdomain->expects(self::never())->method('getOrganization');
  65. $onSubdomainChange->validate($subdomain, $context);
  66. }
  67. /**
  68. * @see OnSubdomainChange::validate()
  69. */
  70. public function testValidateMaxReached(): void
  71. {
  72. $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate');
  73. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  74. $context->method('isPostRequest')->willReturn(true);
  75. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  76. $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([1,2,3]));
  77. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  78. $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization);
  79. $this->expectException(\RuntimeException::class);
  80. $onSubdomainChange->validate($subdomain, $context);
  81. }
  82. /**
  83. * @see OnSubdomainChange::beforeChange()
  84. */
  85. public function testBeforeChangeActivated(): void
  86. {
  87. $onSubdomainChange = $this->makeOnSubdomainChangeMock('beforeChange');
  88. // Le sous-domaine qu'on vient d'activer
  89. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  90. $subdomain->method('isActive')->willReturn(true);
  91. // Son état précédent
  92. $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  93. $previousData->method('isActive')->willReturn(false);
  94. // Le sous domaine qui était actif jusqu'ici, et que le OnChange devrait désactiver
  95. $otherSubdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  96. $otherSubdomain->method('isActive')->willReturn(true);
  97. $otherSubdomain->expects(self::once())->method('setActive')->with(false);
  98. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  99. $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([$subdomain, $otherSubdomain]));
  100. $subdomain->method('getOrganization')->willReturn($organization);
  101. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  102. $context->method('previousData')->willReturn($previousData);
  103. $context->method('isPutRequest')->willReturn(true);
  104. $context->method('isPostRequest')->willReturn(false);
  105. $onSubdomainChange->beforeChange($subdomain, $context);
  106. }
  107. /**
  108. * @see OnSubdomainChange::onChange()
  109. */
  110. public function testOnChangeNoChange(): void
  111. {
  112. $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange');
  113. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  114. $this->messageBus->expects(self::never())->method('dispatch');
  115. $onSubdomainChange->expects(self::never())->method('sendEmailAfterSubdomainChange');
  116. $this->entityManager->expects(self::never())->method('refresh');
  117. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  118. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  119. $onSubdomainChange->onChange($subdomain, $context);
  120. }
  121. /**
  122. * @see OnSubdomainChange::onChange()
  123. */
  124. public function testOnChangeActivated(): void {
  125. $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange');
  126. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  127. $this->messageBus
  128. ->expects(self::once())
  129. ->method('dispatch')
  130. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  131. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  132. $onSubdomainChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  133. // Le sous-domaine qu'on vient d'activer
  134. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  135. $subdomain->method('isActive')->willReturn(true);
  136. // Son état précédent
  137. $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  138. $previousData->method('isActive')->willReturn(false);
  139. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  140. $organization->method('getId')->willReturn(1);
  141. $subdomain->method('getOrganization')->willReturn($organization);
  142. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  143. $context->method('previousData')->willReturn($previousData);
  144. $context->method('isPutRequest')->willReturn(true);
  145. $context->method('isPostRequest')->willReturn(false);
  146. $this->entityManager->expects(self::once())->method('refresh')->with($organization);
  147. $onSubdomainChange->onChange($subdomain, $context);
  148. }
  149. /**
  150. * @see OnSubdomainChange::onChange()
  151. */
  152. public function testOnChangeCreated(): void {
  153. $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange');
  154. $this->bindFileService->expects(self::once())->method('registerSubdomain');
  155. $this->messageBus
  156. ->expects(self::once())
  157. ->method('dispatch')
  158. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  159. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  160. $onSubdomainChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  161. // Le sous-domaine qu'on vient d'activer
  162. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  163. $subdomain->method('isActive')->willReturn(true);
  164. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  165. $organization->method('getId')->willReturn(1);
  166. $subdomain->method('getOrganization')->willReturn($organization);
  167. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  168. $context->method('previousData')->willReturn(null);
  169. $context->method('isPutRequest')->willReturn(false);
  170. $context->method('isPostRequest')->willReturn(true);
  171. $onSubdomainChange->onChange($subdomain, $context);
  172. }
  173. /**
  174. * @see OnSubdomainChange::sendEmailAfterSubdomainChange()
  175. */
  176. public function testSendEmailAfterSubdomainChange(): void {
  177. $onSubdomainChange = $this->makeOnSubdomainChangeMock('sendEmailAfterSubdomainChange');
  178. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  179. $subdomainChangeModel = $this->getMockBuilder(SubdomainChangeModel::class)->disableOriginalConstructor()->getMock();
  180. $onSubdomainChange
  181. ->expects(self::once())
  182. ->method('getMailModel')
  183. ->with($subdomain)
  184. ->willReturn($subdomainChangeModel);
  185. $this->messageBus
  186. ->expects(self::once())
  187. ->method('dispatch')
  188. ->with(self::isInstanceOf(MailerCommand::class))
  189. ->willReturn(new Envelope(new MailerCommand($subdomainChangeModel)));
  190. $onSubdomainChange->sendEmailAfterSubdomainChange($subdomain);
  191. }
  192. /**
  193. * @see OnSubdomainChange::getMailModel()
  194. */
  195. public function testGetMailModel(): void {
  196. $onSubdomainChange = $this->makeOnSubdomainChangeMock('getMailModel');
  197. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  198. $organization->expects(self::once())->method('getId')->willReturn(1);
  199. $this->organizationUtils
  200. ->expects(self::once())
  201. ->method('getOrganizationWebsite')
  202. ->with($organization)
  203. ->willReturn('mysubdomain.opentalent.fr');
  204. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  205. $access->expects(self::once())->method('getId')->willReturn(1);
  206. $this->security
  207. ->expects(self::once())
  208. ->method('getUser')
  209. ->willReturn($access);
  210. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  211. $subdomain->expects(self::exactly(2))->method('getOrganization')->willReturn($organization);
  212. $subdomain->expects(self::once())->method('getId')->willReturn(1);
  213. $mailerModel = $onSubdomainChange->getMailModel($subdomain);
  214. $this->assertInstanceOf(SubdomainChangeModel::class, $mailerModel);
  215. $this->assertEquals($mailerModel->getSenderId(), 1);
  216. $this->assertEquals($mailerModel->getOrganizationId(), 1);
  217. $this->assertEquals($mailerModel->getSubdomainId(), 1);
  218. $this->assertEquals($mailerModel->getUrl(), 'mysubdomain.opentalent.fr');
  219. }
  220. }