OnSubdomainChangeTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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\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\TestCase;
  16. use Symfony\Component\Messenger\Envelope;
  17. use Symfony\Component\Messenger\MessageBusInterface;
  18. class OnSubdomainChangeTest extends TestCase
  19. {
  20. private OrganizationUtils $organizationUtils;
  21. private AccessUtils $accessUtils;
  22. private MailHub $mailHub;
  23. private BindFileService $bindFileService;
  24. private MessageBusInterface $messageBus;
  25. private OnSubdomainChange $onSubdomainChange;
  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. $this->onSubdomainChange = new OnSubdomainChange(
  34. $this->organizationUtils,
  35. $this->accessUtils,
  36. $this->mailHub,
  37. $this->bindFileService,
  38. $this->messageBus
  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 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 ArrayCollection([1,2,3]));
  65. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  66. $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization);
  67. $this->expectException(\RuntimeException::class);
  68. $this->onSubdomainChange->validate($subdomain, $context);
  69. }
  70. public function testBeforeChangeActivated() {
  71. // Le sous-domaine qu'on vient d'activer
  72. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  73. $subdomain->method('isActive')->willReturn(true);
  74. // Son état précédent
  75. $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  76. $previousData->method('isActive')->willReturn(false);
  77. // Le sous domaine qui était actif jusqu'ici, et que le OnChange devrait désactiver
  78. $otherSubdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  79. $otherSubdomain->method('isActive')->willReturn(true);
  80. $otherSubdomain->expects(self::once())->method('setActive')->with(false);
  81. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  82. $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([$subdomain, $otherSubdomain]));
  83. $subdomain->method('getOrganization')->willReturn($organization);
  84. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  85. $context->method('previousData')->willReturn($previousData);
  86. $context->method('isPutRequest')->willReturn(true);
  87. $context->method('isPostRequest')->willReturn(false);
  88. $this->onSubdomainChange->beforeChange($subdomain, $context);
  89. }
  90. public function testOnChangeNoChange(): void
  91. {
  92. $onChange = $this
  93. ->getMockBuilder(OnSubdomainChange::class)
  94. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  95. ->disableOriginalConstructor()
  96. ->getMock();
  97. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  98. $this->messageBus->expects(self::never())->method('dispatch');
  99. $onChange->expects(self::never())->method('sendEmailAfterSubdomainChange');
  100. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  101. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  102. $onChange->onChange($subdomain, $context);
  103. }
  104. public function testOnChangeActivated(): void {
  105. $this->bindFileService->expects(self::never())->method('registerSubdomain');
  106. $this->messageBus
  107. ->expects(self::once())
  108. ->method('dispatch')
  109. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  110. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  111. $onChange = $this
  112. ->getMockBuilder(OnSubdomainChange::class)
  113. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  114. ->setConstructorArgs(
  115. [$this->organizationUtils, $this->accessUtils, $this->mailHub, $this->bindFileService, $this->messageBus]
  116. )
  117. ->getMock();
  118. $onChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  119. // Le sous-domaine qu'on vient d'activer
  120. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  121. $subdomain->method('isActive')->willReturn(true);
  122. // Son état précédent
  123. $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  124. $previousData->method('isActive')->willReturn(false);
  125. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  126. $organization->method('getId')->willReturn(1);
  127. $subdomain->method('getOrganization')->willReturn($organization);
  128. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  129. $context->method('previousData')->willReturn($previousData);
  130. $context->method('isPutRequest')->willReturn(true);
  131. $context->method('isPostRequest')->willReturn(false);
  132. $onChange->onChange($subdomain, $context);
  133. }
  134. public function testOnChangeCreated(): void {
  135. $this->bindFileService->expects(self::once())->method('registerSubdomain');
  136. $this->messageBus
  137. ->expects(self::once())
  138. ->method('dispatch')
  139. ->with(self::isInstanceOf(Typo3UpdateCommand::class))
  140. ->willReturn(new Envelope(new Typo3UpdateCommand(1)));
  141. $onChange = $this
  142. ->getMockBuilder(OnSubdomainChange::class)
  143. ->onlyMethods(['sendEmailAfterSubdomainChange'])
  144. ->setConstructorArgs(
  145. [$this->organizationUtils, $this->accessUtils, $this->mailHub, $this->bindFileService, $this->messageBus]
  146. )
  147. ->getMock();
  148. $onChange->expects(self::once())->method('sendEmailAfterSubdomainChange');
  149. // Le sous-domaine qu'on vient d'activer
  150. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  151. $subdomain->method('isActive')->willReturn(true);
  152. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  153. $organization->method('getId')->willReturn(1);
  154. $subdomain->method('getOrganization')->willReturn($organization);
  155. $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock();
  156. $context->method('previousData')->willReturn(null);
  157. $context->method('isPutRequest')->willReturn(false);
  158. $context->method('isPostRequest')->willReturn(true);
  159. $onChange->onChange($subdomain, $context);
  160. }
  161. public function testSendEmailAfterSubdomainChange(): void {
  162. $admin = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  163. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  164. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  165. $subdomain->expects(self::once())->method('getSubdomain')->willReturn('mysubdomain');
  166. $subdomain->expects(self::exactly(3))->method('getOrganization')->willReturn($organization);
  167. $this->accessUtils->expects(self::once())->method('findAdminFor')->with($organization)->willReturn($admin);
  168. $this->organizationUtils
  169. ->expects(self::once())
  170. ->method('getOrganizationWebsite')
  171. ->with($organization)
  172. ->willReturn('mysubdomain.opentalent.fr');
  173. $this->mailHub
  174. ->expects(self::once())
  175. ->method('sendAutomaticEmailToAdmin')
  176. ->with(
  177. $organization,
  178. 'Nouveau sous domaine: mysubdomain',
  179. 'subdomain',
  180. [
  181. 'access' => $admin,
  182. 'subdomain' => $subdomain,
  183. 'url' => 'mysubdomain.opentalent.fr'
  184. ]
  185. );
  186. $this->onSubdomainChange->sendEmailAfterSubdomainChange($subdomain);
  187. }
  188. }