MessageTest.php 9.66 KB
Newer Older
1 2
<?php

Paul Klimov committed
3
namespace yiiunit\extensions\swiftmailer;
4 5

use Yii;
6
use yii\helpers\FileHelper;
Paul Klimov committed
7 8
use yii\swiftmailer\Mailer;
use yii\swiftmailer\Message;
9
use yiiunit\VendorTestCase;
10 11

/**
12
 * @group vendor
13
 * @group mail
14 15
 * @group swiftmailer
 */
16
class MessageTest extends VendorTestCase
17
{
18 19 20 21 22
	/**
	 * @var string test email address, which will be used as receiver for the messages.
	 */
	protected $testEmailReceiver = 'someuser@somedomain.com';

23 24
	public function setUp()
	{
25 26
		$this->mockApplication([
			'components' => [
27
				'mail' => $this->createTestEmailComponent()
28 29
			]
		]);
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
		$filePath = $this->getTestFilePath();
		if (!file_exists($filePath)) {
			FileHelper::createDirectory($filePath);
		}
	}

	public function tearDown()
	{
		$filePath = $this->getTestFilePath();
		if (file_exists($filePath)) {
			FileHelper::removeDirectory($filePath);
		}
	}

	/**
	 * @return string test file path.
	 */
	protected function getTestFilePath()
	{
		return Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . basename(get_class($this)) . '_' . getmypid();
50 51 52 53 54 55 56 57 58 59 60
	}

	/**
	 * @return Mailer test email component instance.
	 */
	protected function createTestEmailComponent()
	{
		$component = new Mailer();
		return $component;
	}

61 62 63 64 65
	/**
	 * @return Message test message instance.
	 */
	protected function createTestMessage()
	{
66
		return Yii::$app->getComponent('mail')->compose();
67 68
	}

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
	/**
	 * Creates image file with given text.
	 * @param string $fileName file name.
	 * @param string $text text to be applied on image.
	 * @return string image file full name.
	 */
	protected function createImageFile($fileName = 'test.jpg', $text = 'Test Image')
	{
		if (!function_exists('imagecreatetruecolor')) {
			$this->markTestSkipped('GD lib required.');
		}
		$fileFullName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $fileName;
		$image = imagecreatetruecolor(120, 20);
		$textColor = imagecolorallocate($image, 233, 14, 91);
		imagestring($image, 1, 5, 5, $text, $textColor);
		imagejpeg($image, $fileFullName);
		imagedestroy($image);
		return $fileFullName;
	}

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
	/**
	 * Finds the attachment object in the message.
	 * @param Message $message message instance
	 * @return null|\Swift_Mime_Attachment attachment instance.
	 */
	protected function getAttachment(Message $message)
	{
		$messageParts = $message->getSwiftMessage()->getChildren();
		$attachment = null;
		foreach ($messageParts as $part) {
			if ($part instanceof \Swift_Mime_Attachment) {
				$attachment = $part;
				break;
			}
		}
		return $attachment;
	}

107 108 109 110 111 112 113
	// Tests :

	public function testGetSwiftMessage()
	{
		$message = new Message();
		$this->assertTrue(is_object($message->getSwiftMessage()), 'Unable to get Swift message!');
	}
114

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
	/**
	 * @depends testGetSwiftMessage
	 */
	public function testSetGet()
	{
		$message = new Message();

		$charset = 'utf-16';
		$message->setCharset($charset);
		$this->assertEquals($charset, $message->getCharset(), 'Unable to set charset!');

		$subject = 'Test Subject';
		$message->setSubject($subject);
		$this->assertEquals($subject, $message->getSubject(), 'Unable to set subject!');

		$from = 'from@somedomain.com';
		$message->setFrom($from);
		$this->assertContains($from, array_keys($message->getFrom()), 'Unable to set from!');

		$replyTo = 'reply-to@somedomain.com';
		$message->setReplyTo($replyTo);
		$this->assertContains($replyTo, array_keys($message->getReplyTo()), 'Unable to set replyTo!');

		$to = 'someuser@somedomain.com';
		$message->setTo($to);
		$this->assertContains($to, array_keys($message->getTo()), 'Unable to set to!');

		$cc = 'ccuser@somedomain.com';
		$message->setCc($cc);
		$this->assertContains($cc, array_keys($message->getCc()), 'Unable to set cc!');

		$bcc = 'bccuser@somedomain.com';
		$message->setBcc($bcc);
		$this->assertContains($bcc, array_keys($message->getBcc()), 'Unable to set bcc!');
	}

151 152 153 154 155 156 157
	/**
	 * @depends testGetSwiftMessage
	 */
	public function testSetupHeaders()
	{
		$charset = 'utf-16';
		$subject = 'Test Subject';
158 159
		$from = 'from@somedomain.com';
		$replyTo = 'reply-to@somedomain.com';
160
		$to = 'someuser@somedomain.com';
161 162
		$cc = 'ccuser@somedomain.com';
		$bcc = 'bccuser@somedomain.com';
163 164

		$messageString = $this->createTestMessage()
Qiang Xue committed
165 166
			->setCharset($charset)
			->setSubject($subject)
167 168
			->setFrom($from)
			->setReplyTo($replyTo)
Qiang Xue committed
169 170 171
			->setTo($to)
			->setCc($cc)
			->setBcc($bcc)
172
			->toString();
173 174 175

		$this->assertContains('charset=' . $charset, $messageString, 'Incorrect charset!');
		$this->assertContains('Subject: ' . $subject, $messageString, 'Incorrect "Subject" header!');
176 177
		$this->assertContains('From: ' . $from, $messageString, 'Incorrect "From" header!');
		$this->assertContains('Reply-To: ' . $replyTo, $messageString, 'Incorrect "Reply-To" header!');
178
		$this->assertContains('To: ' . $to, $messageString, 'Incorrect "To" header!');
179 180
		$this->assertContains('Cc: ' . $cc, $messageString, 'Incorrect "Cc" header!');
		$this->assertContains('Bcc: ' . $bcc, $messageString, 'Incorrect "Bcc" header!');
181 182
	}

183 184 185 186 187
	/**
	 * @depends testGetSwiftMessage
	 */
	public function testSend()
	{
188
		$message = $this->createTestMessage();
Qiang Xue committed
189 190 191 192
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Test');
		$message->setTextBody('Yii Swift Test body');
193 194 195 196 197 198 199 200
		$this->assertTrue($message->send());
	}

	/**
	 * @depends testSend
	 */
	public function testAttachFile()
	{
201
		$message = $this->createTestMessage();
202

Qiang Xue committed
203 204 205 206
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Attach File Test');
		$message->setTextBody('Yii Swift Attach File Test body');
207
		$fileName = __FILE__;
208
		$message->attach($fileName);
209

210
		$this->assertTrue($message->send());
211 212 213 214

		$attachment = $this->getAttachment($message);
		$this->assertTrue(is_object($attachment), 'No attachment found!');
		$this->assertContains($attachment->getFilename(), $fileName, 'Invalid file name!');
215 216 217 218 219
	}

	/**
	 * @depends testSend
	 */
220
	public function testAttachContent()
221
	{
222
		$message = $this->createTestMessage();
223

Qiang Xue committed
224 225 226 227
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Create Attachment Test');
		$message->setTextBody('Yii Swift Create Attachment Test body');
228 229 230 231
		$fileName = 'test.txt';
		$fileContent = 'Test attachment content';
		$message->attachContent($fileContent, ['fileName' => $fileName]);

232
		$this->assertTrue($message->send());
233 234 235 236

		$attachment = $this->getAttachment($message);
		$this->assertTrue(is_object($attachment), 'No attachment found!');
		$this->assertEquals($fileName, $attachment->getFilename(), 'Invalid file name!');
237 238 239 240 241 242 243 244 245 246 247
	}

	/**
	 * @depends testSend
	 */
	public function testEmbedFile()
	{
		$fileName = $this->createImageFile('embed_file.jpg', 'Embed Image File');

		$message = $this->createTestMessage();

248
		$cid = $message->embed($fileName);
249

Qiang Xue committed
250 251 252 253
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Embed File Test');
		$message->setHtmlBody('Embed image: <img src="' . $cid. '" alt="pic">');
254 255

		$this->assertTrue($message->send());
256 257 258 259

		$attachment = $this->getAttachment($message);
		$this->assertTrue(is_object($attachment), 'No attachment found!');
		$this->assertContains($attachment->getFilename(), $fileName, 'Invalid file name!');
260 261 262 263 264 265 266
	}

	/**
	 * @depends testSend
	 */
	public function testEmbedContent()
	{
267
		$fileFullName = $this->createImageFile('embed_file.jpg', 'Embed Image File');
268 269
		$message = $this->createTestMessage();

270 271 272 273 274
		$fileName = basename($fileFullName);
		$contentType = 'image/jpeg';
		$fileContent = file_get_contents($fileFullName);

		$cid = $message->embedContent($fileContent, ['fileName' => $fileName, 'contentType' => $contentType]);
275

Qiang Xue committed
276 277 278 279
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Embed File Test');
		$message->setHtmlBody('Embed image: <img src="' . $cid. '" alt="pic">');
280

281
		$this->assertTrue($message->send());
282 283 284 285 286

		$attachment = $this->getAttachment($message);
		$this->assertTrue(is_object($attachment), 'No attachment found!');
		$this->assertEquals($fileName, $attachment->getFilename(), 'Invalid file name!');
		$this->assertEquals($contentType, $attachment->getContentType(), 'Invalid content type!');
287 288 289 290 291 292 293
	}

	/**
	 * @depends testSend
	 */
	public function testSendAlternativeBody()
	{
294
		$message = $this->createTestMessage();
295

Qiang Xue committed
296 297 298 299 300
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Alternative Body Test');
		$message->setHtmlBody('<b>Yii Swift</b> test HTML body');
		$message->setTextBody('Yii Swift test plain text body');
301

302
		$this->assertTrue($message->send());
303 304 305 306 307 308

		$messageParts = $message->getSwiftMessage()->getChildren();
		$textPresent = false;
		$htmlPresent = false;
		foreach ($messageParts as $part) {
			if (!($part instanceof \Swift_Mime_Attachment)) {
slavcodev committed
309
				/* @var \Swift_Mime_MimePart $part */
310 311 312 313 314 315 316 317 318 319
				if ($part->getContentType() == 'text/plain') {
					$textPresent = true;
				}
				if ($part->getContentType() == 'text/html') {
					$htmlPresent = true;
				}
			}
		}
		$this->assertTrue($textPresent, 'No text!');
		$this->assertTrue($htmlPresent, 'No HTML!');
320
	}
321 322 323 324 325 326 327 328

	/**
	 * @depends testGetSwiftMessage
	 */
	public function testSerialize()
	{
		$message = $this->createTestMessage();

Qiang Xue committed
329 330 331 332
		$message->setTo($this->testEmailReceiver);
		$message->setFrom('someuser@somedomain.com');
		$message->setSubject('Yii Swift Alternative Body Test');
		$message->setTextBody('Yii Swift test plain text body');
333 334 335 336 337 338 339

		$serializedMessage = serialize($message);
		$this->assertNotEmpty($serializedMessage, 'Unable to serialize message!');

		$unserializedMessaage = unserialize($serializedMessage);
		$this->assertEquals($message, $unserializedMessaage, 'Unable to unserialize message!');
	}
Qiang Xue committed
340
}