Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace MauticPlugin\GrapesJsBuilderBundle\Tests\Unit\Model; | |
| use Doctrine\ORM\EntityManager; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\EmailBundle\Entity\Email; | |
| use Mautic\EmailBundle\Entity\EmailRepository; | |
| use Mautic\EmailBundle\Model\EmailModel; | |
| use MauticPlugin\GrapesJsBuilderBundle\Entity\GrapesJsBuilder; | |
| use MauticPlugin\GrapesJsBuilderBundle\Entity\GrapesJsBuilderRepository; | |
| use MauticPlugin\GrapesJsBuilderBundle\Model\GrapesJsBuilderModel; | |
| use PHPUnit\Framework\Assert; | |
| use Psr\Log\LoggerInterface; | |
| use Symfony\Bundle\FrameworkBundle\Routing\Router; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| class GrapesJsBuilderModelTest extends \PHPUnit\Framework\TestCase | |
| { | |
| public function testAddOrEditEntityWithoutMatchingEntityAndNoRequestQuery(): void | |
| { | |
| $requestStack = new class() extends RequestStack { | |
| public function __construct() | |
| { | |
| } | |
| public function getCurrentRequest() | |
| { | |
| return new Request(); | |
| } | |
| }; | |
| $emailRepository = new class() extends EmailRepository { | |
| public int $saveEntityCallCount = 0; | |
| public function __construct() | |
| { | |
| } | |
| public function saveEntity($entity, $flush = true): void | |
| { | |
| ++$this->saveEntityCallCount; | |
| } | |
| }; | |
| $emailModel = $this->getEmailModel($emailRepository); | |
| $grapesJsBuilderRepository = new class() extends GrapesJsBuilderRepository { | |
| public int $saveEntityCallCount = 0; | |
| public function __construct() | |
| { | |
| } | |
| public function findOneBy(array $criteria, ?array $orderBy = null) | |
| { | |
| return null; | |
| } | |
| public function saveEntity($entity, $flush = true): void | |
| { | |
| ++$this->saveEntityCallCount; | |
| } | |
| }; | |
| $entityManager = new class($grapesJsBuilderRepository) extends EntityManager { | |
| public function __construct( | |
| private GrapesJsBuilderRepository $grapesJsBuilderRepository | |
| ) { | |
| } | |
| public function getRepository($entityName) | |
| { | |
| Assert::assertSame(GrapesJsBuilder::class, $entityName); | |
| return $this->grapesJsBuilderRepository; // @phpstan-ignore-line | |
| } | |
| }; | |
| $email = new Email(); | |
| $grapeJsBuilderModel = new GrapesJsBuilderModel( | |
| $requestStack, | |
| $emailModel, | |
| $entityManager, | |
| $this->createMock(CorePermissions::class), | |
| $this->createMock(EventDispatcherInterface::class), | |
| $this->createMock(Router::class), | |
| $this->getTranslator(), | |
| $this->createMock(UserHelper::class), | |
| $this->createMock(LoggerInterface::class), | |
| $this->createMock(CoreParametersHelper::class) | |
| ); | |
| $grapeJsBuilderModel->addOrEditEntity($email); | |
| // Not a GrapeJs email, so we are not saving anything. | |
| Assert::assertSame(0, $grapesJsBuilderRepository->saveEntityCallCount); | |
| Assert::assertSame(0, $emailRepository->saveEntityCallCount); | |
| } | |
| public function testAddOrEditEntityWithoutMatchingEntityAndGrapeRequestQuery(): void | |
| { | |
| $requestStack = new class() extends RequestStack { | |
| public function __construct() | |
| { | |
| } | |
| public function getCurrentRequest() | |
| { | |
| return new Request( | |
| [], | |
| [ | |
| 'grapesjsbuilder' => [ | |
| 'customMjml' => '</mjml>', | |
| ], | |
| 'emailform' => [ | |
| 'customHtml' => '</html>', | |
| ], | |
| ] | |
| ); | |
| } | |
| }; | |
| $emailRepository = new class() extends EmailRepository { | |
| public int $saveEntityCallCount = 0; | |
| public function __construct() | |
| { | |
| } | |
| /** | |
| * @param Email $entity | |
| */ | |
| public function saveEntity($entity, $flush = true): void | |
| { | |
| ++$this->saveEntityCallCount; | |
| Assert::assertSame('</html>', $entity->getCustomHtml()); | |
| } | |
| }; | |
| $emailModel = $this->getEmailModel($emailRepository); | |
| $grapesJsBuilderRepository = new class() extends GrapesJsBuilderRepository { | |
| public int $saveEntityCallCount = 0; | |
| public function __construct() | |
| { | |
| } | |
| public function findOneBy(array $criteria, ?array $orderBy = null) | |
| { | |
| return null; | |
| } | |
| /** | |
| * @param GrapesJsBuilder $entity | |
| */ | |
| public function saveEntity($entity, $flush = true): void | |
| { | |
| ++$this->saveEntityCallCount; | |
| Assert::assertSame('</mjml>', $entity->getCustomMjml()); | |
| } | |
| }; | |
| $entityManager = new class($grapesJsBuilderRepository) extends EntityManager { | |
| public function __construct( | |
| private GrapesJsBuilderRepository $grapesJsBuilderRepository | |
| ) { | |
| } | |
| public function getRepository($entityName) | |
| { | |
| Assert::assertSame(GrapesJsBuilder::class, $entityName); | |
| return $this->grapesJsBuilderRepository; // @phpstan-ignore-line | |
| } | |
| }; | |
| $email = new Email(); | |
| $grapeJsBuilderModel = new GrapesJsBuilderModel( | |
| $requestStack, | |
| $emailModel, | |
| $entityManager, | |
| $this->createMock(CorePermissions::class), | |
| $this->createMock(EventDispatcherInterface::class), | |
| $this->createMock(Router::class), | |
| $this->getTranslator(), | |
| $this->createMock(UserHelper::class), | |
| $this->createMock(LoggerInterface::class), | |
| $this->createMock(CoreParametersHelper::class) | |
| ); | |
| $grapeJsBuilderModel->addOrEditEntity($email); | |
| // Saving the entities now. | |
| Assert::assertSame(1, $grapesJsBuilderRepository->saveEntityCallCount); | |
| Assert::assertSame(1, $emailRepository->saveEntityCallCount); | |
| } | |
| private function getEmailModel(EmailRepository $emailRepository): EmailModel | |
| { | |
| return new class($emailRepository) extends EmailModel { | |
| public function __construct( | |
| private EmailRepository $emailRepository | |
| ) { | |
| } | |
| public function getRepository() | |
| { | |
| return $this->emailRepository; | |
| } | |
| }; | |
| } | |
| private function getTranslator(): Translator | |
| { | |
| return new class() extends Translator { | |
| public function __construct() | |
| { | |
| } | |
| }; | |
| } | |
| } | |