OnSubdomainChangeTest.php 11 KB

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