OnSubdomainChangeMailBuilderTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Service\Mailer\Builder;
  4. use App\Entity\Access\Access;
  5. use App\Entity\Organization\Organization;
  6. use App\Entity\Organization\Subdomain;
  7. use App\Repository\Organization\OrganizationRepository;
  8. use App\Repository\Organization\SubdomainRepository;
  9. use App\Service\Access\Utils as AccessUtils;
  10. use App\Service\Mailer\Builder\OnSubdomainChangeMailBuilder;
  11. use App\Service\Mailer\Email;
  12. use App\Service\Mailer\Mailer;
  13. use App\Service\Mailer\Model\SubdomainChangeModel;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use PHPUnit\Framework\MockObject\MockObject;
  16. use PHPUnit\Framework\TestCase;
  17. /**
  18. * Classe OnSubdomainChangeMailBuilderTest qui test le service SubDomainChangeBuilder.
  19. */
  20. class OnSubdomainChangeMailBuilderTest extends TestCase
  21. {
  22. private MockObject|EntityManagerInterface $entityManager;
  23. private string $opentalentNoReplyEmailAddress = 'no-reply@opentalent.fr';
  24. private MockObject|AccessUtils $accessUtils;
  25. public function setUp(): void
  26. {
  27. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  28. $this->accessUtils = $this->getMockBuilder(AccessUtils::class)->disableOriginalConstructor()->getMock();
  29. }
  30. /**
  31. * subDomainChangeBuilder mock maker.
  32. *
  33. * @return Mailer|MockObject
  34. */
  35. private function makeSubDomainChangeBuilderMock(string $methodUnderTest): OnSubdomainChangeMailBuilder|MockObject
  36. {
  37. return $this->getMockBuilder(OnSubdomainChangeMailBuilder::class)
  38. ->setConstructorArgs([
  39. $this->entityManager,
  40. $this->opentalentNoReplyEmailAddress,
  41. $this->accessUtils,
  42. ])
  43. ->setMethodsExcept([$methodUnderTest])
  44. ->getMock();
  45. }
  46. /**
  47. * @see OnSubdomainChangeMailBuilder::build()
  48. */
  49. public function testBuild()
  50. {
  51. $subdomainId = 123;
  52. $organizationId = 444;
  53. $authorId = 333;
  54. $subDomainChangeBuilder = $this->makeSubDomainChangeBuilderMock('build');
  55. $subdomain = $this->getMockBuilder(Subdomain::class)->disableOriginalConstructor()->getMock();
  56. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  57. $organization->method('getName')->willReturn('Mon organisation');
  58. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  59. $mailerModel = $this->getMockBuilder(SubdomainChangeModel::class)->disableOriginalConstructor()->getMock();
  60. $mailerModel->method('getSubdomainId')->willReturn($subdomainId);
  61. $mailerModel->method('getOrganizationId')->willReturn($organizationId);
  62. $mailerModel->method('getAuthorId')->willReturn($authorId);
  63. $subdomainRepository = $this->getMockBuilder(SubdomainRepository::class)->disableOriginalConstructor()->getMock();
  64. $subdomainRepository->expects(self::once())->method('find')->with($subdomainId)->willReturn($subdomain);
  65. $organizationRepository = $this->getMockBuilder(OrganizationRepository::class)->disableOriginalConstructor()->getMock();
  66. $organizationRepository->expects(self::once())->method('find')->with($organizationId)->willReturn($organization);
  67. $this->entityManager
  68. ->expects(self::exactly(2))
  69. ->method('getRepository')
  70. ->withConsecutive([Subdomain::class], [Organization::class])
  71. ->willReturnOnConsecutiveCalls($subdomainRepository, $organizationRepository)
  72. ;
  73. $this->accessUtils
  74. ->expects(self::once())
  75. ->method('findAdminFor')
  76. ->with($organization)
  77. ->willReturn($access)
  78. ;
  79. $context = [
  80. 'access' => $access,
  81. 'organization' => $organization,
  82. 'subdomain' => $subdomain,
  83. 'url' => $mailerModel->getUrl(),
  84. ];
  85. $content = 'contenu';
  86. $subDomainChangeBuilder
  87. ->expects(self::once())
  88. ->method('render')
  89. ->with('subdomain', $context)
  90. ->willReturn($content)
  91. ;
  92. $emailsCollection = $subDomainChangeBuilder->build($mailerModel);
  93. $this->assertCount(1, $emailsCollection);
  94. $email = $emailsCollection->first();
  95. $this->assertInstanceOf(Email::class, $email);
  96. $this->assertEquals('contenu', $email->getContent());
  97. $this->assertEquals($this->opentalentNoReplyEmailAddress, $email->getFrom());
  98. $this->assertEquals($organization->getName(), $email->getFromName());
  99. }
  100. }