mockApplication([ 'components' => [ 'mail' => $this->createTestMailComponent(), ] ]); $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(); } /** * @return Mailer test email component instance. */ protected function createTestMailComponent() { $component = new Mailer(); $component->viewPath = $this->getTestFilePath(); return $component; } /** * @return Mailer mailer instance */ protected function getTestMailComponent() { return Yii::$app->getComponent('mail'); } // Tests : public function testSetupView() { $mailer = new Mailer(); $view = new View(); $mailer->setView($view); $this->assertEquals($view, $mailer->getView(), 'Unable to setup view!'); $viewConfig = [ 'params' => [ 'param1' => 'value1', 'param2' => 'value2', ] ]; $mailer->setView($viewConfig); $view = $mailer->getView(); $this->assertTrue(is_object($view), 'Unable to setup view via config!'); $this->assertEquals($viewConfig['params'], $view->params, 'Unable to configure view via config array!'); } /** * @depends testSetupView */ public function testGetDefaultView() { $mailer = new Mailer(); $view = $mailer->getView(); $this->assertTrue(is_object($view), 'Unable to get default view!'); } public function testCreateMessage() { $mailer = new Mailer(); $message = $mailer->compose(); $this->assertTrue(is_object($message), 'Unable to create message instance!'); $this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!'); } /** * @depends testCreateMessage */ public function testDefaultMessageConfig() { $mailer = new Mailer(); $notPropertyConfig = [ 'charset' => 'utf-16', 'from' => 'from@domain.com', 'to' => 'to@domain.com', 'cc' => 'cc@domain.com', 'bcc' => 'bcc@domain.com', 'subject' => 'Test subject', 'textBody' => 'Test text body', 'htmlBody' => 'Test HTML body', ]; $propertyConfig = [ 'id' => 'test-id', 'encoding' => 'test-encoding', ]; $messageConfig = array_merge($notPropertyConfig, $propertyConfig); $mailer->messageConfig = $messageConfig; $message = $mailer->compose(); foreach ($notPropertyConfig as $name => $value) { $this->assertEquals($value, $message->{'_' . $name}); } foreach ($propertyConfig as $name => $value) { $this->assertEquals($value, $message->$name); } } /** * @depends testGetDefaultView */ public function testRender() { $mailer = $this->getTestMailComponent(); $viewName = 'test_view'; $viewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $viewName . '.php'; $viewFileContent = ''; file_put_contents($viewFileName, $viewFileContent); $params = [ 'testParam' => 'test output' ]; $renderResult = $mailer->render($viewName, $params); $this->assertEquals($params['testParam'], $renderResult); } /** * @depends testRender */ public function testRenderLayout() { $mailer = $this->getTestMailComponent(); $filePath = $this->getTestFilePath(); $viewName = 'test_view'; $viewFileName = $filePath . DIRECTORY_SEPARATOR . $viewName . '.php'; $viewFileContent = 'view file content'; file_put_contents($viewFileName, $viewFileContent); $layoutName = 'test_layout'; $layoutFileName = $filePath . DIRECTORY_SEPARATOR . $layoutName . '.php'; $layoutFileContent = 'Begin Layout End Layout'; file_put_contents($layoutFileName, $layoutFileContent); $renderResult = $mailer->render($viewName, [], $layoutName); $this->assertEquals('Begin Layout ' . $viewFileContent . ' End Layout', $renderResult); } /** * @depends testCreateMessage * @depends testRender */ public function testCompose() { $mailer = $this->getTestMailComponent(); $mailer->htmlLayout = false; $mailer->textLayout = false; $htmlViewName = 'test_html_view'; $htmlViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $htmlViewName . '.php'; $htmlViewFileContent = 'HTML view file content'; file_put_contents($htmlViewFileName, $htmlViewFileContent); $textViewName = 'test_text_view'; $textViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $textViewName . '.php'; $textViewFileContent = 'Plain text view file content'; file_put_contents($textViewFileName, $textViewFileContent); $message = $mailer->compose([ 'html' => $htmlViewName, 'text' => $textViewName, ]); $this->assertEquals($htmlViewFileContent, $message->_htmlBody, 'Unable to render html!'); $this->assertEquals($textViewFileContent, $message->_textBody, 'Unable to render text!'); $message = $mailer->compose($htmlViewName); $this->assertEquals($htmlViewFileContent, $message->_htmlBody, 'Unable to render html by direct view!'); $this->assertEquals(strip_tags($htmlViewFileContent), $message->_textBody, 'Unable to render text by direct view!'); } public function testUseFileTransport() { $mailer = new Mailer(); $this->assertFalse($mailer->useFileTransport); $this->assertEquals('@runtime/mail', $mailer->fileTransportPath); $mailer->fileTransportPath = '@yiiunit/runtime/mail'; $mailer->useFileTransport = true; $mailer->fileTransportCallback = function () { return 'message.txt'; }; $message = $mailer->compose() ->setTo('to@example.com') ->setFrom('from@example.com') ->setSubject('test subject') ->setTextBody('text body' . microtime(true)); $this->assertTrue($mailer->send($message)); $file = Yii::getAlias($mailer->fileTransportPath) . '/message.txt'; $this->assertTrue(is_file($file)); $this->assertEquals($message->toString(), file_get_contents($file)); } } /** * Test Mailer class */ class Mailer extends BaseMailer { public $messageClass = 'yiiunit\framework\mail\Message'; public $sentMessages = []; protected function sendMessage($message) { $this->sentMessages[] = $message; } } /** * Test Message class */ class Message extends BaseMessage { public $id; public $encoding; public $_charset; public $_from; public $_replyTo; public $_to; public $_cc; public $_bcc; public $_subject; public $_textBody; public $_htmlBody; public function getCharset() { return $this->_charset; } public function setCharset($charset) { $this->_charset = $charset; return $this; } public function getFrom() { return $this->_from; } public function setFrom($from) { $this->_from = $from; return $this; } public function getTo() { return $this->_to; } public function setTo($to) { $this->_to = $to; return $this; } public function getCc() { return $this->_cc; } public function setCc($cc) { $this->_cc = $cc; return $this; } public function getBcc() { return $this->_bcc; } public function setBcc($bcc) { $this->_bcc = $bcc; return $this; } public function getSubject() { return $this->_subject; } public function setSubject($subject) { $this->_subject = $subject; return $this; } public function getReplyTo() { return $this->_replyTo; } public function setReplyTo($replyTo) { $this->_replyTo = $replyTo; return $this; } public function setTextBody($text) { $this->_textBody = $text; return $this; } public function setHtmlBody($html) { $this->_htmlBody = $html; return $this; } public function attachContent($content, array $options = []) {} public function attach($fileName, array $options = []) {} public function embed($fileName, array $options = []) {} public function embedContent($content, array $options = []) {} public function toString() { return var_export($this, true); } }