OrganizationFactoryTest.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Service\Organization;
  4. use App\ApiResources\Organization\OrganizationCreationRequest;
  5. use App\ApiResources\Organization\OrganizationMemberCreationRequest;
  6. use App\Entity\Access\Access;
  7. use App\Entity\Core\ContactPoint;
  8. use App\Entity\Network\NetworkOrganization;
  9. use App\Entity\Organization\Organization;
  10. use App\Entity\Organization\OrganizationAddressPostal;
  11. use App\Entity\Organization\Parameters;
  12. use App\Entity\Organization\Settings;
  13. use App\Entity\Organization\Subdomain;
  14. use App\Entity\Person\PersonAddressPostal;
  15. use App\Repository\Core\CountryRepository;
  16. use App\Repository\Organization\OrganizationRepository;
  17. use App\Repository\Person\PersonRepository;
  18. use App\Service\Dolibarr\DolibarrApiService;
  19. use App\Service\Organization\OrganizationFactory;
  20. use App\Service\Organization\Utils as OrganizationUtils;
  21. use App\Service\Typo3\BindFileService;
  22. use App\Service\Typo3\SubdomainService;
  23. use App\Service\Typo3\Typo3Service;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use PHPUnit\Framework\MockObject\MockObject;
  26. use PHPUnit\Framework\TestCase;
  27. use Psr\Log\LoggerInterface;
  28. class TestableOrganizationFactory extends OrganizationFactory {
  29. public function isExistingOrganization(OrganizationCreationRequest $organizationCreationRequest): bool
  30. {
  31. return parent::isExistingOrganization($organizationCreationRequest);
  32. }
  33. public function validateSubdomain(string $subdomainValue): void
  34. {
  35. parent::validateSubdomain($subdomainValue);
  36. }
  37. public function makeOrganizationWithRelations(
  38. OrganizationCreationRequest $organizationCreationRequest
  39. ): Organization {
  40. return parent::makeOrganizationWithRelations($organizationCreationRequest);
  41. }
  42. public function makeOrganization(OrganizationCreationRequest $organizationCreationRequest): Organization {
  43. return parent::makeOrganization($organizationCreationRequest);
  44. }
  45. public function makeParameters(OrganizationCreationRequest $organizationCreationRequest): Parameters {
  46. return parent::makeParameters($organizationCreationRequest);
  47. }
  48. public function makeSettings(OrganizationCreationRequest $organizationCreationRequest): Settings {
  49. return parent::makeSettings($organizationCreationRequest);
  50. }
  51. public function makePostalAddress(OrganizationCreationRequest $organizationCreationRequest): OrganizationAddressPostal {
  52. return parent::makePostalAddress($organizationCreationRequest);
  53. }
  54. public function makeContactPoint(OrganizationCreationRequest $organizationCreationRequest): ContactPoint {
  55. return parent::makeContactPoint($organizationCreationRequest);
  56. }
  57. public function makeNetworkOrganization(OrganizationCreationRequest $organizationCreationRequest): NetworkOrganization {
  58. return parent::makeNetworkOrganization($organizationCreationRequest);
  59. }
  60. public function makeAdminAccess(OrganizationCreationRequest $organizationCreationRequest): Access {
  61. return parent::makeAdminAccess($organizationCreationRequest);
  62. }
  63. public function makeCycles(): array {
  64. return parent::makeCycles();
  65. }
  66. public function makeAccess(int|OrganizationMemberCreationRequest $organizationMemberCreationRequest): Access {
  67. return parent::makeAccess($organizationMemberCreationRequest);
  68. }
  69. public function makeAccessPostalAddress(OrganizationMemberCreationRequest $organizationMemberCreationRequest): PersonAddressPostal {
  70. return parent::makeAccessPostalAddress($organizationMemberCreationRequest);
  71. }
  72. public function makeAccessContactPoint(OrganizationMemberCreationRequest $organizationMemberCreationRequest): ContactPoint {
  73. return parent::makeAccessContactPoint($organizationMemberCreationRequest);
  74. }
  75. public function makeSubdomain(OrganizationCreationRequest $organizationCreationRequest): Subdomain {
  76. return parent::makeSubdomain($organizationCreationRequest);
  77. }
  78. public function createTypo3Website(Organization $organization): ?int {
  79. return parent::createTypo3Website($organization);
  80. }
  81. }
  82. class OrganizationFactoryTest extends TestCase
  83. {
  84. private readonly SubdomainService $subdomainService;
  85. private readonly OrganizationRepository $organizationRepository;
  86. private readonly CountryRepository $countryRepository;
  87. private readonly OrganizationUtils $organizationUtils;
  88. private readonly Typo3Service $typo3Service;
  89. private readonly DolibarrApiService $dolibarrApiService;
  90. private readonly EntityManagerInterface $entityManager;
  91. private readonly PersonRepository $personRepository;
  92. private readonly BindFileService $bindFileService;
  93. private readonly LoggerInterface $logger;
  94. public function setUp(): void
  95. {
  96. $this->subdomainService = $this->getMockBuilder(SubdomainService::class)->disableOriginalConstructor()->getMock();
  97. $this->organizationRepository = $this->getMockBuilder(OrganizationRepository::class)->disableOriginalConstructor()->getMock();
  98. $this->countryRepository = $this->getMockBuilder(CountryRepository::class)->disableOriginalConstructor()->getMock();
  99. $this->organizationUtils = $this->getMockBuilder(OrganizationUtils::class)->disableOriginalConstructor()->getMock();
  100. $this->typo3Service = $this->getMockBuilder(Typo3Service::class)->disableOriginalConstructor()->getMock();
  101. $this->dolibarrApiService = $this->getMockBuilder(DolibarrApiService::class)->disableOriginalConstructor()->getMock();
  102. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  103. $this->personRepository = $this->getMockBuilder(PersonRepository::class)->disableOriginalConstructor()->getMock();
  104. $this->bindFileService = $this->getMockBuilder(BindFileService::class)->disableOriginalConstructor()->getMock();
  105. $this->logger = $this->getMockBuilder(LoggerInterface::class)->disableOriginalConstructor()->getMock();
  106. }
  107. private function getOrganizationFactoryMockFor(string $methodName): TestableOrganizationFactory | MockObject
  108. {
  109. $organizationFactory = $this
  110. ->getMockBuilder(TestableOrganizationFactory::class)
  111. ->setConstructorArgs(
  112. [
  113. $this->subdomainService,
  114. $this->organizationRepository,
  115. $this->countryRepository,
  116. $this->organizationUtils,
  117. $this->typo3Service,
  118. $this->dolibarrApiService,
  119. $this->entityManager,
  120. $this->personRepository,
  121. $this->bindFileService
  122. ])
  123. ->setMethodsExcept(['setLoggerInterface', $methodName])
  124. ->getMock();
  125. $organizationFactory->setLoggerInterface($this->logger);
  126. return $organizationFactory;
  127. }
  128. public function testCreate(): void {
  129. $organizationFactory = $this->getOrganizationFactoryMockFor('create');
  130. $organizationCreationRequest = $this->getMockBuilder(OrganizationCreationRequest::class)->getMock();
  131. $organizationCreationRequest->method('getName')->willReturn('foo');
  132. $organizationCreationRequest->method('getSubdomain')->willReturn('subdomain');
  133. $organizationCreationRequest->method('isClient')->willReturn(false);
  134. $organizationCreationRequest->method('getCreateWebsite')->willReturn(true);
  135. $this->entityManager->expects(self::once())->method('beginTransaction');
  136. $organizationFactory->expects(self::once())->method('isExistingOrganization')->willReturn(false);
  137. $organizationFactory->expects(self::once())->method('validateSubdomain')->with('subdomain');
  138. $organization = $this->getMockBuilder(Organization::class)->getMock();
  139. $organizationFactory
  140. ->expects(self::once())
  141. ->method('makeOrganizationWithRelations')
  142. ->with($organizationCreationRequest)
  143. ->willReturn($organization);
  144. $this->entityManager->expects(self::once())->method('persist')->with($organization);
  145. $this->entityManager->expects(self::once())->method('flush');
  146. $this->entityManager->expects(self::once())->method('commit');
  147. $this->dolibarrApiService
  148. ->expects(self::once())
  149. ->method('createSociety')
  150. ->with($organization, false)
  151. ->willReturn(456);
  152. $this->bindFileService
  153. ->expects(self::once())
  154. ->method('registerSubdomain')
  155. ->with('subdomain');
  156. $organizationFactory
  157. ->expects(self::once())
  158. ->method('createTypo3Website')
  159. ->with($organization);
  160. $this->logger
  161. ->method('info')
  162. ->withConsecutive(
  163. ["Start the creation of a new organization named 'foo'"],
  164. ["Subdomain is valid and available : 'subdomain'"],
  165. ["Organization created with all its relations"],
  166. ["New dolibarr structure created (uid : 456)"],
  167. ["Organization persisted in the DB"],
  168. ["Subdomain registered"],
  169. );
  170. $result = $organizationFactory->create($organizationCreationRequest);
  171. $this->assertEquals(
  172. $organization,
  173. $result
  174. );
  175. }
  176. }