OnSubdomainChangeTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace App\Test\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\Typo3\Typo3UpdateCommand;
  7. use App\Service\MailHub;
  8. use App\Service\OnChange\OnChangeContext;
  9. use App\Service\OnChange\Organization\OnSubdomainChange;
  10. use App\Service\Typo3\BindFileService;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use PHPUnit\Framework\TestCase;
  13. use Symfony\Component\Messenger\Envelope;
  14. use Symfony\Component\Messenger\MessageBusInterface;
  15. class OnSubdomainChangeTest extends TestCase
  16. {
  17. private \App\Service\Organization\Utils $organizationUtils;
  18. private \App\Service\Access\Utils $accessUtils;
  19. private MailHub $mailHub;
  20. private BindFileService $bindFileService;
  21. private MessageBusInterface $messageBus;
  22. private EntityManagerInterface $entityManager;
  23. private OnSubdomainChange $onSubdomainChange;
  24. public function setUp():void
  25. {
  26. $this->organizationUtils = $this->getMockBuilder(\App\Service\Organization\Utils::class)->disableOriginalConstructor()->getMock();
  27. $this->accessUtils = $this->getMockBuilder(\App\Service\Access\Utils::class)->disableOriginalConstructor()->getMock();
  28. $this->mailHub = $this->getMockBuilder(MailHub::class)->disableOriginalConstructor()->getMock();
  29. $this->bindFileService = $this->getMockBuilder(BindFileService::class)->disableOriginalConstructor()->getMock();
  30. $this->messageBus = $this->getMockBuilder(MessageBusInterface::class)->disableOriginalConstructor()->getMock();
  31. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  32. $this->onSubdomainChange = new OnSubdomainChange(
  33. $this->organizationUtils,
  34. $this->accessUtils,
  35. $this->mailHub,
  36. $this->bindFileService,
  37. $this->messageBus,
  38. $this->entityManager
  39. );
  40. }
  41. public function testValidateIsOk(): void
  42. {
  43. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  44. $context->method('isPostRequest')->willReturn(true);
  45. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  46. $organization->expects(self::once())->method('getSubdomains')->willReturn(new \Doctrine\Common\Collections\ArrayCollection([1,2]));
  47. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  48. $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization);
  49. $this->onSubdomainChange->validate($subdomain, $context);
  50. }
  51. public function testValidateIsPutRequest(): void
  52. {
  53. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  54. $context->method('isPostRequest')->willReturn(false);
  55. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  56. $subdomain->expects(self::never())->method('getOrganization');
  57. $this->onSubdomainChange->validate($subdomain, $context);
  58. }
  59. public function testValidateMaxReached(): void
  60. {
  61. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  62. $context->method('isPostRequest')->willReturn(true);
  63. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  64. $organization->expects(self::once())->method('getSubdomains')->willReturn(new \Doctrine\Common\Collections\ArrayCollection([1,2,3]));
  65. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  66. $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization);
  67. try {
  68. $this->onSubdomainChange->validate($subdomain, $context);
  69. throw new \AssertionError('A validation error should have been thrown');
  70. } catch (\RuntimeException) {}
  71. }
  72. public function testOnChangeNoChange(): void
  73. {
  74. $onChange = $this
  75. ->getMockBuilder(OnSubdomainChange::class)
  76. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  77. ->disableOriginalConstructor()
  78. ->getMock();
  79. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  80. $this->entityManager->expects(self::never())->method('flush');
  81. $this->messageBus->expects(self::never())->method('dispatch');
  82. $onChange->expects(self::never())->method('sendEmailAfterSubdomainChange');
  83. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  84. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  85. $onChange->onChange($subdomain, $context);
  86. }
  87. public function testOnChangeActivated(): void {
  88. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  89. $this->entityManager->expects(self::once())->method('flush');
  90. $this->messageBus
  91. ->expects(self::once())
  92. ->method('dispatch')
  93. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  94. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  95. $onChange = $this
  96. ->getMockBuilder(OnSubdomainChange::class)
  97. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  98. ->setConstructorArgs(
  99. [$this->organizationUtils, $this->accessUtils, $this->mailHub, $this->bindFileService, $this->messageBus, $this->entityManager]
  100. )
  101. ->getMock();
  102. $onChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  103. // Le sous-domaine qu'on vient d'activer
  104. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  105. $subdomain->method('isActive')->willReturn(true);
  106. // Son état précédent
  107. $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  108. $previousData->method('isActive')->willReturn(false);
  109. // Le sous domaine qui était actif jusqu'ici, et que le OnChange devrait désactiver
  110. $otherSubdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  111. $otherSubdomain->method('isActive')->willReturn(true);
  112. $otherSubdomain->expects(self::once())->method('setActive')->with(false);
  113. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  114. $organization->method('getId')->willReturn(1);
  115. $organization->expects(self::once())->method('getSubdomains')->willReturn(new \Doctrine\Common\Collections\ArrayCollection([$subdomain, $otherSubdomain]));
  116. $subdomain->expects(self::exactly(2))->method('getOrganization')->willReturn($organization);
  117. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  118. $context->method('previousData')->willReturn($previousData);
  119. $context->method('isPutRequest')->willReturn(true);
  120. $context->method('isPostRequest')->willReturn(false);
  121. $onChange->onChange($subdomain, $context);
  122. }
  123. public function testOnChangeCreated(): void {
  124. $this->bindFileService->expects(self::once())->method('registerSubdomain');
  125. $this->entityManager->expects(self::once())->method('flush');
  126. $this->messageBus
  127. ->expects(self::once())
  128. ->method('dispatch')
  129. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  130. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  131. $onChange = $this
  132. ->getMockBuilder(OnSubdomainChange::class)
  133. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  134. ->setConstructorArgs(
  135. [$this->organizationUtils, $this->accessUtils, $this->mailHub, $this->bindFileService, $this->messageBus, $this->entityManager]
  136. )
  137. ->getMock();
  138. $onChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  139. // Le sous-domaine qu'on vient d'activer
  140. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  141. $subdomain->method('isActive')->willReturn(true);
  142. // Le sous domaine qui était actif jusqu'ici, et que le OnChange devrait désactiver
  143. $otherSubdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  144. $otherSubdomain->method('isActive')->willReturn(true);
  145. $otherSubdomain->expects(self::once())->method('setActive')->with(false);
  146. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  147. $organization->method('getId')->willReturn(1);
  148. $organization->expects(self::once())->method('getSubdomains')->willReturn(new \Doctrine\Common\Collections\ArrayCollection([$subdomain, $otherSubdomain]));
  149. $subdomain->expects(self::exactly(2))->method('getOrganization')->willReturn($organization);
  150. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  151. $context->method('previousData')->willReturn(null);
  152. $context->method('isPutRequest')->willReturn(false);
  153. $context->method('isPostRequest')->willReturn(true);
  154. $onChange->onChange($subdomain, $context);
  155. }
  156. public function testSendEmailAfterSubdomainChange(): void {
  157. $admin = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  158. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  159. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  160. $subdomain->expects(self::once())->method('getSubdomain')->willReturn('mysubdomain');
  161. $subdomain->expects(self::exactly(3))->method('getOrganization')->willReturn($organization);
  162. $this->accessUtils->expects(self::once())->method('findAdminFor')->with($organization)->willReturn($admin);
  163. $this->organizationUtils
  164. ->expects(self::once())
  165. ->method('getOrganizationWebsite')
  166. ->with($organization)
  167. ->willReturn('mysubdomain.opentalent.fr');
  168. $this->mailHub
  169. ->expects(self::once())
  170. ->method('sendAutomaticEmailToAdmin')
  171. ->with(
  172. $organization,
  173. 'Nouveau sous domaine: mysubdomain',
  174. 'subdomain',
  175. [
  176. 'access' => $admin,
  177. 'subdomain' => $subdomain,
  178. 'url' => 'mysubdomain.opentalent.fr'
  179. ]
  180. );
  181. $this->onSubdomainChange->sendEmailAfterSubdomainChange($subdomain);
  182. }
  183. }