From 4d01e773d30e8527b086f9cdb027ed4770c4d779 Mon Sep 17 00:00:00 2001 From: Kentaro Ohkouchi Date: Wed, 10 Apr 2019 16:56:18 +0900 Subject: [PATCH 1/2] Add SendMailTest --- tests/class/Common_TestCase.php | 82 +++++++++++++++ tests/class/SC_SendMailTest.php | 171 ++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 tests/class/SC_SendMailTest.php diff --git a/tests/class/Common_TestCase.php b/tests/class/Common_TestCase.php index 47e4049e01..634893e532 100644 --- a/tests/class/Common_TestCase.php +++ b/tests/class/Common_TestCase.php @@ -18,6 +18,9 @@ */ class Common_TestCase extends PHPUnit_Framework_TestCase { + /** MailCatcher の URL. */ + const MAILCATCHER_URL = 'http://127.0.0.1:1080'; + /** * MDB2 をグローバル変数のバックアップ対象から除外する。 * @@ -59,6 +62,85 @@ protected function verify($message = null) $this->assertEquals($this->expected, $this->actual, $message); } + /** + * MailCatcher の起動状態をチェックする. + * + * MailCatcher が起動していない場合は, テストをスキップする. + */ + protected function checkMailCatcherStatus() + { + try { + $client = new \GuzzleHttp\Client(['base_url' => self::MAILCATCHER_URL]); + $response = $client->get('/messages'); + if ($response->getStatusCode() !== 200) { + $this->markTestSkipped('MailCatcher is not available'); + } + } catch (Exception $e) { + $this->markTestSkipped('MailCatcher is not available'); + } + } + + /** + * MailCatcher のメッセージをすべて削除する. + */ + protected function resetEmails() + { + try { + $client = new \GuzzleHttp\Client(['base_url' => self::MAILCATCHER_URL]); + $client->delete('/messages'); + } catch (\Exception $e) { + // quiet + } + } + + /** + * MailCatcher のメッセージをすべて取得する. + * + * @return array MailCatcher のメッセージの配列 + */ + protected function getMailCatcherMessages() + { + $client = new \GuzzleHttp\Client(['base_url' => self::MAILCATCHER_URL]); + $response = $client->get('/messages'); + + return json_decode($response->getBody(true), true); + } + + /** + * MailCatcher のメッセージを ID を指定して取得する. + * + * @param int $id メッセージの ID + * @return array MailCatcher のメッセージ + */ + protected function getMailCatcherMessage($id) + { + $client = new \GuzzleHttp\Client(['base_url' => self::MAILCATCHER_URL]); + $response = $client->get('/messages/'.$id.'.json'); + + $message = json_decode($response->getBody(true), true); + + $message['source'] = quoted_printable_decode($message['source']); + $message['source'] = mb_convert_encoding($message['source'], 'UTF-8', 'JIS'); + return $message; + } + + /** + * MailCatcher の最後のメッセージ取得する. + * + * @return array MailCatcher のメッセージ + */ + protected function getLastMailCatcherMessage() + { + $messages = $this->getMailCatcherMessages(); + if (empty($messages)) { + $this->fail("No messages received"); + } + + $last = array_shift($messages); + return $this->getMailCatcherMessage($last['id']); + } + + ////////////////////////////////////////////////////////////////// // 以下はテスト用のユーティリティを使うためのサンプルです。 // 実際に動作させる場合にはコメントアウトを外して下さい。 diff --git a/tests/class/SC_SendMailTest.php b/tests/class/SC_SendMailTest.php new file mode 100644 index 0000000000..55bc412d81 --- /dev/null +++ b/tests/class/SC_SendMailTest.php @@ -0,0 +1,171 @@ +objSendMail = new SC_SendMail_Ex(); + } + + public function testGetInstance() + { + $this->assertInstanceOf('SC_SendMail', $this->objSendMail); + } + + public function testSendMail() + { + $this->resetEmails(); + + $this->objSendMail->setItem('to@example.com', '件名', '本文', 'from@example.com', '差出人名', 'reply-to@example.com', 'return-path@example.com', 'error-to@example.com', 'bcc@example.com', 'cc@example.com'); + $result = $this->objSendMail->sendMail(); + $this->assertTrue($result); + + $messages = $this->getMailCatcherMessages(); + $this->assertCount(1, $messages); + + $message = $this->getLastMailCatcherMessage(); + $this->assertEquals('件名', $message['subject']); + $this->assertContains('本文', $message['source']); + + $this->assertContains('text/plain', $message['source']); + + $this->assertContains('Return-Path: error-to@example.com', $message['source']); + } + + public function testSendHtmlMail() + { + $this->resetEmails(); + + $this->objSendMail->setItemHtml('to@example.com', '件名', '

本文

', 'from@example.com', '差出人名', 'reply-to@example.com', 'return-path@example.com', 'error-to@example.com', 'bcc@example.com', 'cc@example.com'); + $result = $this->objSendMail->sendHtmlMail(); + $this->assertTrue($result); + + $messages = $this->getMailCatcherMessages(); + $this->assertCount(1, $messages); + + $message = $this->getLastMailCatcherMessage(); + $this->assertEquals('件名', $message['subject']); + $this->assertContains('

本文

', $message['source']); + + $this->assertContains('text/html', $message['source']); + } + + public function testSetReturnPathToSendMail() + { + $this->resetEmails(); + + $this->objSendMail->setBase('to@example.com', '件名', '本文', 'from@example.com', '差出人名', 'reply-to@example.com'); + + $this->objSendMail->setReturnPath('return-path@example.com'); + $result = $this->objSendMail->sendMail(); + $this->assertTrue($result); + + $messages = $this->getMailCatcherMessages(); + $this->assertCount(1, $messages); + + $message = $this->getLastMailCatcherMessage(); + $this->assertEquals('件名', $message['subject']); + $this->assertContains('本文', $message['source']); + $this->assertContains('text/plain', $message['source']); + + $this->assertContains('Return-Path: return-path@example.com', $message['source']); + } + + public function testUnsetErrorToSendMail() + { + $this->resetEmails(); + + $this->objSendMail->setItem('to@example.com', '件名', '本文', 'from@example.com', '差出人名', 'reply-to@example.com', 'return-path@example.com'); + $result = $this->objSendMail->sendMail(); + $this->assertTrue($result); + + $messages = $this->getMailCatcherMessages(); + $this->assertCount(1, $messages); + + $message = $this->getLastMailCatcherMessage(); + $this->assertEquals('件名', $message['subject']); + $this->assertContains('本文', $message['source']); + + $this->assertContains('text/plain', $message['source']); + + $this->assertContains('Return-Path: return-path@example.com', $message['source']); + } + + public function testUnsetReturnPathToSendMail() + { + $this->resetEmails(); + + $this->objSendMail->setItem('to@example.com', '件名', '本文', 'from@example.com', '差出人名', 'reply-to@example.com'); + $result = $this->objSendMail->sendMail(); + $this->assertTrue($result); + + $messages = $this->getMailCatcherMessages(); + $this->assertCount(1, $messages); + + $message = $this->getLastMailCatcherMessage(); + $this->assertEquals('件名', $message['subject']); + $this->assertContains('本文', $message['source']); + + $this->assertContains('text/plain', $message['source']); + + $this->assertContains('Return-Path: from@example.com', $message['source']); + } + + public function testGetRecip() + { + $this->objSendMail->setItem('to@example.com', '件名', '本文', 'from@example.com', '差出人名', 'reply-to@example.com'); + + $this->objSendMail->backend = 'mail'; + $this->expected = 'to@example.com'; + $this->actual = $this->objSendMail->getRecip(); + $this->verify(); + + $this->objSendMail->backend = 'smtp'; + $this->expected = [ + 'To' => 'to@example.com' + ]; + $this->actual = $this->objSendMail->getRecip(); + $this->verify(); + + $this->objSendMail->backend = 'sendmail'; + $this->expected = [ + 'To' => 'to@example.com' + ]; + $this->actual = $this->objSendMail->getRecip(); + $this->verify(); + } + + public function testGetBackendParams() + { + $this->expected = []; + $this->actual = $this->objSendMail->getBackendParams('mail'); + $this->verify(); + + $this->expected = [ + 'sendmail_path' => '/usr/bin/sendmail', + 'sendmail_args' => '-i', + ]; + $this->actual = $this->objSendMail->getBackendParams('sendmail'); + $this->verify(); + + $this->expected = [ + 'host' => '127.0.0.1', + 'port' => '1025' + ]; + $this->actual = $this->objSendMail->getBackendParams('smtp'); + $this->verify(); + + $this->expected = [ + 'host' => '127.0.0.1', + 'port' => '1025' + ]; + $this->actual = $this->objSendMail->getBackendParams('smtp'); + $this->verify(); + } +} From 12713ffc7946dbd4822dd14e15ca60ce26ff2bc2 Mon Sep 17 00:00:00 2001 From: Kentaro Ohkouchi Date: Thu, 11 Apr 2019 10:38:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?MailCatcher=20=E3=81=AE=E3=82=B9=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=B9=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/class/SC_SendMailTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/class/SC_SendMailTest.php b/tests/class/SC_SendMailTest.php index 55bc412d81..ea13dc3960 100644 --- a/tests/class/SC_SendMailTest.php +++ b/tests/class/SC_SendMailTest.php @@ -10,6 +10,7 @@ class SC_SendMailTest extends Common_TestCase protected function setUp() { parent::setUp(); + $this->checkMailCatcherStatus(); $this->objSendMail = new SC_SendMail_Ex(); }