You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
8.1 KiB
367 lines
8.1 KiB
<?php |
|
|
|
namespace yiiunit\framework\mail; |
|
|
|
use Yii; |
|
use yii\base\View; |
|
use yii\mail\BaseMailer; |
|
use yii\mail\BaseMessage; |
|
use yii\helpers\FileHelper; |
|
use yiiunit\TestCase; |
|
|
|
/** |
|
* @group mail |
|
*/ |
|
class BaseMailerTest extends TestCase |
|
{ |
|
public function setUp() |
|
{ |
|
$this->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 = '<?php echo $testParam; ?>'; |
|
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 <?php echo $content; ?> 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 <b>view file</b> 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); |
|
} |
|
}
|
|
|