Issues (3627)

Tests/EventListener/OwnerSubscriberTest.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2019 Mautic Contributors. All rights reserved
5
 * @author      Mautic, Inc.
6
 *
7
 * @link        https://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\LeadBundle\Tests\EventListener;
13
14
use Mautic\CoreBundle\Factory\MauticFactory;
15
use Mautic\CoreBundle\Translation\Translator;
16
use Mautic\EmailBundle\Event\EmailBuilderEvent;
17
use Mautic\EmailBundle\Event\EmailSendEvent;
18
use Mautic\EmailBundle\Helper\MailHelper;
19
use Mautic\EmailBundle\MonitoredEmail\Mailbox;
20
use Mautic\EmailBundle\Tests\Helper\Transport\SmtpTransport;
21
use Mautic\LeadBundle\Entity\LeadRepository;
22
use Mautic\LeadBundle\EventListener\OwnerSubscriber;
23
use Mautic\LeadBundle\Model\LeadModel;
24
use Monolog\Logger;
25
26
class OwnerSubscriberTest extends \PHPUnit\Framework\TestCase
27
{
28
    protected $contacts = [
29
        [
30
            'id'        => 1,
31
            'email'     => '[email protected]',
32
            'firstname' => 'Contact',
33
            'lastname'  => '1',
34
            'owner_id'  => 3,
35
        ],
36
        [
37
            'id'        => 2,
38
            'email'     => '[email protected]',
39
            'firstname' => 'Contact',
40
            'lastname'  => '2',
41
            'owner_id'  => 0,
42
        ],
43
        [
44
            'id'        => 3,
45
            'email'     => '[email protected]',
46
            'firstname' => 'Contact',
47
            'lastname'  => '3',
48
            'owner_id'  => 2,
49
        ],
50
        [
51
            'id'        => 4,
52
            'email'     => '[email protected]',
53
            'firstname' => 'Contact',
54
            'lastname'  => '4',
55
            'owner_id'  => 1,
56
        ],
57
        [
58
            'id'        => 5,
59
            'email'     => '[email protected]',
60
            'firstname' => 'Contact',
61
            'lastname'  => '5',
62
            'owner_id'  => null,
63
        ],
64
    ];
65
66
    public function setUp(): void
67
    {
68
        defined('MAUTIC_ENV') or define('MAUTIC_ENV', 'test');
69
    }
70
71
    public function testOnEmailBuild()
72
    {
73
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
74
        $event      = new EmailBuilderEvent($this->getMockTranslator());
75
        $subscriber->onEmailBuild($event);
76
77
        $tokens = $event->getTokens();
78
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
79
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
80
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
81
    }
82
83
    public function testOnEmailGenerate()
84
    {
85
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
86
87
        $mailer = $this->getMockMailer($this->contacts[0]);
88
        $event  = new EmailSendEvent($mailer);
89
        $subscriber->onEmailGenerate($event);
90
91
        $tokens = $event->getTokens();
92
93
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
94
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
95
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
96
97
        $this->assertEquals('[email protected]', $tokens['{ownerfield=email}']);
98
        $this->assertEquals('John', $tokens['{ownerfield=firstname}']);
99
        $this->assertEquals('S&#39;mith', $tokens['{ownerfield=lastname}']);
100
    }
101
102
    public function testOnEmailGenerateWithFakeOwner()
103
    {
104
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
105
106
        $mailer = $this->getMockMailer($this->contacts[1]);
107
        $event  = new EmailSendEvent($mailer);
108
        $subscriber->onEmailGenerate($event);
109
110
        $tokens = $event->getTokens();
111
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
112
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
113
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
114
    }
115
116
    public function testOnEmailGenerateWithNoOwner()
117
    {
118
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
119
120
        $mailer = $this->getMockMailer($this->contacts[4]);
121
        $event  = new EmailSendEvent($mailer);
122
        $subscriber->onEmailGenerate($event);
123
124
        $tokens = $event->getTokens();
125
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
126
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
127
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
128
129
        $this->assertEquals('', $tokens['{ownerfield=email}']);
130
        $this->assertEquals('', $tokens['{ownerfield=firstname}']);
131
        $this->assertEquals('', $tokens['{ownerfield=lastname}']);
132
    }
133
134
    public function testOnEmailDisplay()
135
    {
136
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
137
138
        $mailer = $this->getMockMailer($this->contacts[0]);
139
        $event  = new EmailSendEvent($mailer);
140
        $subscriber->onEmailDisplay($event);
141
142
        $tokens = $event->getTokens();
143
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
144
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
145
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
146
    }
147
148
    public function testOnEmailDisplayWithFakeOwner()
149
    {
150
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
151
152
        $mailer = $this->getMockMailer($this->contacts[1]);
153
        $event  = new EmailSendEvent($mailer);
154
        $subscriber->onEmailDisplay($event);
155
156
        $tokens = $event->getTokens();
157
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
158
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
159
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
160
    }
161
162
    public function testOnEmailDisplayWithNoOwner()
163
    {
164
        $subscriber = new OwnerSubscriber($this->getMockFactory()->getModel('lead'), $this->getMockTranslator());
165
166
        $mailer = $this->getMockMailer($this->contacts[4]);
167
        $event  = new EmailSendEvent($mailer);
168
        $subscriber->onEmailDisplay($event);
169
170
        $tokens = $event->getTokens();
171
        $this->assertArrayHasKey('{ownerfield=email}', $tokens);
172
        $this->assertArrayHasKey('{ownerfield=firstname}', $tokens);
173
        $this->assertArrayHasKey('{ownerfield=lastname}', $tokens);
174
175
        $this->assertEquals('', $tokens['{ownerfield=email}']);
176
        $this->assertEquals('', $tokens['{ownerfield=firstname}']);
177
        $this->assertEquals('', $tokens['{ownerfield=lastname}']);
178
    }
179
180
    /**
181
     * @param bool  $mailIsOwner
182
     * @param array $parameterMap
183
     *
184
     * @return MauticFactory|\PHPUnit_Framework_MockObject_MockObject
185
     */
186
    protected function getMockFactory($mailIsOwner = true, $parameterMap = [])
187
    {
188
        $mockLeadRepository = $this->getMockBuilder(LeadRepository::class)
189
            ->disableOriginalConstructor()
190
            ->getMock();
191
192
        $mockLeadRepository->method('getLeadOwner')
193
            ->will(
194
                $this->returnValueMap(
195
                    [
196
                        [1, ['id' => 1, 'email' => '[email protected]', 'first_name' => '', 'last_name' => '', 'signature' => 'owner 1']],
197
                        [2, ['id' => 2, 'email' => '[email protected]', 'first_name' => '', 'last_name' => '', 'signature' => 'owner 2']],
198
                        [3, ['id' => 3, 'email' => '[email protected]', 'first_name' => 'John', 'last_name' => 'S&#39;mith', 'signature' => 'owner 2']],
199
                    ]
200
                )
201
            );
202
203
        $mockLeadModel = $this->getMockBuilder(LeadModel::class)
204
            ->disableOriginalConstructor()
205
            ->getMock();
206
207
        $mockLeadModel->method('getRepository')
208
            ->willReturn($mockLeadRepository);
209
210
        /** @var MauticFactory|\PHPUnit_Framework_MockObject_MockObject $mockFactory */
211
        $mockFactory = $this->getMockBuilder(MauticFactory::class)
212
            ->disableOriginalConstructor()
213
            ->getMock();
214
215
        $parameterMap = array_merge(
216
            [
217
                ['mailer_return_path', false, null],
218
                ['mailer_spool_type', false, 'memory'],
219
                ['mailer_is_owner', false, $mailIsOwner],
220
            ],
221
            $parameterMap
222
        );
223
224
        $mockFactory->method('getParameter')
225
            ->will(
226
                $this->returnValueMap($parameterMap)
227
            );
228
        $mockFactory->method('getModel')
229
            ->will(
230
                $this->returnValueMap(
231
                    [
232
                        ['lead', $mockLeadModel],
233
                    ]
234
                )
235
            );
236
237
        $mockLogger = $this->getMockBuilder(Logger::class)
238
            ->disableOriginalConstructor()
239
            ->getMock();
240
        $mockFactory->method('getLogger')
241
            ->willReturn($mockLogger);
242
243
        $mockMailboxHelper = $this->getMockBuilder(Mailbox::class)
244
            ->disableOriginalConstructor()
245
            ->getMock();
246
        $mockMailboxHelper->method('isConfigured')
247
            ->willReturn(false);
248
249
        $mockFactory->method('getHelper')
250
            ->will(
251
                $this->returnValueMap(
252
                    [
253
                        ['mailbox', $mockMailboxHelper],
254
                    ]
255
                )
256
            );
257
258
        return $mockFactory;
259
    }
260
261
    protected function getMockMailer(array $lead)
262
    {
263
        $parameterMap = [
264
            ['mailer_custom_headers', [], ['X-Mautic-Test' => 'test', 'X-Mautic-Test2' => 'test']],
265
        ];
266
        /** @var MauticFactory $mockFactory */
267
        $mockFactory = $this->getMockFactory(true, $parameterMap);
268
269
        $transport   = new SmtpTransport();
270
        $swiftMailer = new \Swift_Mailer($transport);
271
        $mailer      = new MailHelper($mockFactory, $swiftMailer, ['[email protected]' => 'No Body']);
272
        $mailer->setLead($lead);
273
274
        return $mailer;
275
    }
276
277
    /**
278
     * @return Translator|\PHPUnit_Framework_MockObject_MockObject
279
     */
280
    protected function getMockTranslator()
281
    {
282
        /** @var Translator|\PHPUnit_Framework_MockObject_MockObject $translator */
283
        $translator = $this->getMockBuilder(Translator::class)
284
            ->disableOriginalConstructor()
285
            ->getMock();
286
        $translator->expects($this->any())
0 ignored issues
show
The method expects() does not exist on Mautic\CoreBundle\Translation\Translator. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

286
        $translator->/** @scrutinizer ignore-call */ 
287
                     expects($this->any())

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
287
            ->method('hasId')
288
            ->will($this->returnValue(false));
289
290
        return $translator;
291
    }
292
}
293