Completed
Push — master ( 084203...9a8ce6 )
by Jacob
02:14
created

testBuildMessageWithAttachmentsEmpty()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 39
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 39
rs 8.8571
cc 1
eloc 30
nc 1
nop 0
1
<?php
2
3
namespace Jacobemerick\Archangel;
4
5
use Monolog\Logger;
6
use Monolog\Handler\TestHandler;
7
use PHPUnit_Framework_TestCase;
8
use ReflectionClass;
9
10
class ArchangelTest extends PHPUnit_Framework_TestCase
11
{
12
13
    public function testIsInstanceOfArchangel()
14
    {
15
        $archangel = new Archangel();
16
17
        $this->assertInstanceOf('Jacobemerick\Archangel\Archangel', $archangel);
18
    }
19
20
    public function testIsLoggerAwareInterface()
21
    {
22
        $archangel = new Archangel();
23
24
        $this->assertInstanceOf('Psr\Log\LoggerAwareInterface', $archangel);
25
    }
26
27
    public function testConstructSetsDefaultMailer()
28
    {
29
        $archangel = new Archangel();
30
        $mailer = sprintf('PHP/%s', phpversion());
31
        $headers = array('X-Mailer' => $mailer);
32
33
        $this->assertAttributeEquals($headers, 'headers', $archangel);
34
    }
35
36
    public function testConstructOverridesMailer()
37
    {
38
        $archangel = new Archangel('AwesomeMailer');
39
        $headers = array('X-Mailer' => 'AwesomeMailer');
40
41
        $this->assertAttributeEquals($headers, 'headers', $archangel);
42
    }
43
44
    public function testConstructSetsNullLogger()
45
    {
46
        $archangel = new Archangel();
47
48
        $this->assertAttributeInstanceOf('Psr\Log\NullLogger', 'logger', $archangel);
49
    }
50
51
    public function testConstructSetsBoundaries()
52
    {
53
        $archangel = new Archangel();
54
        $expectedBoundaryMixed = sprintf('PHP-mixed-%s', uniqid());
55
        $expectedBoundaryAlternative = sprintf('PHP-alternative-%s', uniqid());
56
57
        $this->assertAttributeEquals($expectedBoundaryMixed, 'boundaryMixed', $archangel);
58
        $this->assertAttributeEquals($expectedBoundaryAlternative, 'boundaryAlternative', $archangel);
59
    }
60
61
    public function testSetLogger()
62
    {
63
        $logger = $this->getMock('Psr\Log\LoggerInterface');
64
        $archangel = new Archangel();
65
        $archangel->setLogger($logger);
66
67
        $this->assertAttributeSame($logger, 'logger', $archangel);
68
    }
69
70
    public function testAddTo()
71
    {
72
        $archangel = new Archangel();
73
        $archangel->addTo('[email protected]');
74
75
        $this->assertAttributeContains('[email protected]', 'toAddresses', $archangel);
76
    }
77
78
    public function testAddToMultiple()
79
    {
80
        $archangel = new Archangel();
81
        $archangel->addTo('[email protected]');
82
        $archangel->addTo('[email protected]');
83
84
        $this->assertAttributeContains('[email protected]', 'toAddresses', $archangel);
85
        $this->assertAttributeContains('[email protected]', 'toAddresses', $archangel);
86
    }
87
88
    public function testAddToWithTitle()
89
    {
90
        $archangel = new Archangel();
91
        $archangel->addTo('[email protected]', 'Mr. Test Alot');
92
93
        $this->assertAttributeContains('"Mr. Test Alot" <[email protected]>', 'toAddresses', $archangel);
94
    }
95
96
    public function testAddCC()
97
    {
98
        $archangel = new Archangel();
99
        $archangel->addCC('[email protected]');
100
        $headersProperty = $this->getProtectedProperty('headers');
101
        $headers = $headersProperty->getValue($archangel);
102
103
        $this->assertArraySubset(
104
            array('CC' => array('[email protected]')),
105
            $headers
106
        );
107
    }
108
109 View Code Duplication
    public function testAddCCMultiple()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
110
    {
111
        $archangel = new Archangel();
112
        $archangel->addCC('[email protected]');
113
        $archangel->addCC('[email protected]');
114
        $headersProperty = $this->getProtectedProperty('headers');
115
        $headers = $headersProperty->getValue($archangel);
116
117
        $this->assertArraySubset(
118
            array('CC' => array('[email protected]', '[email protected]')),
119
            $headers
120
        );
121
    }
122
123
    public function testAddCCWithTitle()
124
    {
125
        $archangel = new Archangel();
126
        $archangel->addCC('[email protected]', 'Mr. Test Alot');
127
        $headersProperty = $this->getProtectedProperty('headers');
128
        $headers = $headersProperty->getValue($archangel);
129
130
        $this->assertArraySubset(
131
            array('CC' => array('"Mr. Test Alot" <[email protected]>')),
132
            $headers
133
        );
134
    }
135
136
    public function testAddBCC()
137
    {
138
        $archangel = new Archangel();
139
        $archangel->addBCC('[email protected]');
140
        $headersProperty = $this->getProtectedProperty('headers');
141
        $headers = $headersProperty->getValue($archangel);
142
143
        $this->assertArraySubset(
144
            array('BCC' => array('[email protected]')),
145
            $headers
146
        );
147
    }
148
149 View Code Duplication
    public function testAddBCCMultiple()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
150
    {
151
        $archangel = new Archangel();
152
        $archangel->addBCC('[email protected]');
153
        $archangel->addBCC('[email protected]');
154
        $headersProperty = $this->getProtectedProperty('headers');
155
        $headers = $headersProperty->getValue($archangel);
156
157
        $this->assertArraySubset(
158
            array('BCC' => array('[email protected]', '[email protected]')),
159
            $headers
160
        );
161
    }
162
163
    public function testAddBCCWithTitle()
164
    {
165
        $archangel = new Archangel();
166
        $archangel->addBCC('[email protected]', 'Mr. Test Alot');
167
        $headersProperty = $this->getProtectedProperty('headers');
168
        $headers = $headersProperty->getValue($archangel);
169
170
        $this->assertArraySubset(
171
            array('BCC' => array('"Mr. Test Alot" <[email protected]>')),
172
            $headers
173
        );
174
    }
175
176
    public function testSetFrom()
177
    {
178
        $archangel = new Archangel();
179
        $archangel->setFrom('[email protected]');
180
        $headersProperty = $this->getProtectedProperty('headers');
181
        $headers = $headersProperty->getValue($archangel);
182
183
        $this->assertArraySubset(array('From' => '[email protected]'), $headers);
184
    }
185
186 View Code Duplication
    public function testSetFromMultiple()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
187
    {
188
        $archangel = new Archangel();
189
        $archangel->setFrom('[email protected]');
190
        $archangel->setFrom('[email protected]');
191
        $headersProperty = $this->getProtectedProperty('headers');
192
        $headers = $headersProperty->getValue($archangel);
193
194
        $this->assertArraySubset(array('From' => '[email protected]'), $headers);
195
        $this->assertNotContains('[email protected]', $headers);
196
    }
197
198
    public function testSetFromWithTitle()
199
    {
200
        $archangel = new Archangel();
201
        $archangel->setFrom('[email protected]', 'Mr. Test Alot');
202
        $headersProperty = $this->getProtectedProperty('headers');
203
        $headers = $headersProperty->getValue($archangel);
204
205
        $this->assertArraySubset(array('From' => '"Mr. Test Alot" <[email protected]>'), $headers);
206
    }
207
208
    public function testSetReplyTo()
209
    {
210
        $archangel = new Archangel();
211
        $archangel->setReplyTo('[email protected]');
212
        $headersProperty = $this->getProtectedProperty('headers');
213
        $headers = $headersProperty->getValue($archangel);
214
215
        $this->assertArraySubset(array('Reply-To' => '[email protected]'), $headers);
216
    }
217
218 View Code Duplication
    public function testSetReplyToMultiple()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
219
    {
220
        $archangel = new Archangel();
221
        $archangel->setReplyTo('[email protected]');
222
        $archangel->setReplyTo('[email protected]');
223
        $headersProperty = $this->getProtectedProperty('headers');
224
        $headers = $headersProperty->getValue($archangel);
225
226
        $this->assertArraySubset(array('Reply-To' => '[email protected]'), $headers);
227
        $this->assertNotContains('[email protected]', $headers);
228
    }
229
230
    public function testSetReplyToWithTitle()
231
    {
232
        $archangel = new Archangel();
233
        $archangel->setReplyTo('[email protected]', 'Mr. Test Alot');
234
        $headersProperty = $this->getProtectedProperty('headers');
235
        $headers = $headersProperty->getValue($archangel);
236
237
        $this->assertArraySubset(array('Reply-To' => '"Mr. Test Alot" <[email protected]>'), $headers);
238
    }
239
240 View Code Duplication
    public function testFormatEmailAddress()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
241
    {
242
        $archangel = new Archangel();
243
        $formatMethod = $this->getProtectedMethod('formatEmailAddress');
244
        $formattedEmail = $formatMethod->invokeArgs($archangel, array('[email protected]', ''));
245
246
        $this->assertEquals('[email protected]', $formattedEmail);
247
    }
248
249 View Code Duplication
    public function testFormatEmailAddressWithTitle()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
250
    {
251
        $archangel = new Archangel();
252
        $formatMethod = $this->getProtectedMethod('formatEmailAddress');
253
        $formattedEmail = $formatMethod->invokeArgs($archangel, array('[email protected]', 'Mr. Test Alot'));
254
255
        $this->assertEquals('"Mr. Test Alot" <[email protected]>', $formattedEmail);
256
    }
257
258
    public function testSetSubject()
259
    {
260
        $archangel = new Archangel();
261
        $archangel->setSubject('Test Subject');
262
263
        $this->assertAttributeEquals('Test Subject', 'subject', $archangel);
264
    }
265
266
    public function testSetPlainMessage()
267
    {
268
        $archangel = new Archangel();
269
        $archangel->setPlainMessage('Plain text message');
270
271
        $this->assertAttributeEquals('Plain text message', 'plainMessage', $archangel);
272
    }
273
274
    public function testSetHTMLMessage()
275
    {
276
        $archangel = new Archangel();
277
        $archangel->setHTMLMessage('<p>An HTML message.</p>');
278
279
        $this->assertAttributeEquals('<p>An HTML message.</p>', 'htmlMessage', $archangel);
280
    }
281
282 View Code Duplication
    public function testAddAttachment()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
283
    {
284
        $archangel = new Archangel();
285
        $archangel->addAttachment('path', 'type');
286
287
        $this->assertAttributeContains(
288
            array('path' => 'path', 'type' => 'type', 'title' => ''),
289
            'attachments',
290
            $archangel
291
        );
292
    }
293
294
    public function testAddAttachmentMultiple()
295
    {
296
        $archangel = new Archangel();
297
        $archangel->addAttachment('pathOne', 'typeOne');
298
        $archangel->addAttachment('pathTwo', 'typeTwo');
299
300
        $this->assertAttributeContains(
301
            array('path' => 'pathOne', 'type' => 'typeOne', 'title' => ''),
302
            'attachments',
303
            $archangel
304
        );
305
        $this->assertAttributeContains(
306
            array('path' => 'pathTwo', 'type' => 'typeTwo', 'title' => ''),
307
            'attachments',
308
            $archangel
309
        );
310
    }
311
312 View Code Duplication
    public function testAddAttachmentWithTitle()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
313
    {
314
        $archangel = new Archangel();
315
        $archangel->addAttachment('path', 'type', 'title');
316
317
        $this->assertAttributeContains(
318
            array('path' => 'path', 'type' => 'type', 'title' => 'title'),
319
            'attachments',
320
            $archangel
321
        );
322
    }
323
324
    public function testSend()
325
    {
326
        $archangel = new Archangel();
327
        $archangel->addTo('[email protected]');
328
        $archangel->setSubject('Test Subject');
329
        $archangel->setPlainMessage('Plain text message');
330
        $response = $archangel->send();
331
332
        $expectedResponse = array(
333
            'to' => '[email protected]',
334
            'subject' => 'Test Subject',
335
            'message' => 'Plain text message',
336
            'headers' => 'X-Mailer: PHP/6.0.0',
337
        );
338
339
        $this->assertEquals($expectedResponse, $response);
340
    }
341
342
    public function testSendFailure()
343
    {
344
        $archangel = new Archangel();
345
        $response = $archangel->send();
346
347
        $this->assertFalse($response);
348
    }
349
350
    /**
351
     * @dataProvider dataCheckRequiredFields
352
     */
353
    public function testCheckRequiredFields(
354
        $expectedResult,
355
        $toAddresses,
356
        $subject,
357
        $plainMessage,
358
        $htmlMessage,
359
        $attachments
360
    ) {
361
        $archangel = new Archangel();
362
363
        if (!empty($toAddresses)) {
364
            $toAddressesProperty = $this->getProtectedProperty('toAddresses');
365
            $toAddressesProperty->setValue($archangel, $toAddresses);
366
        }
367
368
        if (!empty($subject)) {
369
            $subjectProperty = $this->getProtectedProperty('subject');
370
            $subjectProperty->setValue($archangel, $subject);
371
        }
372
373
        if (!empty($plainMessage)) {
374
            $plainMessageProperty = $this->getProtectedProperty('plainMessage');
375
            $plainMessageProperty->setValue($archangel, $plainMessage);
376
        }
377
378
        if (!empty($htmlMessage)) {
379
            $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
380
            $htmlMessageProperty->setValue($archangel, $htmlMessage);
381
        }
382
383
        if (!empty($attachments)) {
384
            $attachmentsProperty = $this->getProtectedProperty('attachments');
385
            $attachmentsProperty->setValue($archangel, $attachments);
386
        }
387
388
        $checkMethod = $this->getProtectedMethod('checkRequiredFields');
389
        $isValid = $checkMethod->invoke($archangel);
390
391
        if ($expectedResult == true) {
392
            $this->assertTrue($isValid);
393
            return;
394
        }
395
        $this->assertNotTrue($isValid);
396
    }
397
398
    public function dataCheckRequiredFields()
399
    {
400
        return array(
401
            array(
402
                'expectedResult' => false,
403
                'toAddresses' => array(),
404
                'subject' => '',
405
                'plainMessage' => '',
406
                'htmlMessage' => '',
407
                'attachments' => array(),
408
            ),
409
            array(
410
                'expectedResult' => false,
411
                'toAddresses' => array('[email protected]'),
412
                'subject' => '',
413
                'plainMessage' => '',
414
                'htmlMessage' => '',
415
                'attachments' => array(),
416
            ),
417
            array(
418
                'expectedResult' => false,
419
                'toAddresses' => array('[email protected]'),
420
                'subject' => 'Test Subject',
421
                'plainMessage' => '',
422
                'htmlMessage' => '',
423
                'attachments' => array(),
424
            ),
425
            array(
426
                'expectedResult' => false,
427
                'toAddresses' => array(),
428
                'subject' => 'Test Subject',
429
                'plainMessage' => '',
430
                'htmlMessage' => '',
431
                'attachments' => array(),
432
            ),
433
            array(
434
                'expectedResult' => false,
435
                'toAddresses' => array(),
436
                'subject' => 'Test Subject',
437
                'plainMessage' => 'Plain text message',
438
                'htmlMessage' => '',
439
                'attachments' => array(),
440
            ),
441
            array(
442
                'expectedResult' => true,
443
                'toAddresses' => array('[email protected]'),
444
                'subject' => 'Test Subject',
445
                'plainMessage' => 'Plain text message',
446
                'htmlMessage' => '',
447
                'attachments' => array(),
448
            ),
449
            array(
450
                'expectedResult' => true,
451
                'toAddresses' => array('[email protected]'),
452
                'subject' => 'Test Subject',
453
                'plainMessage' => '',
454
                'htmlMessage' => '<p>An HTML message.</p>',
455
                'attachments' => array(),
456
            ),
457
            array(
458
                'expectedResult' => true,
459
                'toAddresses' => array('[email protected]'),
460
                'subject' => 'Test Subject',
461
                'plainMessage' => '',
462
                'htmlMessage' => '',
463
                'attachments' => array(
464
                    array('path' => 'path', 'type' => 'type'),
465
                ),
466
            ),
467
            array(
468
                'expectedResult' => true,
469
                'toAddresses' => array('[email protected]'),
470
                'subject' => 'Test Subject',
471
                'plainMessage' => 'Plain text message',
472
                'htmlMessage' => '<p>An HTML message.</p>',
473
                'attachments' => array(
474
                    array('path' => 'path', 'type' => 'type'),
475
                ),
476
            ),
477
       );
478
    }
479
 
480 View Code Duplication
    public function testBuildTo()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
481
    {
482
        $archangel = new Archangel();
483
        $addressesProperty = $this->getProtectedProperty('toAddresses');
484
        $addressesProperty->setValue($archangel, array('[email protected]'));
485
        $buildMethod = $this->getProtectedMethod('buildTo');
486
        $toAddresses = $buildMethod->invoke($archangel);
487
488
        $this->assertEquals('[email protected]', $toAddresses);
489
    }
490
491 View Code Duplication
    public function testBuildToMultiple()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
492
    {
493
        $archangel = new Archangel();
494
        $addressesProperty = $this->getProtectedProperty('toAddresses');
495
        $addressesProperty->setValue($archangel, array('[email protected]', '[email protected]'));
496
        $buildMethod = $this->getProtectedMethod('buildTo');
497
        $toAddresses = $buildMethod->invoke($archangel);
498
499
        $this->assertEquals('[email protected], [email protected]', $toAddresses);
500
    }
501
502
    public function testBuildMessageEmpty()
503
    {
504
        $archangel = new Archangel();
505
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
506
        $plainMessageProperty->setValue($archangel, '');
507
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
508
        $htmlMessageProperty->setValue($archangel, '');
509
        $buildMethod = $this->getProtectedMethod('buildMessage');
510
        $builtMessage = $buildMethod->invoke($archangel);
511
512
        $this->assertEmpty($builtMessage);
513
    }
514
515 View Code Duplication
    public function testBuildMessagePlain()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
516
    {
517
        $message = 'Plain text message';
518
519
        $archangel = new Archangel();
520
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
521
        $plainMessageProperty->setValue($archangel, $message);
522
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
523
        $htmlMessageProperty->setValue($archangel, '');
524
        $buildMethod = $this->getProtectedMethod('buildMessage');
525
        $builtMessage = $buildMethod->invoke($archangel);
526
527
        $this->assertEquals($message, $builtMessage);
528
    }
529
530 View Code Duplication
    public function testBuildMessageHtml()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
531
    {
532
        $message = '<p>HTML Message.</p>';
533
534
        $archangel = new Archangel();
535
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
536
        $plainMessageProperty->setValue($archangel, '');
537
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
538
        $htmlMessageProperty->setValue($archangel, $message);
539
        $buildMethod = $this->getProtectedMethod('buildMessage');
540
        $builtMessage = $buildMethod->invoke($archangel);
541
542
        $this->assertEquals($message, $builtMessage);
543
    }
544
545
    public function testBuildMessageMultipart()
546
    {
547
        $plainMessage = 'Plain text message';
548
        $htmlMessage = '<p>HTML Message.</p>';
549
550
        $archangel = new Archangel();
551
552
        $boundaryProperty = $this->getProtectedProperty('boundaryAlternative');
553
        $boundary = $boundaryProperty->getValue($archangel);
554
        $plainMsgMethod = $this->getProtectedMethod('buildPlainMessageHeader');
555
        $plainMsgHeaders = $plainMsgMethod->invoke($archangel);
556
        $htmlMsgMethod = $this->getProtectedMethod('buildHtmlMessageHeader');
557
        $htmlMsgHeaders = $htmlMsgMethod->invoke($archangel);
558
559
        $expectedMessage = array();
560
        array_push($expectedMessage, "--{$boundary}");
561
        $expectedMessage += $plainMsgHeaders;
562
        array_push($expectedMessage, $plainMessage);
563
        array_push($expectedMessage, "--{$boundary}");
564
        $expectedMessage += $htmlMsgHeaders;
565
        array_push($expectedMessage, $htmlMessage);
566
        array_push($expectedMessage, "--{$boundary}--");
567
        $expectedMessage = implode(Archangel::LINE_BREAK, $expectedMessage);
568
569
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
570
        $plainMessageProperty->setValue($archangel, $plainMessage);
571
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
572
        $htmlMessageProperty->setValue($archangel, $htmlMessage);
573
        $buildMethod = $this->getProtectedMethod('buildMessage');
574
        $builtMessage = $buildMethod->invoke($archangel);
575
576
        $this->assertEquals($expectedMessage, $builtMessage);
577
    }
578
579
    public function testBuildMessageWithAttachmentsEmpty()
580
    {
581
        $path = __DIR__ . '/test.txt';
582
        $textContent = 'Dummy Content';
583
        $this->makeTmpFile($path, $textContent);
584
585
        $encodedContent = chunk_split(base64_encode($textContent));
586
        $type = 'text/plain';
587
        $title = 'Test File';
588
589
        $archangel = new Archangel();
590
591
        $boundaryMixedProperty = $this->getProtectedProperty('boundaryMixed');
592
        $boundaryMixed = $boundaryMixedProperty->getValue($archangel);
593
594
        $expectedMessage = array();
595
        array_push($expectedMessage, "--{$boundaryMixed}");
596
        array_push($expectedMessage, "Content-Type: {$type}; name=\"{$title}\"");
597
        array_push($expectedMessage, 'Content-Transfer-Encoding: base64');
598
        array_push($expectedMessage, 'Content-Disposition: attachment');
599
        array_push($expectedMessage, '');
600
        array_push($expectedMessage, $encodedContent);
601
        array_push($expectedMessage, "--{$boundaryMixed}--");
602
        $expectedMessage = implode(Archangel::LINE_BREAK, $expectedMessage);
603
604
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
605
        $plainMessageProperty->setValue($archangel, '');
606
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
607
        $htmlMessageProperty->setValue($archangel, '');
608
        $attachmentProperty = $this->getProtectedProperty('attachments');
609
        $attachmentProperty->setValue($archangel, array(
610
            array('path' => $path, 'type' => $type, 'title' => $title)
611
        ));
612
        $buildMethod = $this->getProtectedMethod('buildMessageWithAttachments');
613
        $builtMessage = $buildMethod->invoke($archangel);
614
615
        unlink($path);
616
        $this->assertEquals($expectedMessage, $builtMessage);
617
    }
618
619 View Code Duplication
    public function testBuildMessageWithAttachmentsPlain()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
620
    {
621
        $path = __DIR__ . '/test.txt';
622
        $textContent = 'Dummy Content';
623
        $this->makeTmpFile($path, $textContent);
624
625
        $encodedContent = chunk_split(base64_encode($textContent));
626
        $type = 'text/plain';
627
        $title = 'Test File';
628
        $message = 'Plain text message';
629
630
        $archangel = new Archangel();
631
632
        $boundaryMixedProperty = $this->getProtectedProperty('boundaryMixed');
633
        $boundaryMixed = $boundaryMixedProperty->getValue($archangel);
634
        $plainMsgMethod = $this->getProtectedMethod('buildPlainMessageHeader');
635
        $plainMsgHeaders = $plainMsgMethod->invoke($archangel);
636
637
        $expectedMessage = array();
638
        array_push($expectedMessage, "--{$boundaryMixed}");
639
        $expectedMessage += $plainMsgHeaders;
640
        array_push($expectedMessage, $message);
641
        array_push($expectedMessage, "--{$boundaryMixed}");
642
        array_push($expectedMessage, "Content-Type: {$type}; name=\"{$title}\"");
643
        array_push($expectedMessage, 'Content-Transfer-Encoding: base64');
644
        array_push($expectedMessage, 'Content-Disposition: attachment');
645
        array_push($expectedMessage, '');
646
        array_push($expectedMessage, $encodedContent);
647
        array_push($expectedMessage, "--{$boundaryMixed}--");
648
        $expectedMessage = implode(Archangel::LINE_BREAK, $expectedMessage);
649
650
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
651
        $plainMessageProperty->setValue($archangel, $message);
652
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
653
        $htmlMessageProperty->setValue($archangel, '');
654
        $attachmentProperty = $this->getProtectedProperty('attachments');
655
        $attachmentProperty->setValue($archangel, array(
656
            array('path' => $path, 'type' => $type, 'title' => $title)
657
        ));
658
        $buildMethod = $this->getProtectedMethod('buildMessageWithAttachments');
659
        $builtMessage = $buildMethod->invoke($archangel);
660
661
        unlink($path);
662
        $this->assertEquals($expectedMessage, $builtMessage);
663
    }
664
665 View Code Duplication
    public function testBuildMessageWithAttachmentsHtml()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
666
    {
667
        $path = __DIR__ . '/test.txt';
668
        $textContent = 'Dummy Content';
669
        $this->makeTmpFile($path, $textContent);
670
671
        $encodedContent = chunk_split(base64_encode($textContent));
672
        $type = 'text/plain';
673
        $title = 'Test File';
674
        $message = '<p>HTML Message.</p>';
675
676
        $archangel = new Archangel();
677
678
        $boundaryMixedProperty = $this->getProtectedProperty('boundaryMixed');
679
        $boundaryMixed = $boundaryMixedProperty->getValue($archangel);
680
        $htmlMsgMethod = $this->getProtectedMethod('buildHtmlMessageHeader');
681
        $htmlMsgHeaders = $htmlMsgMethod->invoke($archangel);
682
683
        $expectedMessage = array();
684
        array_push($expectedMessage, "--{$boundaryMixed}");
685
        $expectedMessage += $htmlMsgHeaders;
686
        array_push($expectedMessage, $message);
687
        array_push($expectedMessage, "--{$boundaryMixed}");
688
        array_push($expectedMessage, "Content-Type: {$type}; name=\"{$title}\"");
689
        array_push($expectedMessage, 'Content-Transfer-Encoding: base64');
690
        array_push($expectedMessage, 'Content-Disposition: attachment');
691
        array_push($expectedMessage, '');
692
        array_push($expectedMessage, $encodedContent);
693
        array_push($expectedMessage, "--{$boundaryMixed}--");
694
        $expectedMessage = implode(Archangel::LINE_BREAK, $expectedMessage);
695
696
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
697
        $plainMessageProperty->setValue($archangel, '');
698
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
699
        $htmlMessageProperty->setValue($archangel, $message);
700
        $attachmentProperty = $this->getProtectedProperty('attachments');
701
        $attachmentProperty->setValue($archangel, array(
702
            array('path' => $path, 'type' => $type, 'title' => $title)
703
        ));
704
        $buildMethod = $this->getProtectedMethod('buildMessageWithAttachments');
705
        $builtMessage = $buildMethod->invoke($archangel);
706
707
        unlink($path);
708
        $this->assertEquals($expectedMessage, $builtMessage);
709
    }
710
711
    public function testBuildMessageWithAttachmentsMultipart()
712
    {
713
        $path = __DIR__ . '/test.txt';
714
        $textContent = 'Dummy Content';
715
        $this->makeTmpFile($path, $textContent);
716
717
        $encodedContent = chunk_split(base64_encode($textContent));
718
        $type = 'text/plain';
719
        $title = 'Test File';
720
        $plainMessage = 'Plain text message';
721
        $htmlMessage = '<p>HTML Message.</p>';
722
723
        $archangel = new Archangel();
724
725
        $boundaryMixedProperty = $this->getProtectedProperty('boundaryMixed');
726
        $boundaryMixed = $boundaryMixedProperty->getValue($archangel);
727
        $boundaryAltProperty = $this->getProtectedProperty('boundaryAlternative');
728
        $boundaryAlternative = $boundaryAltProperty->getValue($archangel);
729
        $plainMsgMethod = $this->getProtectedMethod('buildPlainMessageHeader');
730
        $plainMsgHeaders = $plainMsgMethod->invoke($archangel);
731
        $htmlMsgMethod = $this->getProtectedMethod('buildHtmlMessageHeader');
732
        $htmlMsgHeaders = $htmlMsgMethod->invoke($archangel);
733
734
        $expectedMessage = array();
735
        array_push($expectedMessage, "--{$boundaryMixed}");
736
        array_push($expectedMessage, "Content-Type: multipart/alternative; boundary={$boundaryAlternative}");
737
        array_push($expectedMessage, '');
738
        array_push($expectedMessage, "--{$boundaryAlternative}");
739
        $expectedMessage += $plainMsgHeaders;
740
        array_push($expectedMessage, $plainMessage);
741
        array_push($expectedMessage, "--{$boundaryAlternative}");
742
        $expectedMessage += $htmlMsgHeaders;
743
        array_push($expectedMessage, $htmlMessage);
744
        array_push($expectedMessage, "--{$boundaryAlternative}--");
745
        array_push($expectedMessage, '');
746
        array_push($expectedMessage, "--{$boundaryMixed}");
747
        array_push($expectedMessage, "Content-Type: {$type}; name=\"{$title}\"");
748
        array_push($expectedMessage, 'Content-Transfer-Encoding: base64');
749
        array_push($expectedMessage, 'Content-Disposition: attachment');
750
        array_push($expectedMessage, '');
751
        array_push($expectedMessage, $encodedContent);
752
        array_push($expectedMessage, "--{$boundaryMixed}--");
753
        $expectedMessage = implode(Archangel::LINE_BREAK, $expectedMessage);
754
755
        $plainMessageProperty = $this->getProtectedProperty('plainMessage');
756
        $plainMessageProperty->setValue($archangel, $plainMessage);
757
        $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
758
        $htmlMessageProperty->setValue($archangel, $htmlMessage);
759
        $attachmentProperty = $this->getProtectedProperty('attachments');
760
        $attachmentProperty->setValue($archangel, array(
761
            array('path' => $path, 'type' => $type, 'title' => $title)
762
        ));
763
        $buildMethod = $this->getProtectedMethod('buildMessageWithAttachments');
764
        $builtMessage = $buildMethod->invoke($archangel);
765
766
        unlink($path);
767
        $this->assertEquals($expectedMessage, $builtMessage);
768
    }
769
770 View Code Duplication
    public function testBuildPlainMessageHeader()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
771
    {
772
        $expectedMessageHeader = array(
773
            'Content-Type: text/plain; charset="iso-8859"',
774
            'Content-Transfer-Encoding: 7bit',
775
            '',
776
        );
777
778
        $archangel = new Archangel();
779
        $buildMethod = $this->getProtectedMethod('buildPlainMessageHeader');
780
        $messageHeader = $buildMethod->invoke($archangel);
781
782
        $this->assertEquals($expectedMessageHeader, $messageHeader);
783
    }
784
785 View Code Duplication
    public function testBuildHtmlMessageHeader()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
786
    {
787
        $expectedMessageHeader = array(
788
            'Content-Type: text/html; charset="iso-8859-1"',
789
            'Content-Transfer-Encoding: 7bit',
790
            '',
791
        );
792
793
        $archangel = new Archangel();
794
        $buildMethod = $this->getProtectedMethod('buildHtmlMessageHeader');
795
        $messageHeader = $buildMethod->invoke($archangel);
796
797
        $this->assertEquals($expectedMessageHeader, $messageHeader);
798
    }
799
800
    /**
801
     * @dataProvider dataBuildHeaders
802
     */
803
    public function testBuildHeaders(
804
        $expectedHeaders,
805
        $headers,
806
        $attachments,
807
        $plainMessage,
808
        $htmlMessage
809
    ) {
810
        $archangel = new Archangel();
811
        $headersProperty = $this->getProtectedProperty('headers');
812
        $headersProperty->setValue($archangel, $headers);
813
814
        if (!empty($attachments)) {
815
            $attachmentsProperty = $this->getProtectedProperty('attachments');
816
            $attachmentsProperty->setValue($archangel, $attachments);
817
        }
818
819
        if (!empty($plainMessage)) {
820
            $plainMessageProperty = $this->getProtectedProperty('plainMessage');
821
            $plainMessageProperty->setValue($archangel, $plainMessage);
822
        }
823
824
        if (!empty($htmlMessage)) {
825
            $htmlMessageProperty = $this->getProtectedProperty('htmlMessage');
826
            $htmlMessageProperty->setValue($archangel, $htmlMessage);
827
        }
828
829
        $buildHeadersMethod = $this->getProtectedMethod('buildHeaders');
830
        $builtHeaders = $buildHeadersMethod->invoke($archangel);
831
832
        $this->assertEquals($expectedHeaders, $builtHeaders);
833
    }
834
835
    public function dataBuildHeaders()
836
    {
837
        return array(
838
            array(
839
                'expectedHeaders' =>
840
                    "From: [email protected]\r\n" .
841
                    "X-Mailer: PHP/6.0.0",
842
                'headers' => array(
843
                    'From' => '[email protected]',
844
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
845
                ),
846
                'attachments' => null,
847
                'plainMessage' => true,
848
                'htmlMessage' => null,
849
            ),
850
            array(
851
                'expectedHeaders' =>
852
                    "CC: [email protected], [email protected]\r\n" .
853
                    "From: [email protected]\r\n" .
854
                    "X-Mailer: PHP/6.0.0",
855
                'headers' => array(
856
                    'CC' => array('[email protected]', '[email protected]'),
857
                    'From' => '[email protected]',
858
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
859
                ),
860
                'attachments' => null,
861
                'plainMessage' => true,
862
                'htmlMessage' => null,
863
            ),
864
            array(
865
                'expectedHeaders' =>
866
                    "BCC: [email protected], [email protected]\r\n" .
867
                    "From: [email protected]\r\n" .
868
                    "X-Mailer: PHP/6.0.0",
869
                'headers' => array(
870
                    'BCC' => array('[email protected]', '[email protected]'),
871
                    'From' => '[email protected]',
872
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
873
                ),
874
                'attachments' => null,
875
                'plainMessage' => true,
876
                'htmlMessage' => null,
877
            ),
878
            array(
879
                'expectedHeaders' =>
880
                    "From: [email protected]\r\n" .
881
                    "X-Mailer: PHP/6.0.0\r\n" .
882
                    "Content-Type: multipart/mixed; boundary=\"PHP-mixed-1234567890123\"",
883
                'headers' => array(
884
                    'From' => '[email protected]',
885
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
886
                ),
887
                'attachments' => true,
888
                'plainMessage' => true,
889
                'htmlMessage' => null,
890
            ),
891
            array(
892
                'expectedHeaders' =>
893
                    "From: [email protected]\r\n" .
894
                    "X-Mailer: PHP/6.0.0\r\n" .
895
                    "Content-Type: multipart/alternative; boundary=\"PHP-alternative-1234567890123\"",
896
                'headers' => array(
897
                    'From' => '[email protected]',
898
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
899
                ),
900
                'attachments' => null,
901
                'plainMessage' => true,
902
                'htmlMessage' => true,
903
            ),
904
            array(
905
                'expectedHeaders' =>
906
                    "From: [email protected]\r\n" .
907
                    "X-Mailer: PHP/6.0.0\r\n" .
908
                    "Content-type: text/html; charset=\"iso-8859-1\"",
909
                'headers' => array(
910
                    'From' => '[email protected]',
911
                    'X-Mailer' => sprintf('PHP/%s', phpversion())
912
                ),
913
                'attachments' => null,
914
                'plainMessage' => null,
915
                'htmlMessage' => true,
916
            ),
917
        );
918
    }
919
920
    public function testBuildAttachmentContent()
921
    {
922
        $path = __DIR__ . '/test.txt';
923
        $textContent = 'Dummy Content';
924
        $this->makeTmpFile($path, $textContent);
925
926
        $expectedContent = chunk_split(base64_encode($textContent));
927
928
        $archangel = new Archangel();
929
        $buildMethod = $this->getProtectedMethod('buildAttachmentContent');
930
        $content = $buildMethod->invokeArgs($archangel, array($path));
931
932
        unlink($path);
933
        $this->assertEquals($expectedContent, $content);
934
    }
935
936
    public function testBuildAttachmentContentFailure()
937
    {
938
        $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
939
940
        $archangel = new Archangel();
941
        $archangel->setLogger($logger);
942
        $buildMethod = $this->getProtectedMethod('buildAttachmentContent');
943
        $content = $buildMethod->invokeArgs($archangel, array('INVALID_PATH'));
944
945
        $this->assertEmpty($content);
946
    }
947
948
    protected function getProtectedProperty($property)
949
    {
950
        $reflectedArchangel = new ReflectionClass('Jacobemerick\Archangel\Archangel');
951
        $reflectedProperty = $reflectedArchangel->getProperty($property);
952
        $reflectedProperty->setAccessible(true);
953
954
        return $reflectedProperty;
955
    }
956
957
    protected function getProtectedMethod($method)
958
    {
959
        $reflectedArchangel = new ReflectionClass('Jacobemerick\Archangel\Archangel');
960
        $reflectedMethod = $reflectedArchangel->getMethod($method);
961
        $reflectedMethod->setAccessible(true);
962
963
        return $reflectedMethod;
964
    }
965
966
    protected function makeTmpFile($path, $content)
967
    {
968
        $handle = fopen($path, 'w');
969
        fwrite($handle, $content);
970
        fclose($handle);
971
    }
972
}
973