OnSubdomainChangeMailBuilderTest.php 4.8 KB

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