統計
| ブランチ: | リビジョン:

pictcode / lib / Cake / Test / Case / Controller / Component / EmailComponentTest.php @ 635eef61

履歴 | 表示 | アノテート | ダウンロード (31.316 KB)

1
<?php
2
/**
3
 * EmailComponentTest file
4
 *
5
 * Series of tests for email component.
6
 *
7
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
8
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
9
 *
10
 * Licensed under The MIT License
11
 * For full copyright and license information, please see the LICENSE.txt
12
 * Redistributions of files must retain the above copyright notice
13
 *
14
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
15
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
16
 * @package       Cake.Test.Case.Controller.Component
17
 * @since         CakePHP(tm) v 1.2.0.5347
18
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
19
 */
20

    
21
App::uses('Controller', 'Controller');
22
App::uses('EmailComponent', 'Controller/Component');
23
App::uses('AbstractTransport', 'Network/Email');
24

    
25
/**
26
 * EmailTestComponent class
27
 *
28
 * @package       Cake.Test.Case.Controller.Component
29
 */
30
class EmailTestComponent extends EmailComponent {
31

    
32
/**
33
 * Convenience method for testing.
34
 *
35
 * @return string
36
 */
37
        public function strip($content, $message = false) {
38
                return parent::_strip($content, $message);
39
        }
40

    
41
}
42

    
43
/**
44
 * DebugCompTransport class
45
 *
46
 * @package       Cake.Test.Case.Controller.Component
47
 */
48
class DebugCompTransport extends AbstractTransport {
49

    
50
/**
51
 * Last email
52
 *
53
 * @var string
54
 */
55
        public static $lastEmail = null;
56

    
57
/**
58
 * Send mail
59
 *
60
 * @params object $email CakeEmail
61
 * @return bool
62
 */
63
        public function send(CakeEmail $email) {
64
                $email->addHeaders(array('Date' => EmailComponentTest::$sentDate));
65
                $headers = $email->getHeaders(array_fill_keys(array('from', 'replyTo', 'readReceipt', 'returnPath', 'to', 'cc', 'bcc', 'subject'), true));
66
                $to = $headers['To'];
67
                $subject = $headers['Subject'];
68
                unset($headers['To'], $headers['Subject']);
69

    
70
                $message = implode("\n", $email->message());
71

    
72
                $last = '<pre>';
73
                $last .= sprintf("%s %s\n", 'To:', $to);
74
                $last .= sprintf("%s %s\n", 'From:', $headers['From']);
75
                $last .= sprintf("%s %s\n", 'Subject:', $subject);
76
                $last .= sprintf("%s\n\n%s", 'Header:', $this->_headersToString($headers, "\n"));
77
                $last .= sprintf("%s\n\n%s", 'Message:', $message);
78
                $last .= '</pre>';
79

    
80
                static::$lastEmail = $last;
81

    
82
                return true;
83
        }
84

    
85
}
86

    
87
/**
88
 * EmailTestController class
89
 *
90
 * @package       Cake.Test.Case.Controller.Component
91
 */
92
class EmailTestController extends Controller {
93

    
94
/**
95
 * uses property
96
 *
97
 * @var mixed
98
 */
99
        public $uses = null;
100

    
101
/**
102
 * components property
103
 *
104
 * @var array
105
 */
106
        public $components = array('Session', 'EmailTest');
107

    
108
}
109

    
110
/**
111
 * EmailTest class
112
 *
113
 * @package       Cake.Test.Case.Controller.Component
114
 */
115
class EmailComponentTest extends CakeTestCase {
116

    
117
/**
118
 * Controller property
119
 *
120
 * @var EmailTestController
121
 */
122
        public $Controller;
123

    
124
/**
125
 * name property
126
 *
127
 * @var string
128
 */
129
        public $name = 'Email';
130

    
131
/**
132
 * sentDate
133
 *
134
 * @var string
135
 */
136
        public static $sentDate = null;
137

    
138
/**
139
 * setUp method
140
 *
141
 * @return void
142
 */
143
        public function setUp() {
144
                parent::setUp();
145

    
146
                Configure::write('App.encoding', 'UTF-8');
147

    
148
                $this->Controller = new EmailTestController();
149
                $this->Controller->Components->init($this->Controller);
150
                $this->Controller->EmailTest->initialize($this->Controller, array());
151

    
152
                static::$sentDate = date(DATE_RFC2822);
153

    
154
                App::build(array(
155
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
156
                ));
157
        }
158

    
159
/**
160
 * testSendFormats method
161
 *
162
 * @return void
163
 */
164
        public function testSendFormats() {
165
                $this->Controller->EmailTest->to = 'postmaster@example.com';
166
                $this->Controller->EmailTest->from = 'noreply@example.com';
167
                $this->Controller->EmailTest->subject = 'Cake SMTP test';
168
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
169
                $this->Controller->EmailTest->template = null;
170
                $this->Controller->EmailTest->delivery = 'DebugComp';
171
                $this->Controller->EmailTest->messageId = false;
172

    
173
                $date = static::$sentDate;
174
                $message = <<<MSGBLOC
175
<pre>To: postmaster@example.com
176
From: noreply@example.com
177
Subject: Cake SMTP test
178
Header:
179

180
From: noreply@example.com
181
Reply-To: noreply@example.com
182
X-Mailer: CakePHP Email Component
183
Date: $date
184
MIME-Version: 1.0
185
Content-Type: {CONTENTTYPE}
186
Content-Transfer-Encoding: 8bitMessage:
187

188
This is the body of the message
189

190
</pre>
191
MSGBLOC;
192

    
193
                $this->Controller->EmailTest->sendAs = 'text';
194
                $expected = str_replace('{CONTENTTYPE}', 'text/plain; charset=UTF-8', $message);
195
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
196
                $this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
197

    
198
                $this->Controller->EmailTest->sendAs = 'html';
199
                $expected = str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $message);
200
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
201
                $this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
202
        }
203

    
204
/**
205
 * testTemplates method
206
 *
207
 * @return void
208
 */
209
        public function testTemplates() {
210
                ClassRegistry::flush();
211

    
212
                $this->Controller->EmailTest->to = 'postmaster@example.com';
213
                $this->Controller->EmailTest->from = 'noreply@example.com';
214
                $this->Controller->EmailTest->subject = 'Cake SMTP test';
215
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
216

    
217
                $this->Controller->EmailTest->delivery = 'DebugComp';
218
                $this->Controller->EmailTest->messageId = false;
219

    
220
                $date = static::$sentDate;
221
                $header = <<<HEADBLOC
222
To: postmaster@example.com
223
From: noreply@example.com
224
Subject: Cake SMTP test
225
Header:
226

227
From: noreply@example.com
228
Reply-To: noreply@example.com
229
X-Mailer: CakePHP Email Component
230
Date: $date
231
MIME-Version: 1.0
232
Content-Type: {CONTENTTYPE}
233
Content-Transfer-Encoding: 8bitMessage:
234

235

236
HEADBLOC;
237

    
238
                $this->Controller->EmailTest->layout = 'default';
239
                $this->Controller->EmailTest->template = 'default';
240
                $this->Controller->set('title_for_layout', 'Email Test');
241

    
242
                $text = <<<TEXTBLOC
243

244
This is the body of the message
245

246
This email was sent using the CakePHP Framework, http://cakephp.org.
247
TEXTBLOC;
248

    
249
                $html = <<<HTMLBLOC
250
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
251

252
<html>
253
<head>
254
        <title>Email Test</title>
255
</head>
256

257
<body>
258
        <p> This is the body of the message</p><p> </p>
259
        <p>This email was sent using the <a href="http://cakephp.org">CakePHP Framework</a></p>
260
</body>
261
</html>
262
HTMLBLOC;
263

    
264
                $this->Controller->EmailTest->sendAs = 'text';
265
                $expected = '<pre>' . str_replace('{CONTENTTYPE}', 'text/plain; charset=UTF-8', $header) . $text . "\n" . '</pre>';
266
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
267
                $this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
268

    
269
                $this->Controller->EmailTest->sendAs = 'html';
270
                $expected = '<pre>' . str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $header) . $html . "\n" . '</pre>';
271
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
272
                $this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
273

    
274
                $this->Controller->EmailTest->sendAs = 'both';
275
                $expected = str_replace('{CONTENTTYPE}', 'multipart/alternative; boundary="{boundary}"', $header);
276
                $expected .= "--{boundary}\n" .
277
                        'Content-Type: text/plain; charset=UTF-8' . "\n" .
278
                        'Content-Transfer-Encoding: 8bit' . "\n\n" .
279
                        $text .
280
                        "\n\n" .
281
                        '--{boundary}' . "\n" .
282
                        'Content-Type: text/html; charset=UTF-8' . "\n" .
283
                        'Content-Transfer-Encoding: 8bit' . "\n\n" .
284
                        $html .
285
                        "\n\n\n" .
286
                        '--{boundary}--' . "\n";
287

    
288
                $expected = '<pre>' . $expected . '</pre>';
289

    
290
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
291
                $this->assertTextEquals(
292
                        $expected,
293
                        preg_replace('/[a-z0-9]{32}/i', '{boundary}', DebugCompTransport::$lastEmail)
294
                );
295

    
296
                $html = <<<HTMLBLOC
297
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
298

299
<html>
300
<head>
301
        <title>Email Test</title>
302
</head>
303

304
<body>
305
        <p> This is the body of the message</p><p> </p>
306
        <p>This email was sent using the CakePHP Framework</p>
307
</body>
308
</html>
309

310
HTMLBLOC;
311

    
312
                $this->Controller->EmailTest->sendAs = 'html';
313
                $expected = '<pre>' . str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $header) . $html . '</pre>';
314
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message', 'default', 'thin'));
315
                $this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
316
        }
317

    
318
/**
319
 * test that elements used in email templates get helpers.
320
 *
321
 * @return void
322
 */
323
        public function testTemplateNestedElements() {
324
                $this->Controller->EmailTest->to = 'postmaster@example.com';
325
                $this->Controller->EmailTest->from = 'noreply@example.com';
326
                $this->Controller->EmailTest->subject = 'Cake SMTP test';
327
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
328

    
329
                $this->Controller->EmailTest->delivery = 'DebugComp';
330
                $this->Controller->EmailTest->messageId = false;
331
                $this->Controller->EmailTest->layout = 'default';
332
                $this->Controller->EmailTest->template = 'nested_element';
333
                $this->Controller->EmailTest->sendAs = 'html';
334
                $this->Controller->helpers = array('Html');
335

    
336
                $this->Controller->EmailTest->send();
337
                $result = DebugCompTransport::$lastEmail;
338
                $this->assertRegExp('/Test/', $result);
339
                $this->assertRegExp('/http\:\/\/example\.com/', $result);
340
        }
341

    
342
/**
343
 * test send with null properties
344
 *
345
 * @return void
346
 */
347
        public function testSendNullProperties() {
348
                $this->Controller->EmailTest->to = 'test@example.com';
349
                $this->Controller->EmailTest->from = 'test@example.com';
350
                $this->Controller->EmailTest->subject = null;
351
                $this->Controller->EmailTest->replyTo = null;
352
                $this->Controller->EmailTest->messageId = null;
353
                $this->Controller->EmailTest->template = null;
354

    
355
                $this->Controller->EmailTest->delivery = 'DebugComp';
356
                $this->assertTrue($this->Controller->EmailTest->send(null));
357
                $result = DebugCompTransport::$lastEmail;
358

    
359
                $this->assertRegExp('/To: test@example.com\n/', $result);
360
                $this->assertRegExp('/Subject: \n/', $result);
361
                $this->assertRegExp('/From: test@example.com\n/', $result);
362
                $this->assertRegExp('/Date: ' . preg_quote(static::$sentDate) . '\n/', $result);
363
                $this->assertRegExp('/X-Mailer: CakePHP Email Component\n/', $result);
364
                $this->assertRegExp('/Content-Type: text\/plain; charset=UTF-8\n/', $result);
365
                $this->assertRegExp('/Content-Transfer-Encoding: 8bitMessage:\n/', $result);
366
        }
367

    
368
/**
369
 * testSendDebug method
370
 *
371
 * @return void
372
 */
373
        public function testSendDebug() {
374
                $this->Controller->EmailTest->to = 'postmaster@example.com';
375
                $this->Controller->EmailTest->from = 'noreply@example.com';
376
                $this->Controller->EmailTest->cc = 'cc@example.com';
377
                $this->Controller->EmailTest->bcc = 'bcc@example.com';
378
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
379
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
380
                $this->Controller->EmailTest->template = null;
381

    
382
                $this->Controller->EmailTest->delivery = 'DebugComp';
383
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
384
                $result = DebugCompTransport::$lastEmail;
385

    
386
                $this->assertRegExp('/To: postmaster@example.com\n/', $result);
387
                $this->assertRegExp('/Subject: Cake Debug Test\n/', $result);
388
                $this->assertRegExp('/Reply-To: noreply@example.com\n/', $result);
389
                $this->assertRegExp('/From: noreply@example.com\n/', $result);
390
                $this->assertRegExp('/Cc: cc@example.com\n/', $result);
391
                $this->assertRegExp('/Bcc: bcc@example.com\n/', $result);
392
                $this->assertRegExp('/Date: ' . preg_quote(static::$sentDate) . '\n/', $result);
393
                $this->assertRegExp('/X-Mailer: CakePHP Email Component\n/', $result);
394
                $this->assertRegExp('/Content-Type: text\/plain; charset=UTF-8\n/', $result);
395
                $this->assertRegExp('/Content-Transfer-Encoding: 8bitMessage:\n/', $result);
396
                $this->assertRegExp('/This is the body of the message/', $result);
397
        }
398

    
399
/**
400
 * test send with delivery = debug and not using sessions.
401
 *
402
 * @return void
403
 */
404
        public function testSendDebugWithNoSessions() {
405
                $session = $this->Controller->Session;
406
                unset($this->Controller->Session);
407
                $this->Controller->EmailTest->to = 'postmaster@example.com';
408
                $this->Controller->EmailTest->from = 'noreply@example.com';
409
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
410
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
411
                $this->Controller->EmailTest->template = null;
412

    
413
                $this->Controller->EmailTest->delivery = 'DebugComp';
414
                $this->Controller->EmailTest->send('This is the body of the message');
415
                $result = DebugCompTransport::$lastEmail;
416

    
417
                $this->assertRegExp('/To: postmaster@example.com\n/', $result);
418
                $this->assertRegExp('/Subject: Cake Debug Test\n/', $result);
419
                $this->assertRegExp('/Reply-To: noreply@example.com\n/', $result);
420
                $this->assertRegExp('/From: noreply@example.com\n/', $result);
421
                $this->assertRegExp('/Date: ' . preg_quote(static::$sentDate) . '\n/', $result);
422
                $this->assertRegExp('/X-Mailer: CakePHP Email Component\n/', $result);
423
                $this->assertRegExp('/Content-Type: text\/plain; charset=UTF-8\n/', $result);
424
                $this->assertRegExp('/Content-Transfer-Encoding: 8bitMessage:\n/', $result);
425
                $this->assertRegExp('/This is the body of the message/', $result);
426
                $this->Controller->Session = $session;
427
        }
428

    
429
/**
430
 * testMessageRetrievalWithoutTemplate method
431
 *
432
 * @return void
433
 */
434
        public function testMessageRetrievalWithoutTemplate() {
435
                App::build(array(
436
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
437
                ));
438

    
439
                $this->Controller->EmailTest->to = 'postmaster@example.com';
440
                $this->Controller->EmailTest->from = 'noreply@example.com';
441
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
442
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
443
                $this->Controller->EmailTest->layout = 'default';
444
                $this->Controller->EmailTest->template = null;
445

    
446
                $this->Controller->EmailTest->delivery = 'DebugComp';
447

    
448
                $text = $html = "This is the body of the message\n";
449

    
450
                $this->Controller->EmailTest->sendAs = 'both';
451
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
452
                $this->assertTextEquals($this->Controller->EmailTest->textMessage, $text);
453
                $this->assertTextEquals($this->Controller->EmailTest->htmlMessage, $html);
454

    
455
                $this->Controller->EmailTest->sendAs = 'text';
456
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
457
                $this->assertTextEquals($this->Controller->EmailTest->textMessage, $text);
458
                $this->assertNull($this->Controller->EmailTest->htmlMessage);
459

    
460
                $this->Controller->EmailTest->sendAs = 'html';
461
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
462
                $this->assertNull($this->Controller->EmailTest->textMessage);
463
                $this->assertTextEquals($this->Controller->EmailTest->htmlMessage, $html);
464
        }
465

    
466
/**
467
 * testMessageRetrievalWithTemplate method
468
 *
469
 * @return void
470
 */
471
        public function testMessageRetrievalWithTemplate() {
472
                App::build(array(
473
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
474
                ));
475

    
476
                $this->Controller->set('value', 22091985);
477
                $this->Controller->set('title_for_layout', 'EmailTest');
478

    
479
                $this->Controller->EmailTest->to = 'postmaster@example.com';
480
                $this->Controller->EmailTest->from = 'noreply@example.com';
481
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
482
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
483
                $this->Controller->EmailTest->layout = 'default';
484
                $this->Controller->EmailTest->template = 'custom';
485

    
486
                $this->Controller->EmailTest->delivery = 'DebugComp';
487

    
488
                $text = <<<TEXTBLOC
489

490
Here is your value: 22091985
491
This email was sent using the CakePHP Framework, http://cakephp.org.
492
TEXTBLOC;
493

    
494
                $html = <<<HTMLBLOC
495
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
496

497
<html>
498
<head>
499
        <title>EmailTest</title>
500
</head>
501

502
<body>
503
        <p>Here is your value: <b>22091985</b></p>
504

505
        <p>This email was sent using the <a href="http://cakephp.org">CakePHP Framework</a></p>
506
</body>
507
</html>
508
HTMLBLOC;
509

    
510
                $this->Controller->EmailTest->sendAs = 'both';
511
                $this->assertTrue($this->Controller->EmailTest->send());
512
                $this->assertTextEquals($this->Controller->EmailTest->textMessage, $text);
513
                $this->assertTextEquals($this->Controller->EmailTest->htmlMessage, $html);
514

    
515
                $this->Controller->EmailTest->sendAs = 'text';
516
                $this->assertTrue($this->Controller->EmailTest->send());
517
                $this->assertTextEquals($this->Controller->EmailTest->textMessage, $text);
518
                $this->assertNull($this->Controller->EmailTest->htmlMessage);
519

    
520
                $this->Controller->EmailTest->sendAs = 'html';
521
                $this->assertTrue($this->Controller->EmailTest->send());
522
                $this->assertNull($this->Controller->EmailTest->textMessage);
523
                $this->assertTextEquals($this->Controller->EmailTest->htmlMessage, $html);
524
        }
525

    
526
/**
527
 * testMessageRetrievalWithHelper method
528
 *
529
 * @return void
530
 */
531
        public function testMessageRetrievalWithHelper() {
532
                App::build(array(
533
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
534
                ));
535

    
536
                $timestamp = time();
537
                $this->Controller->set('time', $timestamp);
538
                $this->Controller->set('title_for_layout', 'EmailTest');
539
                $this->Controller->helpers = array('Time');
540

    
541
                $this->Controller->EmailTest->to = 'postmaster@example.com';
542
                $this->Controller->EmailTest->from = 'noreply@example.com';
543
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
544
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
545
                $this->Controller->EmailTest->layout = 'default';
546
                $this->Controller->EmailTest->template = 'custom_helper';
547
                $this->Controller->EmailTest->sendAs = 'text';
548
                $this->Controller->EmailTest->delivery = 'DebugComp';
549

    
550
                $this->assertTrue($this->Controller->EmailTest->send());
551
                $this->assertTrue((bool)strpos($this->Controller->EmailTest->textMessage, 'Right now: ' . date('Y-m-d\TH:i:s\Z', $timestamp)));
552
        }
553

    
554
/**
555
 * testContentArray method
556
 *
557
 * @return void
558
 */
559
        public function testSendContentArray() {
560
                $this->Controller->EmailTest->to = 'postmaster@example.com';
561
                $this->Controller->EmailTest->from = 'noreply@example.com';
562
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
563
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
564
                $this->Controller->EmailTest->template = null;
565
                $this->Controller->EmailTest->delivery = 'DebugComp';
566

    
567
                $content = array('First line', 'Second line', 'Third line');
568
                $this->assertTrue($this->Controller->EmailTest->send($content));
569
                $result = DebugCompTransport::$lastEmail;
570

    
571
                $this->assertRegExp('/To: postmaster@example.com\n/', $result);
572
                $this->assertRegExp('/Subject: Cake Debug Test\n/', $result);
573
                $this->assertRegExp('/Reply-To: noreply@example.com\n/', $result);
574
                $this->assertRegExp('/From: noreply@example.com\n/', $result);
575
                $this->assertRegExp('/X-Mailer: CakePHP Email Component\n/', $result);
576
                $this->assertRegExp('/Content-Type: text\/plain; charset=UTF-8\n/', $result);
577
                $this->assertRegExp('/Content-Transfer-Encoding: 8bitMessage:\n/', $result);
578
                $this->assertRegExp('/First line\n/', $result);
579
                $this->assertRegExp('/Second line\n/', $result);
580
                $this->assertRegExp('/Third line\n/', $result);
581
        }
582

    
583
/**
584
 * test setting a custom date.
585
 *
586
 * @return void
587
 */
588
        public function testDateProperty() {
589
                $this->Controller->EmailTest->to = 'postmaster@example.com';
590
                $this->Controller->EmailTest->from = 'noreply@example.com';
591
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
592
                $this->Controller->EmailTest->date = static::$sentDate = 'Today!';
593
                $this->Controller->EmailTest->template = null;
594
                $this->Controller->EmailTest->delivery = 'DebugComp';
595

    
596
                $this->assertTrue($this->Controller->EmailTest->send('test message'));
597
                $result = DebugCompTransport::$lastEmail;
598
                $this->assertRegExp('/Date: Today!\n/', $result);
599
        }
600

    
601
/**
602
 * testContentStripping method
603
 *
604
 * @return void
605
 */
606
        public function testContentStripping() {
607
                $content = "Previous content\n--alt-\nContent-TypeContent-Type:: text/html; charsetcharset==utf-8\nContent-Transfer-Encoding: 8bit";
608
                $content .= "\n\n<p>My own html content</p>";
609

    
610
                $result = $this->Controller->EmailTest->strip($content, true);
611
                $expected = "Previous content\n--alt-\n text/html; utf-8\n 8bit\n\n<p>My own html content</p>";
612
                $this->assertEquals($expected, $result);
613

    
614
                $content = '<p>Some HTML content with an <a href="mailto:test@example.com">email link</a>';
615
                $result = $this->Controller->EmailTest->strip($content, true);
616
                $expected = $content;
617
                $this->assertEquals($expected, $result);
618

    
619
                $content = '<p>Some HTML content with an ';
620
                $content .= '<a href="mailto:test@example.com,test2@example.com">email link</a>';
621
                $result = $this->Controller->EmailTest->strip($content, true);
622
                $expected = $content;
623
                $this->assertEquals($expected, $result);
624
        }
625

    
626
/**
627
 * test that the _encode() will set mb_internal_encoding.
628
 *
629
 * @return void
630
 */
631
        public function testEncodeSettingInternalCharset() {
632
                $this->skipIf(!function_exists('mb_internal_encoding'), 'Missing mb_* functions, cannot run test.');
633

    
634
                $restore = mb_internal_encoding();
635
                mb_internal_encoding('ISO-8859-1');
636

    
637
                $this->Controller->charset = 'UTF-8';
638
                $this->Controller->EmailTest->to = 'postmaster@example.com';
639
                $this->Controller->EmailTest->from = 'noreply@example.com';
640
                $this->Controller->EmailTest->subject = 'هذه رسالة بعنوان طويل مرسل للمستلم';
641
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
642
                $this->Controller->EmailTest->template = null;
643
                $this->Controller->EmailTest->delivery = 'DebugComp';
644

    
645
                $this->Controller->EmailTest->sendAs = 'text';
646
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
647

    
648
                $subject = '=?UTF-8?B?2YfYsNmHINix2LPYp9mE2Kkg2KjYudmG2YjYp9mGINi32YjZitmEINmF2LE=?=' . "\r\n" . ' =?UTF-8?B?2LPZhCDZhNmE2YXYs9iq2YTZhQ==?=';
649

    
650
                preg_match('/Subject: (.*)Header:/s', DebugCompTransport::$lastEmail, $matches);
651
                $this->assertEquals(trim($matches[1]), $subject);
652

    
653
                $result = mb_internal_encoding();
654
                $this->assertEquals('ISO-8859-1', $result);
655

    
656
                mb_internal_encoding($restore);
657
        }
658

    
659
/**
660
 * testMultibyte method
661
 *
662
 * @return void
663
 */
664
        public function testMultibyte() {
665
                $this->Controller->charset = 'UTF-8';
666
                $this->Controller->EmailTest->to = 'postmaster@example.com';
667
                $this->Controller->EmailTest->from = 'noreply@example.com';
668
                $this->Controller->EmailTest->subject = 'هذه رسالة بعنوان طويل مرسل للمستلم';
669
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
670
                $this->Controller->EmailTest->template = null;
671
                $this->Controller->EmailTest->delivery = 'DebugComp';
672

    
673
                $subject = '=?UTF-8?B?2YfYsNmHINix2LPYp9mE2Kkg2KjYudmG2YjYp9mGINi32YjZitmEINmF2LE=?=' . "\r\n" . ' =?UTF-8?B?2LPZhCDZhNmE2YXYs9iq2YTZhQ==?=';
674

    
675
                $this->Controller->EmailTest->sendAs = 'text';
676
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
677
                preg_match('/Subject: (.*)Header:/s', DebugCompTransport::$lastEmail, $matches);
678
                $this->assertEquals(trim($matches[1]), $subject);
679

    
680
                $this->Controller->EmailTest->sendAs = 'html';
681
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
682
                preg_match('/Subject: (.*)Header:/s', DebugCompTransport::$lastEmail, $matches);
683
                $this->assertEquals(trim($matches[1]), $subject);
684

    
685
                $this->Controller->EmailTest->sendAs = 'both';
686
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
687
                preg_match('/Subject: (.*)Header:/s', DebugCompTransport::$lastEmail, $matches);
688
                $this->assertEquals(trim($matches[1]), $subject);
689
        }
690

    
691
/**
692
 * undocumented function
693
 *
694
 * @return void
695
 */
696
        public function testSendWithAttachments() {
697
                $this->Controller->EmailTest->to = 'postmaster@example.com';
698
                $this->Controller->EmailTest->from = 'noreply@example.com';
699
                $this->Controller->EmailTest->subject = 'Attachment Test';
700
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
701
                $this->Controller->EmailTest->template = null;
702
                $this->Controller->EmailTest->delivery = 'DebugComp';
703
                $this->Controller->EmailTest->attachments = array(
704
                        __FILE__,
705
                        'some-name.php' => __FILE__
706
                );
707
                $body = '<p>This is the body of the message</p>';
708

    
709
                $this->Controller->EmailTest->sendAs = 'text';
710
                $this->assertTrue($this->Controller->EmailTest->send($body));
711
                $msg = DebugCompTransport::$lastEmail;
712
                $this->assertRegExp('/' . preg_quote('Content-Disposition: attachment; filename="EmailComponentTest.php"') . '/', $msg);
713
                $this->assertRegExp('/' . preg_quote('Content-Disposition: attachment; filename="some-name.php"') . '/', $msg);
714
        }
715

    
716
/**
717
 * testSendAsIsNotIgnoredIfAttachmentsPresent method
718
 *
719
 * @return void
720
 */
721
        public function testSendAsIsNotIgnoredIfAttachmentsPresent() {
722
                $this->Controller->EmailTest->to = 'postmaster@example.com';
723
                $this->Controller->EmailTest->from = 'noreply@example.com';
724
                $this->Controller->EmailTest->subject = 'Attachment Test';
725
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
726
                $this->Controller->EmailTest->template = null;
727
                $this->Controller->EmailTest->delivery = 'DebugComp';
728
                $this->Controller->EmailTest->attachments = array(__FILE__);
729
                $body = '<p>This is the body of the message</p>';
730

    
731
                $this->Controller->EmailTest->sendAs = 'html';
732
                $this->assertTrue($this->Controller->EmailTest->send($body));
733
                $msg = DebugCompTransport::$lastEmail;
734
                $this->assertNotRegExp('/text\/plain/', $msg);
735
                $this->assertRegExp('/text\/html/', $msg);
736

    
737
                $this->Controller->EmailTest->sendAs = 'text';
738
                $this->assertTrue($this->Controller->EmailTest->send($body));
739
                $msg = DebugCompTransport::$lastEmail;
740
                $this->assertRegExp('/text\/plain/', $msg);
741
                $this->assertNotRegExp('/text\/html/', $msg);
742

    
743
                $this->Controller->EmailTest->sendAs = 'both';
744
                $this->assertTrue($this->Controller->EmailTest->send($body));
745
                $msg = DebugCompTransport::$lastEmail;
746

    
747
                $this->assertRegExp('/text\/plain/', $msg);
748
                $this->assertRegExp('/text\/html/', $msg);
749
                $this->assertRegExp('/multipart\/alternative/', $msg);
750
        }
751

    
752
/**
753
 * testNoDoubleNewlinesInHeaders function
754
 *
755
 * @return void
756
 */
757
        public function testNoDoubleNewlinesInHeaders() {
758
                $this->Controller->EmailTest->to = 'postmaster@example.com';
759
                $this->Controller->EmailTest->from = 'noreply@example.com';
760
                $this->Controller->EmailTest->subject = 'Attachment Test';
761
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
762
                $this->Controller->EmailTest->template = null;
763
                $this->Controller->EmailTest->delivery = 'DebugComp';
764
                $body = '<p>This is the body of the message</p>';
765

    
766
                $this->Controller->EmailTest->sendAs = 'both';
767
                $this->assertTrue($this->Controller->EmailTest->send($body));
768
                $msg = DebugCompTransport::$lastEmail;
769

    
770
                $this->assertNotRegExp('/\n\nContent-Transfer-Encoding/', $msg);
771
                $this->assertRegExp('/\nContent-Transfer-Encoding/', $msg);
772
        }
773

    
774
/**
775
 * testReset method
776
 *
777
 * @return void
778
 */
779
        public function testReset() {
780
                $this->Controller->EmailTest->template = 'default';
781
                $this->Controller->EmailTest->to = 'test.recipient@example.com';
782
                $this->Controller->EmailTest->from = 'test.sender@example.com';
783
                $this->Controller->EmailTest->replyTo = 'test.replyto@example.com';
784
                $this->Controller->EmailTest->return = 'test.return@example.com';
785
                $this->Controller->EmailTest->cc = array('cc1@example.com', 'cc2@example.com');
786
                $this->Controller->EmailTest->bcc = array('bcc1@example.com', 'bcc2@example.com');
787
                $this->Controller->EmailTest->date = 'Today!';
788
                $this->Controller->EmailTest->subject = 'Test subject';
789
                $this->Controller->EmailTest->additionalParams = 'X-additional-header';
790
                $this->Controller->EmailTest->delivery = 'smtp';
791
                $this->Controller->EmailTest->smtpOptions['host'] = 'blah';
792
                $this->Controller->EmailTest->smtpOptions['timeout'] = 0.2;
793
                $this->Controller->EmailTest->attachments = array('attachment1', 'attachment2');
794
                $this->Controller->EmailTest->textMessage = 'This is the body of the message';
795
                $this->Controller->EmailTest->htmlMessage = 'This is the body of the message';
796
                $this->Controller->EmailTest->messageId = false;
797

    
798
                try {
799
                        $this->Controller->EmailTest->send('Should not work');
800
                        $this->fail('No exception');
801
                } catch (SocketException $e) {
802
                        $this->assertTrue(true, 'SocketException raised');
803
                }
804

    
805
                $this->Controller->EmailTest->reset();
806

    
807
                $this->assertNull($this->Controller->EmailTest->template);
808
                $this->assertSame($this->Controller->EmailTest->to, array());
809
                $this->assertNull($this->Controller->EmailTest->from);
810
                $this->assertNull($this->Controller->EmailTest->replyTo);
811
                $this->assertNull($this->Controller->EmailTest->return);
812
                $this->assertSame($this->Controller->EmailTest->cc, array());
813
                $this->assertSame($this->Controller->EmailTest->bcc, array());
814
                $this->assertNull($this->Controller->EmailTest->date);
815
                $this->assertNull($this->Controller->EmailTest->subject);
816
                $this->assertNull($this->Controller->EmailTest->additionalParams);
817
                $this->assertNull($this->Controller->EmailTest->smtpError);
818
                $this->assertSame($this->Controller->EmailTest->attachments, array());
819
                $this->assertNull($this->Controller->EmailTest->textMessage);
820
                $this->assertTrue($this->Controller->EmailTest->messageId);
821
                $this->assertEquals('mail', $this->Controller->EmailTest->delivery);
822
        }
823

    
824
        public function testPluginCustomViewClass() {
825
                App::build(array(
826
                        'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS),
827
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
828
                ));
829

    
830
                $this->Controller->view = 'TestPlugin.Email';
831

    
832
                $this->Controller->EmailTest->to = 'postmaster@example.com';
833
                $this->Controller->EmailTest->from = 'noreply@example.com';
834
                $this->Controller->EmailTest->subject = 'CustomViewClass test';
835
                $this->Controller->EmailTest->delivery = 'DebugComp';
836
                $body = 'Body of message';
837

    
838
                $this->assertTrue($this->Controller->EmailTest->send($body));
839
                $result = DebugCompTransport::$lastEmail;
840

    
841
                $this->assertRegExp('/Body of message/', $result);
842
        }
843

    
844
/**
845
 * testStartup method
846
 *
847
 * @return void
848
 */
849
        public function testStartup() {
850
                $this->assertNull($this->Controller->EmailTest->startup($this->Controller));
851
        }
852

    
853
/**
854
 * testMessageId method
855
 *
856
 * @return void
857
 */
858
        public function testMessageId() {
859
                $this->Controller->EmailTest->to = 'postmaster@example.com';
860
                $this->Controller->EmailTest->from = 'noreply@example.com';
861
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
862
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
863
                $this->Controller->EmailTest->template = null;
864

    
865
                $this->Controller->EmailTest->delivery = 'DebugComp';
866
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
867
                $result = DebugCompTransport::$lastEmail;
868

    
869
                $host = env('HTTP_HOST') ? env('HTTP_HOST') : php_uname('n');
870
                $this->assertRegExp('/Message-ID: \<[a-f0-9]{8}[a-f0-9]{4}[a-f0-9]{4}[a-f0-9]{4}[a-f0-9]{12}@' . $host . '\>\n/', $result);
871

    
872
                $this->Controller->EmailTest->messageId = '<22091985.998877@example.com>';
873

    
874
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
875
                $result = DebugCompTransport::$lastEmail;
876

    
877
                $this->assertRegExp('/Message-ID: <22091985.998877@example.com>\n/', $result);
878

    
879
                $this->Controller->EmailTest->messageId = false;
880

    
881
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
882
                $result = DebugCompTransport::$lastEmail;
883

    
884
                $this->assertNotRegExp('/Message-ID:/', $result);
885
        }
886

    
887
/**
888
 * Make sure from/to are not double encoded when UTF-8 is present
889
 *
890
 * @return void
891
 */
892
        public function testEncodingFrom() {
893
                $this->Controller->EmailTest->to = 'Teßt <test@example.com>';
894
                $this->Controller->EmailTest->from = 'Teßt <test@example.com>';
895
                $this->Controller->EmailTest->subject = 'Cake Debug Test';
896
                $this->Controller->EmailTest->replyTo = 'noreply@example.com';
897
                $this->Controller->EmailTest->template = null;
898

    
899
                $this->Controller->EmailTest->delivery = 'DebugComp';
900
                $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
901
                $result = DebugCompTransport::$lastEmail;
902

    
903
                $this->assertContains('From: =?UTF-8?B?VGXDn3Qg?= <test@example.com>', $result);
904
                $this->assertContains('To: =?UTF-8?B?VGXDn3Qg?= <test@example.com>', $result);
905
        }
906

    
907
}