1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.3.3
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\TestSuite;
16:
17: use Cake\Mailer\Email;
18:
19: /**
20: * Email and mailer assertions.
21: *
22: * @method \PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount any()
23: * @method void assertSame($expected, $result, $message)
24: * @method void assertTextContains($needle, $haystack, $message)
25: * @method \PHPUnit_Framework_MockObject_MockBuilder getMockBuilder($className)
26: *
27: * @deprecated 3.7.0 Use Cake\TestSuite\EmailTrait instead
28: */
29: trait EmailAssertTrait
30: {
31: /**
32: * @var \Cake\Mailer\Email
33: */
34: protected $_email;
35:
36: /**
37: * Sends email using the test email instance.
38: *
39: * @param array|string|null $content The email's content to send.
40: * @return void
41: */
42: public function send($content = null)
43: {
44: $this->email(true)->send($content);
45: }
46:
47: /**
48: * Creates an email instance overriding its transport for testing purposes.
49: *
50: * @param bool $new Tells if new instance should forcibly be created.
51: * @return \Cake\Mailer\Email
52: */
53: public function email($new = false)
54: {
55: if ($new || !$this->_email) {
56: $this->_email = new Email();
57: $this->_email->setProfile(['transport' => 'debug'] + $this->_email->getProfile());
58: }
59:
60: return $this->_email;
61: }
62:
63: /**
64: * Generates mock for given mailer class.
65: *
66: * @param string $className The mailer's FQCN.
67: * @param array $methods The methods to mock on the mailer.
68: * @return \Cake\Mailer\Mailer|\PHPUnit_Framework_MockObject_MockObject
69: */
70: public function getMockForMailer($className, array $methods = [])
71: {
72: $name = current(array_slice(explode('\\', $className), -1));
73:
74: if (!in_array('profile', $methods, true)) {
75: $methods[] = 'profile';
76: }
77:
78: $mailer = $this->getMockBuilder($className)
79: ->setMockClassName($name)
80: ->setMethods($methods)
81: ->setConstructorArgs([$this->email()])
82: ->getMock();
83:
84: $mailer->expects($this->any())
85: ->method('profile')
86: ->willReturn($mailer);
87:
88: return $mailer;
89: }
90:
91: /**
92: * Asserts email content (both text and HTML) contains `$needle`.
93: *
94: * @param string $needle Text to look for.
95: * @param string|null $message The failure message to define.
96: * @return void
97: */
98: public function assertEmailMessageContains($needle, $message = null)
99: {
100: $this->assertEmailHtmlMessageContains($needle, $message);
101: $this->assertEmailTextMessageContains($needle, $message);
102: }
103:
104: /**
105: * Asserts HTML email content contains `$needle`.
106: *
107: * @param string $needle Text to look for.
108: * @param string|null $message The failure message to define.
109: * @return void
110: */
111: public function assertEmailHtmlMessageContains($needle, $message = null)
112: {
113: $haystack = $this->email()->message('html');
114: $this->assertTextContains($needle, $haystack, $message);
115: }
116:
117: /**
118: * Asserts text email content contains `$needle`.
119: *
120: * @param string $needle Text to look for.
121: * @param string|null $message The failure message to define.
122: * @return void
123: */
124: public function assertEmailTextMessageContains($needle, $message = null)
125: {
126: $haystack = $this->email()->message('text');
127: $this->assertTextContains($needle, $haystack, $message);
128: }
129:
130: /**
131: * Asserts email's subject contains `$expected`.
132: *
133: * @param string $expected Email's subject.
134: * @param string|null $message The failure message to define.
135: * @return void
136: */
137: public function assertEmailSubject($expected, $message = null)
138: {
139: $result = $this->email()->getSubject();
140: $this->assertSame($expected, $result, $message);
141: }
142:
143: /**
144: * Asserts email's sender email address and optionally name.
145: *
146: * @param string $email Sender's email address.
147: * @param string|null $name Sender's name.
148: * @param string|null $message The failure message to define.
149: * @return void
150: */
151: public function assertEmailFrom($email, $name = null, $message = null)
152: {
153: if ($name === null) {
154: $name = $email;
155: }
156:
157: $expected = [$email => $name];
158: $result = $this->email()->getFrom();
159: $this->assertSame($expected, $result, $message);
160: }
161:
162: /**
163: * Asserts email is CC'd to only one email address (and optionally name).
164: *
165: * @param string $email CC'd email address.
166: * @param string|null $name CC'd person name.
167: * @param string|null $message The failure message to define.
168: * @return void
169: */
170: public function assertEmailCc($email, $name = null, $message = null)
171: {
172: if ($name === null) {
173: $name = $email;
174: }
175:
176: $expected = [$email => $name];
177: $result = $this->email()->getCc();
178: $this->assertSame($expected, $result, $message);
179: }
180:
181: /**
182: * Asserts email CC'd addresses contain given email address (and
183: * optionally name).
184: *
185: * @param string $email CC'd email address.
186: * @param string|null $name CC'd person name.
187: * @param string|null $message The failure message to define.
188: * @return void
189: */
190: public function assertEmailCcContains($email, $name = null, $message = null)
191: {
192: $result = $this->email()->getCc();
193: $this->assertNotEmpty($result[$email], $message);
194: if ($name !== null) {
195: $this->assertEquals($result[$email], $name, $message);
196: }
197: }
198:
199: /**
200: * Asserts email is BCC'd to only one email address (and optionally name).
201: *
202: * @param string $email BCC'd email address.
203: * @param string|null $name BCC'd person name.
204: * @param string|null $message The failure message to define.
205: * @return void
206: */
207: public function assertEmailBcc($email, $name = null, $message = null)
208: {
209: if ($name === null) {
210: $name = $email;
211: }
212:
213: $expected = [$email => $name];
214: $result = $this->email()->getBcc();
215: $this->assertSame($expected, $result, $message);
216: }
217:
218: /**
219: * Asserts email BCC'd addresses contain given email address (and
220: * optionally name).
221: *
222: * @param string $email BCC'd email address.
223: * @param string|null $name BCC'd person name.
224: * @param string|null $message The failure message to define.
225: * @return void
226: */
227: public function assertEmailBccContains($email, $name = null, $message = null)
228: {
229: $result = $this->email()->getBcc();
230: $this->assertNotEmpty($result[$email], $message);
231: if ($name !== null) {
232: $this->assertEquals($result[$email], $name, $message);
233: }
234: }
235:
236: /**
237: * Asserts email is sent to only the given recipient's address (and
238: * optionally name).
239: *
240: * @param string $email Recipient's email address.
241: * @param string|null $name Recipient's name.
242: * @param string|null $message The failure message to define.
243: * @return void
244: */
245: public function assertEmailTo($email, $name = null, $message = null)
246: {
247: if ($name === null) {
248: $name = $email;
249: }
250:
251: $expected = [$email => $name];
252: $result = $this->email()->getTo();
253: $this->assertSame($expected, $result, $message);
254: }
255:
256: /**
257: * Asserts email recipients' list contains given email address (and
258: * optionally name).
259: *
260: * @param string $email Recipient's email address.
261: * @param string|null $name Recipient's name.
262: * @param string|null $message The failure message to define.
263: * @return void
264: */
265: public function assertEmailToContains($email, $name = null, $message = null)
266: {
267: $result = $this->email()->getTo();
268: $this->assertNotEmpty($result[$email], $message);
269: if ($name !== null) {
270: $this->assertEquals($result[$email], $name, $message);
271: }
272: }
273:
274: /**
275: * Asserts the email attachments contain the given filename (and optionally
276: * file info).
277: *
278: * @param string $filename Expected attachment's filename.
279: * @param array|null $file Expected attachment's file info.
280: * @param string|null $message The failure message to define.
281: * @return void
282: */
283: public function assertEmailAttachmentsContains($filename, array $file = null, $message = null)
284: {
285: $result = $this->email()->getAttachments();
286: $this->assertNotEmpty($result[$filename], $message);
287: if ($file === null) {
288: return;
289: }
290: $this->assertContains($file, $result, $message);
291: $this->assertEquals($file, $result[$filename], $message);
292: }
293: }
294: