returnOneValidateCampaignUrls()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 11
rs 10
1
<?php
2
3
namespace Azine\EmailBundle\Tests\Services;
4
5
use Azine\EmailBundle\DependencyInjection\AzineEmailExtension;
6
use Azine\EmailBundle\Services\AzineEmailTwigExtension;
7
use Azine\EmailBundle\Services\AzineTemplateProvider;
8
use Azine\EmailBundle\Services\AzineTwigSwiftMailer;
9
10
class AzineTwigSwiftMailerTest extends \PHPUnit\Framework\TestCase
11
{
12
    private function getMockSetup($sendCallback)
13
    {
14
        $mocks['mailer'] = $this->getMockBuilder("\Swift_Mailer")->disableOriginalConstructor()->getMock();
0 ignored issues
show
Comprehensibility Best Practice introduced by
$mocks was never initialized. Although not strictly required by PHP, it is generally a good practice to add $mocks = array(); before regardless.
Loading history...
15
        $mocks['mailer']->expects($this->once())->method('send')->will($this->returnCallback($sendCallback));
16
        $mocks['router'] = $this->getMockBuilder("Symfony\Component\Routing\Generator\UrlGeneratorInterface")->disableOriginalConstructor()->getMock();
17
        $mocks['twig'] = $this->getMockBuilder("\Twig_Environment")->disableOriginalConstructor()->getMock();
18
        $mocks['baseTemplateMock'] = $this->getMockBuilder("\Twig_Template")->disableOriginalConstructor()->setMethods(array('renderBlock'))->getMockForAbstractClass();
19
        $mocks['twig']->expects($this->once())->method('loadTemplate')->will($this->returnValue($mocks['baseTemplateMock']));
20
21
        $mocks['translator'] = $this->getMockBuilder("Symfony\Bundle\FrameworkBundle\Translation\Translator")->disableOriginalConstructor()->getMock();
22
        $mocks['translator']->expects($this->any())->method('trans')->will($this->returnValue('azine.translation.mock'));
23
24
        $imagesDir = realpath(__DIR__.'/../../Resources/htmlTemplateImages/');
25
        $mocks['templateProvider'] = new AzineTemplateProvider($mocks['router'], $mocks['translator'], array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
26
                                                                                                                AzineEmailExtension::TEMPLATE_IMAGE_DIR => $imagesDir,
27
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
28
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
29
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
30
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
31
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
32
                                                                                                                ));
33
        $this->getMockBuilder("Azine\EmailBundle\Services\AzineTemplateProvider")->disableOriginalConstructor()->getMock();
34
35
        $mocks['entityManager'] = $this->getMockBuilder("Doctrine\ORM\EntityManager")->disableOriginalConstructor()->getMock();
36
        $mocks['managerRegistry'] = $this->getMockBuilder("Doctrine\Common\Persistence\ManagerRegistry")->disableOriginalConstructor()->getMock();
37
        $mocks['managerRegistry']->expects($this->any())->method('getManager')->will($this->returnValue($mocks['entityManager']));
38
39
        $mocks['parameters'] = array(AzineEmailExtension::NO_REPLY => array(
40
                                                                                AzineEmailExtension::NO_REPLY_EMAIL_ADDRESS => '[email protected]',
41
                                                                                AzineEmailExtension::NO_REPLY_EMAIL_NAME => 'no-reply-name', ),
42
                                        AzineTemplateProvider::CONTENT_ITEMS => array(
43
                                                                                        0 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some title', 'created' => new \DateTime('2 hours ago'), 'content' => 'some content'))),
44
                                                                                        1 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some other title', 'created' => new \DateTime('1 hours ago'), 'content' => 'some other content'))),
45
                                                                                    ),
46
                                        'logo_png' => $imagesDir.'/logo.png',
47
                                        'noFile_png' => $imagesDir.'/../../../unallowedFolder/logo.png',
48
                                        'not_allowed_png' => $imagesDir.'/inexistentFile.png',
49
                                    );
50
        $requestContext = $this->getMockBuilder("Symfony\Component\Routing\RequestContext")->disableOriginalConstructor()->getMock();
51
        $mocks['router']->expects($this->once())->method('getContext')->will($this->returnValue($requestContext));
52
53
        $mocks['trackingCodeImgBuilder'] = $this->getMockBuilder("Azine\EmailBundle\Services\AzineEmailOpenTrackingCodeBuilder")->setConstructorArgs(array('https://www.google-analytics.com/?tid=blabla', array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
54
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
55
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
56
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
57
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
58
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
59
            )))->getMock();
60
        $mocks['trackingCodeImgBuilder']->expects($this->any())->method('getTrackingImgCode')->will($this->returnValue("<img src='https://www.google-analytics.com/?tid=blabla&utm_medium=email' style='border:0' alt='' />"));
61
62
        $mocks['emailTwigExtension'] = new AzineEmailTwigExtension($mocks['templateProvider'], $mocks['translator'], array('testurl.com'));
63
64
        return $mocks;
65
    }
66
67
    public function returnOne($message, &$failedRecipients = null)
0 ignored issues
show
Unused Code introduced by
The parameter $failedRecipients is not used and could be removed. ( Ignorable by Annotation )

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

67
    public function returnOne($message, /** @scrutinizer ignore-unused */ &$failedRecipients = null)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $message is not used and could be removed. ( Ignorable by Annotation )

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

67
    public function returnOne(/** @scrutinizer ignore-unused */ $message, &$failedRecipients = null)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
68
    {
69
        return 1;
70
    }
71
72
    public function returnOneValidateCampaignUrls($message, &$failedRecipients = null)
0 ignored issues
show
Unused Code introduced by
The parameter $failedRecipients is not used and could be removed. ( Ignorable by Annotation )

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

72
    public function returnOneValidateCampaignUrls($message, /** @scrutinizer ignore-unused */ &$failedRecipients = null)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
73
    {
74
        $body = $message->getBody();
75
76
        // has a email-tracking-image at the end
77
        $this->assertContains("<img src='https://www.google-analytics.com/?tid=blabla", $body, 'Email open tracking image not found.');
78
79
        // links have tracking-parameters
80
        $this->assertContains('&utm_medium=email', $body, 'Email links are expected to have tracking parameters attached.');
81
82
        return 1;
83
    }
84
85
    public function returnZeroWithFailedAddress($message, &$failedRecipients = null)
86
    {
87
        $failedRecipients[] = $message->getTo();
88
89
        return 0;
90
    }
91
92
    /**
93
     * @return \FOS\UserBundle\Model\UserInterface
94
     */
95
    private function getUserMock()
96
    {
97
        $user = $this->getMockBuilder("FOS\UserBundle\Model\UserInterface")->disableOriginalConstructor()->getMock();
98
        $user->expects($this->once())->method('getEmail')->will($this->returnValue('[email protected]'));
99
        $user->expects($this->any())->method('getConfirmationToken')->will($this->returnValue('aptrqi3o4pte:::token:::zfpguhask5jx0a9xukp'));
100
101
        return $user;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $user returns the type PHPUnit\Framework\MockObject\MockObject which is incompatible with the documented return type FOS\UserBundle\Model\UserInterface.
Loading history...
102
    }
103
104
    public function renderBlockCallback($name, $context = array(), $blocks = array())
0 ignored issues
show
Unused Code introduced by
The parameter $blocks is not used and could be removed. ( Ignorable by Annotation )

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

104
    public function renderBlockCallback($name, $context = array(), /** @scrutinizer ignore-unused */ $blocks = array())

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
105
    {
106
        if ('subject' == $name) {
107
            return 'a subject';
108
        } elseif ('body_html' == $name) {
109
            $generatedImage = '';
110
            if (array_key_exists('embededUsedGeneratedImage', $context)) {
111
                $generatedImage = "<img src='".$context['embededUsedGeneratedImage']."' alt='generatedImage'>";
112
            }
113
114
            return  "<html><body><h1>a html body</h1>$generatedImage<a href='http://some.url.com/' ><img src='".$context['logo_png']."' alt='logo'></a><p>with a paragraph and <a href='https://foo.bar.com/index.php?q=4'>links</a>.</p></body><html>";
115
        } elseif ('body_text' == $name) {
116
            return "a text body \n \n with new lines.";
117
        }
118
        throw new \Exception("un-known block : '$name'");
119
    }
120
121
    public function generateCallback($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
0 ignored issues
show
Unused Code introduced by
The parameter $referenceType is not used and could be removed. ( Ignorable by Annotation )

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

121
    public function generateCallback($name, $parameters = array(), /** @scrutinizer ignore-unused */ $referenceType = self::ABSOLUTE_PATH)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Bug introduced by
The constant Azine\EmailBundle\Tests\...ilerTest::ABSOLUTE_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
122
    {
123
        if ('fos_user_registration_confirm' == $name) {
124
            return 'http://azine.bundle.com/confirmation/url/'.$parameters['token'];
125
        } elseif ('fos_user_resetting_reset' == $name) {
126
            return 'http://azine.bundle.com/resetting/url/'.$parameters['token'];
127
        } elseif ('azine_email_serve_template_image' == $name) {
128
            return 'http://azine.bundle.com/image/url/logo.png';
129
        }
130
        throw new \Exception("un-expected route for url-generation : '$name'");
131
    }
132
133
    public function testSendSingleEmail()
134
    {
135
        $mocks = $this->getMockSetup(array($this, 'returnOneValidateCampaignUrls'));
136
        $mocks['baseTemplateMock']->expects($this->exactly(2))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
137
        $mocks['translator']->expects($this->once())->method('getLocale')->will($this->returnValue('en'));
138
        $mocks['router']->expects($this->exactly(12))->method('generate')->will($this->returnCallback(array($this, 'generateCallback')));
139
140
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
141
142
        $to = '[email protected]';
143
        $toName = 'ToName';
144
        $params = array('aKey' => 'aValue', 'contentItems' => array(array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('someOtherKey' => 'someOtherValue'))));
145
        $template = AzineTemplateProvider::NEWSLETTER_TEMPLATE.'.txt.twig';
146
        $emailLocale = 'en';
147
        $subject = 'custom subject';
148
        $azineMailer->sendSingleEmail($to, $toName, $subject, $params, $template, $emailLocale);
149
    }
150
151
    public function testSendSingleEmailFails()
152
    {
153
        $mocks = array();
154
        $mocks['mailer'] = $this->getMockBuilder("\Swift_Mailer")->disableOriginalConstructor()->getMock();
155
        $mocks['mailer']->expects($this->once())->method('send')->will($this->returnCallback(array($this, 'returnZeroWithFailedAddress')));
156
        $mocks['router'] = $this->getMockBuilder("Symfony\Component\Routing\Generator\UrlGeneratorInterface")->disableOriginalConstructor()->getMock();
157
        $mocks['twig'] = $this->getMockBuilder("\Twig_Environment")->disableOriginalConstructor()->getMock();
158
        $mocks['baseTemplateMock'] = $this->getMockBuilder("\Twig_Template")->disableOriginalConstructor()->setMethods(array('renderBlock'))->getMockForAbstractClass();
159
        $mocks['twig']->expects($this->once())->method('loadTemplate')->will($this->returnValue($mocks['baseTemplateMock']));
160
161
        $mocks['translator'] = $this->getMockBuilder("Symfony\Bundle\FrameworkBundle\Translation\Translator")->disableOriginalConstructor()->getMock();
162
        $mocks['translator']->expects($this->any())->method('trans')->will($this->returnValue('azine.translation.mock'));
163
164
        $imagesDir = realpath(__DIR__.'/../../Resources/htmlTemplateImages/');
165
        $mocks['templateProvider'] = new AzineTemplateProvider($mocks['router'], $mocks['translator'], array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
166
            AzineEmailExtension::TEMPLATE_IMAGE_DIR => $imagesDir,
167
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
168
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
169
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
170
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
171
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
172
        ));
173
        $this->getMockBuilder("Azine\EmailBundle\Services\AzineTemplateProvider")->disableOriginalConstructor()->getMock();
174
175
        $mocks['entityManager'] = $this->getMockBuilder("Doctrine\ORM\EntityManager")->disableOriginalConstructor()->getMock();
176
        $mocks['managerRegistry'] = $this->getMockBuilder("Doctrine\Common\Persistence\ManagerRegistry")->disableOriginalConstructor()->getMock();
177
        $mocks['managerRegistry']->expects($this->any())->method('getManager')->will($this->returnValue($mocks['entityManager']));
178
179
        $mocks['parameters'] = array(AzineEmailExtension::NO_REPLY => array(
180
            AzineEmailExtension::NO_REPLY_EMAIL_ADDRESS => '[email protected]',
181
            AzineEmailExtension::NO_REPLY_EMAIL_NAME => 'no-reply-name', ),
182
            AzineTemplateProvider::CONTENT_ITEMS => array(
183
                0 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some title', 'created' => new \DateTime('2 hours ago'), 'content' => 'some content'))),
184
                1 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some other title', 'created' => new \DateTime('1 hours ago'), 'content' => 'some other content'))),
185
            ),
186
            'logo_png' => $imagesDir.'/logo.png',
187
            'noFile_png' => $imagesDir.'/../../../unallowedFolder/logo.png',
188
            'not_allowed_png' => $imagesDir.'/inexistentFile.png',
189
        );
190
        $requestContext = $this->getMockBuilder("Symfony\Component\Routing\RequestContext")->disableOriginalConstructor()->getMock();
191
        $mocks['router']->expects($this->once())->method('getContext')->will($this->returnValue($requestContext));
192
193
        $mocks['trackingCodeImgBuilder'] = $this->getMockBuilder("Azine\EmailBundle\Services\AzineEmailOpenTrackingCodeBuilder")->setConstructorArgs(array('https://www.google-analytics.com/?tid=blabla', array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
194
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
195
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
196
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
197
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
198
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
199
        )))->getMock();
200
201
        $mocks['baseTemplateMock']->expects($this->exactly(2))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
202
        $mocks['translator']->expects($this->once())->method('getLocale')->will($this->returnValue('en'));
203
204
        $mocks['emailTwigExtension'] = $this->getMockBuilder("Azine\EmailBundle\Services\AzineEmailTwigExtension")->disableOriginalConstructor()->getMock();
205
        $mocks['emailTwigExtension']->expects($this->exactly(1))->method('addCampaignParamsToAllUrls')->will($this->returnArgument(0));
206
207
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
208
209
        $to = '[email protected]';
210
        $toName = 'ToName';
211
        $params = array('aKey' => 'aValue', 'contentItems' => array(array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('someOtherKey' => 'someOtherValue'))));
212
        $template = AzineTemplateProvider::NEWSLETTER_TEMPLATE.'.txt.twig';
213
        $emailLocale = 'en';
214
        $subject = 'custom subject';
215
        $result = $azineMailer->sendSingleEmail($to, $toName, $subject, $params, $template, $emailLocale);
216
        $this->assertFalse($result, 'expected send to fail');
217
    }
218
219
    public function testSendEmailWithEmailLocaleAndAttachments()
220
    {
221
        $mocks = $this->getMockSetup(array($this, 'returnOne'));
222
        $mocks['baseTemplateMock']->expects($this->exactly(2))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
223
        $mocks['translator']->expects($this->once())->method('getLocale')->will($this->returnValue('en'));
224
        $mocks['router']->expects($this->exactly(6))->method('generate')->will($this->returnCallback(array($this, 'generateCallback')));
225
226
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
227
228
        $failedRecipients = array();
229
        $from = '[email protected]';
230
        $fromName = 'FromName';
231
        $to = '[email protected]';
232
        $toName = 'ToName';
233
        $cc = '[email protected]';
234
        $ccName = 'CcName';
235
        $bcc = '[email protected]';
236
        $bccName = 'BccName';
237
        $replyTo = '[email protected]';
238
        $replyToName = 'ReplyToName';
239
        $subject = 'some dummy test subject';
240
        $params = array();
241
        $generatedImage = imagecreate(100, 100);
242
        $background_color = imagecolorallocate($generatedImage, 0, 0, 0);
0 ignored issues
show
Unused Code introduced by
The assignment to $background_color is dead and can be removed.
Loading history...
Bug introduced by
It seems like $generatedImage can also be of type false; however, parameter $image of imagecolorallocate() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

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

242
        $background_color = imagecolorallocate(/** @scrutinizer ignore-type */ $generatedImage, 0, 0, 0);
Loading history...
243
        $text_color = imagecolorallocate($generatedImage, 233, 14, 91);
244
        imagestring($generatedImage, 1, 5, 5, 'A Simple Text String', $text_color);
0 ignored issues
show
Bug introduced by
It seems like $generatedImage can also be of type false; however, parameter $image of imagestring() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

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

244
        imagestring(/** @scrutinizer ignore-type */ $generatedImage, 1, 5, 5, 'A Simple Text String', $text_color);
Loading history...
245
        $template = AzineTemplateProvider::NEWSLETTER_TEMPLATE.'.txt.twig';
246
247
        // embed a regular file, a generated file and an invalid file
248
        $params['embededUnusedFile'] = __FILE__;
249
        $params['embededUnusedGeneratedFile'] = $generatedImage;
250
        $params['embededUsedGeneratedImage'] = $generatedImage;
251
        $params['embededUnusedInexistentFile'] = __FILE__.'not.existent.jpg';
252
253
        // attach a regular file and a generated file
254
        $attachments = array('regularFile' => __FILE__, 'generatedFile' => $generatedImage, 'fileWithVeryShortName.replacement.txt' => __DIR__.'/a.b');
255
        $emailLocale = 'en';
256
257
        $azineMailer->sendEmail($failedRecipients, $subject, $from, $fromName, $to, $toName, $cc, $ccName, $bcc, $bccName, $replyTo, $replyToName, $params, $template, $attachments, $emailLocale);
258
    }
259
260
    /**
261
     * @expectedException  \Symfony\Component\HttpFoundation\File\Exception\FileException
262
     */
263
    public function testSendEmailWithEmailLocaleAndInexistentAttachment()
264
    {
265
        $mocks['mailer'] = $this->getMockBuilder("\Swift_Mailer")->disableOriginalConstructor()->getMock();
0 ignored issues
show
Comprehensibility Best Practice introduced by
$mocks was never initialized. Although not strictly required by PHP, it is generally a good practice to add $mocks = array(); before regardless.
Loading history...
266
        $mocks['mailer']->expects($this->never())->method('send');
267
268
        $mocks['router'] = $this->getMockBuilder("Symfony\Component\Routing\Generator\UrlGeneratorInterface")->disableOriginalConstructor()->getMock();
269
        $mocks['twig'] = $this->getMockBuilder("\Twig_Environment")->disableOriginalConstructor()->getMock();
270
        $mocks['baseTemplateMock'] = $this->getMockBuilder("\Twig_Template")->disableOriginalConstructor()->setMethods(array('renderBlock'))->getMockForAbstractClass();
271
        $mocks['twig']->expects($this->once())->method('loadTemplate')->will($this->returnValue($mocks['baseTemplateMock']));
272
273
        $mocks['translator'] = $this->getMockBuilder("Symfony\Bundle\FrameworkBundle\Translation\Translator")->disableOriginalConstructor()->getMock();
274
        $mocks['translator']->expects($this->any())->method('trans')->will($this->returnValue('azine.translation.mock'));
275
276
        $imagesDir = realpath(__DIR__.'/../../Resources/htmlTemplateImages/');
277
        $mocks['templateProvider'] = new AzineTemplateProvider($mocks['router'], $mocks['translator'], array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
278
                                                                                                                AzineEmailExtension::TEMPLATE_IMAGE_DIR => $imagesDir,
279
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
280
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
281
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
282
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
283
                                                                                                                AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
284
                                                                                                            ));
285
        $this->getMockBuilder("Azine\EmailBundle\Services\AzineTemplateProvider")->disableOriginalConstructor()->getMock();
286
287
        $mocks['entityManager'] = $this->getMockBuilder("Doctrine\ORM\EntityManager")->disableOriginalConstructor()->getMock();
288
        $mocks['managerRegistry'] = $this->getMockBuilder("Doctrine\Common\Persistence\ManagerRegistry")->disableOriginalConstructor()->getMock();
289
        $mocks['managerRegistry']->expects($this->any())->method('getManager')->will($this->returnValue($mocks['entityManager']));
290
291
        $mocks['parameters'] = array(AzineEmailExtension::NO_REPLY => array(
292
                                                                                AzineEmailExtension::NO_REPLY_EMAIL_ADDRESS => '[email protected]',
293
                                                                                AzineEmailExtension::NO_REPLY_EMAIL_NAME => 'no-reply-name', ),
294
                                        AzineTemplateProvider::CONTENT_ITEMS => array(
295
                                                                                        0 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some title', 'created' => new \DateTime('2 hours ago'), 'content' => 'some content'))),
296
                                                                                        1 => array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'some other title', 'created' => new \DateTime('1 hours ago'), 'content' => 'some other content'))),
297
                                                                                    ),
298
                                        'logo_png' => $imagesDir.'/logo.png',
299
                                        'noFile_png' => $imagesDir.'/../../../unallowedFolder/logo.png',
300
                                        'not_allowed_png' => $imagesDir.'/inexistentFile.png',
301
                                    );
302
        $requestContext = $this->getMockBuilder("Symfony\Component\Routing\RequestContext")->disableOriginalConstructor()->getMock();
303
        $mocks['router']->expects($this->once())->method('getContext')->will($this->returnValue($requestContext));
304
        $mocks['baseTemplateMock']->expects($this->exactly(2))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
305
        $mocks['translator']->expects($this->once())->method('getLocale')->will($this->returnValue('en'));
306
        $mocks['router']->expects($this->never())->method('generate');
307
308
        $mocks['trackingCodeImgBuilder'] = $this->getMockBuilder("Azine\EmailBundle\Services\AzineEmailOpenTrackingCodeBuilder")->setConstructorArgs(array('http://www.google-analytics.com/?', array(AzineEmailExtension::ALLOWED_IMAGES_FOLDERS => array($imagesDir),
309
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME => 'utm_campaign',
310
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM => 'utm_term',
311
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE => 'utm_source',
312
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM => 'utm_medium',
313
            AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT => 'utm_content',
314
        )))->getMock();
315
316
        $mocks['emailTwigExtension'] = $this->getMockBuilder("Azine\EmailBundle\Services\AzineEmailTwigExtension")->disableOriginalConstructor()->getMock();
317
        $mocks['emailTwigExtension']->expects($this->exactly(1))->method('addCampaignParamsToAllUrls')->will($this->returnArgument(0));
318
319
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
320
321
        $failedRecipients = array();
322
        $from = '[email protected]';
323
        $fromName = 'FromName';
324
        $to = '[email protected]';
325
        $toName = 'ToName';
326
        $cc = '[email protected]';
327
        $ccName = 'CcName';
328
        $bcc = '[email protected]';
329
        $bccName = 'BccName';
330
        $replyTo = '[email protected]';
331
        $replyToName = 'ReplyToName';
332
        $subject = 'some dummy test subject';
333
        $params = array();
334
        $template = AzineTemplateProvider::NEWSLETTER_TEMPLATE.'.txt.twig';
335
336
        // embed an inexistent file
337
        $params['embededUnusedInexistentFile'] = __FILE__.'not.existent.jpg';
338
339
        // attach an inexistent file
340
        $attachments = array(__FILE__.'not.existent.jpg');
341
        $emailLocale = 'en';
342
343
        $azineMailer->sendEmail($failedRecipients, $subject, $from, $fromName, $to, $toName, $cc, $ccName, $bcc, $bccName, $replyTo, $replyToName, $params, $template, $attachments, $emailLocale);
344
    }
345
346
    public function testSendEmailWithOutEmailLocaleAndNoAttachment()
347
    {
348
        $mocks = $this->getMockSetup(array($this, 'returnOne'));
349
        $mocks['baseTemplateMock']->expects($this->exactly(2))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
350
        $mocks['translator']->expects($this->once())->method('getLocale')->will($this->returnValue('en'));
351
        $mocks['router']->expects($this->exactly(0))->method('generate')->will($this->returnCallback(array($this, 'generateCallback')));
352
353
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
354
355
        $failedRecipients = array();
356
        $from = '[email protected]';
357
        $fromName = 'FromName';
358
        $to = '[email protected]';
359
        $toName = 'ToName';
360
        $cc = '[email protected]';
361
        $ccName = 'CcName';
362
        $bcc = '[email protected]';
363
        $bccName = 'BccName';
364
        $replyTo = '[email protected]';
365
        $replyToName = 'ReplyToName';
366
        $subject = 'some dummy test subject';
367
        $params = array();
368
        $template = AzineTemplateProvider::BASE_TEMPLATE.'.txt.twig';
369
        $attachments = array();
370
        $emailLocale = null;
371
372
        $sentCount = $azineMailer->sendEmail($failedRecipients, $subject, $from, $fromName, $to, $toName, $cc, $ccName, $bcc, $bccName, $replyTo, $replyToName, $params, $template, $attachments, $emailLocale);
373
374
        $this->assertSame(1, $sentCount, 'One email should have been sent.');
375
    }
376
377
    public function testSendConfirmationEmailMessage()
378
    {
379
        $azineMailer = $this->prepareForSendTest();
380
        $azineMailer->sendConfirmationEmailMessage($this->getUserMock());
381
    }
382
383
    public function testSendResettingEmailMessage()
384
    {
385
        $azineMailer = $this->prepareForSendTest();
386
        $azineMailer->sendResettingEmailMessage($this->getUserMock());
387
    }
388
389
    /**
390
     * @param $templateBaseId
391
     *
392
     * @return AzineTwigSwiftMailer
393
     */
394
    private function prepareForSendTest()
395
    {
396
        $mocks = $this->getMockSetup(array($this, 'returnOne'));
397
398
        // as the subject from FOS-templates is embeded in the twig-template, the render-block is called 3 instead of only 2 times
399
        $mocks['baseTemplateMock']->expects($this->exactly(3))->method('renderBlock')->will($this->returnCallback(array($this, 'renderBlockCallback')));
400
401
        $mocks['parameters']['template'] = array();
402
        $mocks['parameters']['template']['confirmation'] = AzineTemplateProvider::FOS_USER_REGISTRATION_TEMPLATE.'.txt.twig';
403
        $mocks['parameters']['template']['resetting'] = AzineTemplateProvider::FOS_USER_PWD_RESETTING_TEMPLATE.'.txt.twig';
404
        $mocks['parameters']['from_email'] = array();
405
        $mocks['parameters']['from_email']['confirmation'] = '[email protected]';
406
        $mocks['parameters']['from_email']['resetting'] = '[email protected]';
407
408
        $mocks['router']->expects($this->once())->method('generate')->will($this->returnCallback(array($this, 'generateCallback')));
409
410
        $mocks['translator']->expects($this->exactly(2))->method('getLocale')->will($this->returnValue('en'));
411
412
        $azineMailer = new AzineTwigSwiftMailer($mocks['mailer'], $mocks['router'], $mocks['twig'], $mocks['translator'], $mocks['templateProvider'], $mocks['managerRegistry'], $mocks['trackingCodeImgBuilder'], $mocks['emailTwigExtension'], $mocks['parameters']);
413
414
        return $azineMailer;
415
    }
416
}
417