<?php

namespace yiiunit\framework\mail;

use Yii;
use yii\mail\BaseMailer;
use yii\mail\BaseMessage;
use yiiunit\TestCase;

/**
 * @group mail
 */
class BaseMessageTest extends TestCase
{
	public function setUp()
	{
		$this->mockApplication([
			'components' => [
				'mail' => $this->createTestEmailComponent()
			]
		]);
	}

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

	/**
	 * @return TestMailer mailer instance.
	 */
	protected function getMailer()
	{
		return Yii::$app->getComponent('mail');
	}

	// Tests :

	public function testRender()
	{
		$mailer = $this->getMailer();
		$message = $mailer->compose();

		$viewName = 'test/text/view';
		$message->renderText($viewName);
		$expectedText = 'view=' . $viewName . ' layout=' . $mailer->textLayout;
		$this->assertEquals($expectedText, $message->text, 'Unable to render text!');

		$viewName = 'test/html/view';
		$message->renderHtml($viewName);
		$expectedHtml = 'view=' . $viewName . ' layout=' . $mailer->htmlLayout;
		$this->assertEquals($expectedHtml, $message->html, 'Unable to render html!');
	}

	/**
	 * @depends testRender
	 */
	public function testComposeBody()
	{
		$mailer = $this->getMailer();
		$message = $mailer->compose();

		$viewName = 'test/html/view';
		$message->body($viewName);
		$expectedHtml = 'view=' . $viewName . ' layout=' . $mailer->htmlLayout;
		$this->assertEquals($expectedHtml, $message->html, 'Unable to compose html!');
		$expectedText = strip_tags($expectedHtml);
		$this->assertEquals($expectedText, $message->text, 'Unable to compose text from html!');

		$textViewName = 'test/text/view';
		$htmlViewName = 'test/html/view';
		$message->body(['text' => $textViewName, 'html' => $htmlViewName]);
		$expectedHtml = 'view=' . $htmlViewName . ' layout=' . $mailer->htmlLayout;
		$this->assertEquals($expectedHtml, $message->html, 'Unable to compose html from separated view!');
		$expectedText = 'view=' . $textViewName . ' layout=' . $mailer->textLayout;
		$this->assertEquals($expectedText, $message->text, 'Unable to compose text from separated view!');
	}

	public function testSend()
	{
		$mailer = $this->getMailer();
		$message = $mailer->compose();
		$message->send();
		$this->assertEquals($message, $mailer->sentMessages[0], 'Unable to send message!');
	}
}

/**
 * Test Mailer class
 */
class TestMailer extends BaseMailer
{
	public $messageClass = 'yiiunit\framework\mail\TestMessage';
	public $sentMessages = array();

	public function render($view, $params = [], $layout = false)
	{
		return 'view=' . $view . ' layout=' . $layout;
	}

	public function send($message)
	{
		$this->sentMessages[] = $message;
	}
}

/**
 * Test Message class
 */
class TestMessage extends BaseMessage
{
	public $text;
	public $html;

	public function charset($charset) {}

	public function from($from) {}

	public function to($to) {}

	public function cc($cc) {}

	public function bcc($bcc) {}

	public function subject($subject) {}

	public function text($text) {
		$this->text = $text;
	}

	public function html($html) {
		$this->html = $html;
	}

	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 get_class($this);
	}
}