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