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.
		
		
		
		
		
			
		
			
				
					
					
						
							379 lines
						
					
					
						
							8.6 KiB
						
					
					
				
			
		
		
	
	
							379 lines
						
					
					
						
							8.6 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)); | 
						|
	} | 
						|
 | 
						|
	public function testBeforeSendEvent() | 
						|
	{ | 
						|
		$message = new Message(); | 
						|
 | 
						|
		$mailerMock = $this->getMockBuilder('yiiunit\framework\mail\Mailer')->setMethods(['beforeSend','afterSend'])->getMock(); | 
						|
		$mailerMock->expects($this->once())->method('beforeSend')->with($message)->will($this->returnValue(true)); | 
						|
		$mailerMock->expects($this->once())->method('afterSend')->with($message,true); | 
						|
		$mailerMock->send($message); | 
						|
	} | 
						|
 | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * Test Mailer class | 
						|
 */ | 
						|
class Mailer extends BaseMailer | 
						|
{ | 
						|
	public $messageClass = 'yiiunit\framework\mail\Message'; | 
						|
	public $sentMessages = []; | 
						|
 | 
						|
	protected function sendMessage($message) | 
						|
	{ | 
						|
		$this->sentMessages[] = $message; | 
						|
		return true; | 
						|
	} | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * 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); | 
						|
	} | 
						|
}
 | 
						|
 |