Issues (3627)

PointBundle/Tests/Unit/Model/TriggerModelTest.php (1 issue)

1
<?php
2
/*
3
 * @copyright   2020 Mautic, Inc. All rights reserved
4
 * @author      Mautic, Inc.
5
 *
6
 * @link        https://mautic.org
7
 *
8
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
9
 */
10
11
namespace Mautic\PointBundle\Tests\Unit\Model;
12
13
use Doctrine\ORM\EntityManager;
14
use Mautic\CoreBundle\Factory\MauticFactory;
15
use Mautic\CoreBundle\Helper\IpLookupHelper;
16
use Mautic\EmailBundle\EmailEvents;
17
use Mautic\LeadBundle\Entity\Lead;
18
use Mautic\LeadBundle\Model\LeadModel;
19
use Mautic\LeadBundle\Tracker\ContactTracker;
20
use Mautic\PointBundle\Entity\TriggerEvent;
21
use Mautic\PointBundle\Entity\TriggerEventRepository;
22
use Mautic\PointBundle\Event\TriggerBuilderEvent;
23
use Mautic\PointBundle\Event\TriggerExecutedEvent;
24
use Mautic\PointBundle\Model\TriggerEventModel;
25
use Mautic\PointBundle\Model\TriggerModel;
26
use Mautic\PointBundle\PointEvents;
27
use PHPUnit\Framework\MockObject\MockObject;
28
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
29
use Symfony\Component\Translation\TranslatorInterface;
30
31
class TriggerModelTest extends \PHPUnit\Framework\TestCase
32
{
33
    /**
34
     * @var IpLookupHelper|MockObject
35
     */
36
    private $ipLookupHelper;
37
38
    /**
39
     * @var LeadModel|MockObject
40
     */
41
    private $leadModel;
42
43
    /**
44
     * @var TriggerEventModel|MockObject
45
     */
46
    private $triggerEventModel;
47
48
    /**
49
     * @var MauticFactory|MockObject
50
     */
51
    private $mauticFactory;
52
53
    /**
54
     * @var EventDispatcherInterface|MockObject
55
     */
56
    private $dispatcher;
57
58
    /**
59
     * @var TranslatorInterface|MockObject
60
     */
61
    private $translator;
62
63
    /**
64
     * @var EntityManager|MockObject
65
     */
66
    private $entityManager;
67
68
    /**
69
     * @var TriggerEventRepository|MockObject
70
     */
71
    private $triggerEventRepository;
72
73
    /**
74
     * @var TriggerModel
75
     */
76
    private $triggerModel;
77
78
    /**
79
     * @var ContactTracker
80
     */
81
    private $contactTracker;
82
83
    public function setUp(): void
84
    {
85
        parent::setUp();
86
        $this->ipLookupHelper         = $this->createMock(IpLookupHelper::class);
87
        $this->leadModel              = $this->createMock(LeadModel::class);
88
        $this->triggerEventModel      = $this->createMock(TriggerEventModel::class);
89
        $this->mauticFactory          = $this->createMock(MauticFactory::class);
90
        $this->contactTracker         = $this->createMock(ContactTracker::class);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->createMock(Mautic...\ContactTracker::class) of type PHPUnit\Framework\MockObject\MockObject is incompatible with the declared type Mautic\LeadBundle\Tracker\ContactTracker of property $contactTracker.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
91
        $this->dispatcher             = $this->createMock(EventDispatcherInterface::class);
92
        $this->translator             = $this->createMock(TranslatorInterface::class);
93
        $this->entityManager          = $this->createMock(EntityManager::class);
94
        $this->triggerEventRepository = $this->createMock(TriggerEventRepository::class);
95
        $this->triggerModel           = new TriggerModel(
96
            $this->ipLookupHelper,
97
            $this->leadModel,
98
            $this->triggerEventModel,
99
            $this->mauticFactory,
100
            $this->contactTracker
101
        );
102
103
        $this->triggerModel->setDispatcher($this->dispatcher);
104
        $this->triggerModel->setTranslator($this->translator);
105
        $this->triggerModel->setEntityManager($this->entityManager);
106
    }
107
108
    public function testTriggerEvent()
109
    {
110
        $triggerEvent = new TriggerEvent();
111
        $contact      = new Lead();
112
113
        $triggerEvent->setType('email.send_to_user');
114
115
        $this->entityManager->expects($this->once())
116
            ->method('getRepository')
117
            ->willReturn($this->triggerEventRepository);
118
119
        $this->triggerEventRepository->expects($this->once())
120
            ->method('find')
121
            ->willReturn($triggerEvent);
122
123
        // Emulate a subscriber:
124
        $this->dispatcher->expects($this->at(0))
125
            ->method('dispatch')
126
            ->with(PointEvents::TRIGGER_ON_BUILD, $this->callback(function (TriggerBuilderEvent $event) {
127
                $event->addEvent(
128
                    'email.send_to_user',
129
                    [
130
                        'group'           => 'mautic.email.point.trigger',
131
                        'label'           => 'mautic.email.point.trigger.send_email_to_user',
132
                        'formType'        => \Mautic\EmailBundle\Form\Type\EmailToUserType::class,
133
                        'formTypeOptions' => ['update_select' => 'pointtriggerevent_properties_email'],
134
                        'formTheme'       => 'MauticEmailBundle:FormTheme\EmailSendList',
135
                        'eventName'       => EmailEvents::ON_SENT_EMAIL_TO_USER,
136
                    ]
137
                );
138
139
                return true;
140
            }));
141
142
        // Ensure the event is triggered if the point trigger event has 'eventName' defined instead of 'callback'.
143
        $this->dispatcher->expects($this->at(1))
144
            ->method('dispatch')
145
            ->with(EmailEvents::ON_SENT_EMAIL_TO_USER, $this->callback(function (TriggerExecutedEvent $event) use ($contact, $triggerEvent) {
146
                $this->assertSame($contact, $event->getLead());
147
                $this->assertSame($triggerEvent, $event->getTriggerEvent());
148
149
                return true;
150
            }));
151
152
        $this->triggerModel->triggerEvent($triggerEvent->convertToArray(), $contact, true);
153
    }
154
}
155