organizationUtils = $this->getMockBuilder(OrganizationUtils::class)->disableOriginalConstructor()->getMock(); $this->accessUtils = $this->getMockBuilder(AccessUtils::class)->disableOriginalConstructor()->getMock(); $this->mailHub = $this->getMockBuilder(MailHub::class)->disableOriginalConstructor()->getMock(); $this->bindFileService = $this->getMockBuilder(BindFileService::class)->disableOriginalConstructor()->getMock(); $this->messageBus = $this->getMockBuilder(MessageBusInterface::class)->disableOriginalConstructor()->getMock(); } private function makeOnSubdomainChangeMock(string $methodName): MockObject | OnSubdomainChange { return $this->getMockBuilder(OnSubdomainChange::class) ->setConstructorArgs([$this->organizationUtils, $this->accessUtils, $this->mailHub, $this->bindFileService, $this->messageBus]) ->setMethodsExcept([$methodName]) ->getMock(); } /** * @see OnSubdomainChange::validate() */ public function testValidateIsOk(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate'); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('isPostRequest')->willReturn(true); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([1,2])); $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization); $onSubdomainChange->validate($subdomain, $context); } /** * @see OnSubdomainChange::validate() */ public function testValidateIsPutRequest(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate'); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('isPostRequest')->willReturn(false); $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->expects(self::never())->method('getOrganization'); $onSubdomainChange->validate($subdomain, $context); } /** * @see OnSubdomainChange::validate() */ public function testValidateMaxReached(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('validate'); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('isPostRequest')->willReturn(true); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([1,2,3])); $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->expects(self::once())->method('getOrganization')->willReturn($organization); $this->expectException(\RuntimeException::class); $onSubdomainChange->validate($subdomain, $context); } /** * @see OnSubdomainChange::beforeChange() */ public function testBeforeChangeActivated(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('beforeChange'); // Le sous-domaine qu'on vient d'activer $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->method('isActive')->willReturn(true); // Son état précédent $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $previousData->method('isActive')->willReturn(false); // Le sous domaine qui était actif jusqu'ici, et que le OnChange devrait désactiver $otherSubdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $otherSubdomain->method('isActive')->willReturn(true); $otherSubdomain->expects(self::once())->method('setActive')->with(false); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $organization->expects(self::once())->method('getSubdomains')->willReturn(new ArrayCollection([$subdomain, $otherSubdomain])); $subdomain->method('getOrganization')->willReturn($organization); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('previousData')->willReturn($previousData); $context->method('isPutRequest')->willReturn(true); $context->method('isPostRequest')->willReturn(false); $onSubdomainChange->beforeChange($subdomain, $context); } /** * @see OnSubdomainChange::onChange() */ public function testOnChangeNoChange(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange'); $this->bindFileService->expects(self::never())->method('registerSubdomain'); $this->messageBus->expects(self::never())->method('dispatch'); $onSubdomainChange->expects(self::never())->method('sendEmailAfterSubdomainChange'); $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $onSubdomainChange->onChange($subdomain, $context); } /** * @see OnSubdomainChange::onChange() */ public function testOnChangeActivated(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange'); $this->bindFileService->expects(self::never())->method('registerSubdomain'); $this->messageBus ->expects(self::once()) ->method('dispatch') ->with(self::isInstanceOf(Typo3UpdateCommand::class)) ->willReturn(new Envelope(new Typo3UpdateCommand(1))); $onSubdomainChange->expects(self::once())->method('sendEmailAfterSubdomainChange'); // Le sous-domaine qu'on vient d'activer $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->method('isActive')->willReturn(true); // Son état précédent $previousData = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $previousData->method('isActive')->willReturn(false); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $organization->method('getId')->willReturn(1); $subdomain->method('getOrganization')->willReturn($organization); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('previousData')->willReturn($previousData); $context->method('isPutRequest')->willReturn(true); $context->method('isPostRequest')->willReturn(false); $onSubdomainChange->onChange($subdomain, $context); } /** * @see OnSubdomainChange::onChange() */ public function testOnChangeCreated(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('onChange'); $this->bindFileService->expects(self::once())->method('registerSubdomain'); $this->messageBus ->expects(self::once()) ->method('dispatch') ->with(self::isInstanceOf(Typo3UpdateCommand::class)) ->willReturn(new Envelope(new Typo3UpdateCommand(1))); $onSubdomainChange->expects(self::once())->method('sendEmailAfterSubdomainChange'); // Le sous-domaine qu'on vient d'activer $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->method('isActive')->willReturn(true); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $organization->method('getId')->willReturn(1); $subdomain->method('getOrganization')->willReturn($organization); $context = $this->getMockBuilder(OnChangeContext::class)->disableOriginalConstructor()->getMock(); $context->method('previousData')->willReturn(null); $context->method('isPutRequest')->willReturn(false); $context->method('isPostRequest')->willReturn(true); $onSubdomainChange->onChange($subdomain, $context); } /** * @see OnSubdomainChange::sendEmailAfterSubdomainChange() */ public function testSendEmailAfterSubdomainChange(): void { $onSubdomainChange = $this->makeOnSubdomainChangeMock('sendEmailAfterSubdomainChange'); $admin = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock(); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock(); $subdomain->expects(self::once())->method('getSubdomain')->willReturn('mysubdomain'); $subdomain->expects(self::exactly(3))->method('getOrganization')->willReturn($organization); $this->accessUtils->expects(self::once())->method('findAdminFor')->with($organization)->willReturn($admin); $this->organizationUtils ->expects(self::once()) ->method('getOrganizationWebsite') ->with($organization) ->willReturn('mysubdomain.opentalent.fr'); $this->mailHub ->expects(self::once()) ->method('sendAutomaticEmailToAdmin') ->with( $organization, 'Nouveau sous domaine: mysubdomain', 'subdomain', [ 'access' => $admin, 'subdomain' => $subdomain, 'url' => 'mysubdomain.opentalent.fr' ] ); $onSubdomainChange->sendEmailAfterSubdomainChange($subdomain); } }