Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\PointBundle\Tests\Unit\Model; | |
| use Doctrine\ORM\EntityManager; | |
| use Mautic\CoreBundle\Factory\MauticFactory; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\IpLookupHelper; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\EmailBundle\EmailEvents; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use Mautic\LeadBundle\Model\LeadModel; | |
| use Mautic\LeadBundle\Tracker\ContactTracker; | |
| use Mautic\PointBundle\Entity\TriggerEvent; | |
| use Mautic\PointBundle\Entity\TriggerEventRepository; | |
| use Mautic\PointBundle\Event\TriggerBuilderEvent; | |
| use Mautic\PointBundle\Event\TriggerExecutedEvent; | |
| use Mautic\PointBundle\Model\TriggerEventModel; | |
| use Mautic\PointBundle\Model\TriggerModel; | |
| use Mautic\PointBundle\PointEvents; | |
| use PHPUnit\Framework\MockObject\MockObject; | |
| use Psr\Log\LoggerInterface; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
| use Symfony\Contracts\Translation\TranslatorInterface; | |
| class TriggerModelTest extends \PHPUnit\Framework\TestCase | |
| { | |
| /** | |
| * @var IpLookupHelper|MockObject | |
| */ | |
| private MockObject $ipLookupHelper; | |
| /** | |
| * @var LeadModel|MockObject | |
| */ | |
| private MockObject $leadModel; | |
| /** | |
| * @var TriggerEventModel|MockObject | |
| */ | |
| private MockObject $triggerEventModel; | |
| /** | |
| * @var MauticFactory|MockObject | |
| */ | |
| private MockObject $mauticFactory; | |
| /** | |
| * @var EventDispatcherInterface|MockObject | |
| */ | |
| private MockObject $dispatcher; | |
| /** | |
| * @var TranslatorInterface|MockObject | |
| */ | |
| private MockObject $translator; | |
| /** | |
| * @var EntityManager|MockObject | |
| */ | |
| private MockObject $entityManager; | |
| /** | |
| * @var TriggerEventRepository|MockObject | |
| */ | |
| private MockObject $triggerEventRepository; | |
| private TriggerModel $triggerModel; | |
| /** | |
| * @var ContactTracker | |
| */ | |
| private MockObject $contactTracker; | |
| public function setUp(): void | |
| { | |
| parent::setUp(); | |
| $this->ipLookupHelper = $this->createMock(IpLookupHelper::class); | |
| $this->leadModel = $this->createMock(LeadModel::class); | |
| $this->triggerEventModel = $this->createMock(TriggerEventModel::class); | |
| $this->mauticFactory = $this->createMock(MauticFactory::class); | |
| $this->contactTracker = $this->createMock(ContactTracker::class); | |
| $this->dispatcher = $this->createMock(EventDispatcherInterface::class); | |
| $this->translator = $this->createMock(Translator::class); | |
| $this->entityManager = $this->createMock(EntityManager::class); | |
| $this->triggerEventRepository = $this->createMock(TriggerEventRepository::class); | |
| $this->triggerModel = new TriggerModel( | |
| $this->ipLookupHelper, | |
| $this->leadModel, | |
| $this->triggerEventModel, | |
| $this->mauticFactory, | |
| $this->contactTracker, | |
| $this->entityManager, | |
| $this->createMock(CorePermissions::class), | |
| $this->dispatcher, | |
| $this->createMock(UrlGeneratorInterface::class), | |
| $this->translator, | |
| $this->createMock(UserHelper::class), | |
| $this->createMock(LoggerInterface::class), | |
| $this->createMock(CoreParametersHelper::class) | |
| ); | |
| // reset private static property events in TriggerModel | |
| $reflectionClass = new \ReflectionClass(TriggerModel::class); | |
| $property = $reflectionClass->getProperty('events'); | |
| $property->setAccessible(true); | |
| $property->setValue(null, []); | |
| } | |
| public function testTriggerEvent(): void | |
| { | |
| $triggerEvent = new TriggerEvent(); | |
| $contact = new Lead(); | |
| $triggerEvent->setType('email.send_to_user'); | |
| $this->entityManager->expects($this->once()) | |
| ->method('getRepository') | |
| ->willReturn($this->triggerEventRepository); | |
| $this->triggerEventRepository->expects($this->once()) | |
| ->method('find') | |
| ->willReturn($triggerEvent); | |
| $this->dispatcher->expects($this->exactly(2)) | |
| ->method('dispatch') | |
| ->withConsecutive( | |
| [ | |
| $this->callback( | |
| // Emulate a subscriber: | |
| function (TriggerBuilderEvent $event) { | |
| // PHPUNIT calls this callback twice for unknown reason. We need to set it only once. | |
| if (array_key_exists('email.send_to_user', $event->getEvents())) { | |
| return true; | |
| } | |
| $event->addEvent( | |
| 'email.send_to_user', | |
| [ | |
| 'group' => 'mautic.email.point.trigger', | |
| 'label' => 'mautic.email.point.trigger.send_email_to_user', | |
| 'formType' => \Mautic\EmailBundle\Form\Type\EmailToUserType::class, | |
| 'formTypeOptions' => ['update_select' => 'pointtriggerevent_properties_useremail_email'], | |
| 'formTheme' => 'MauticEmailBundle:FormTheme\EmailSendList', | |
| 'eventName' => EmailEvents::ON_SENT_EMAIL_TO_USER, | |
| ] | |
| ); | |
| return true; | |
| } | |
| ), | |
| PointEvents::TRIGGER_ON_BUILD, | |
| ], | |
| // Ensure the event is triggered if the point trigger event has 'eventName' defined instead of 'callback'. | |
| [ | |
| $this->callback( | |
| function (TriggerExecutedEvent $event) use ($contact, $triggerEvent) { | |
| $this->assertSame($contact, $event->getLead()); | |
| $this->assertSame($triggerEvent, $event->getTriggerEvent()); | |
| return true; | |
| } | |
| ), | |
| EmailEvents::ON_SENT_EMAIL_TO_USER, | |
| ] | |
| ); | |
| $this->triggerModel->triggerEvent($triggerEvent->convertToArray(), $contact, true); | |
| } | |
| } | |