diff --git a/Tests/PHPCI/Plugin/EmailTest.php b/Tests/PHPCI/Plugin/EmailTest.php index 855736f2..e311d508 100644 --- a/Tests/PHPCI/Plugin/EmailTest.php +++ b/Tests/PHPCI/Plugin/EmailTest.php @@ -10,6 +10,7 @@ namespace PHPCI\Plugin\Tests; use PHPCI\Plugin\Email as EmailPlugin; +use PHPCI\Model\Build; /** @@ -39,8 +40,26 @@ class EmailTest extends \PHPUnit_Framework_TestCase */ protected $mockProject; + /** + * @var int buildStatus + */ + protected $buildStatus; + + /** + * @var array $message; + */ + protected $message; + + /** + * @var bool $mailDelivered + */ + protected $mailDelivered; + public function setUp() { + $this->message = array(); + $this->mailDelivered = true; + $this->mockProject = $this->getMock( '\PHPCI\Model\Project', array('getTitle'), @@ -51,11 +70,11 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->mockProject->expects($this->any()) ->method('getTitle') - ->will($this->returnValue("Test project")); + ->will($this->returnValue("Test-Project")); $this->mockBuild = $this->getMock( '\PHPCI\Model\Build', - array('getLog', 'getStatus', 'getProject'), + array('getLog', 'getStatus', 'getProject', 'getCommitterEmail'), array(), "mockBuild", false @@ -67,17 +86,22 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->mockBuild->expects($this->any()) ->method('getStatus') - ->will($this->returnValue(\PHPCI\Model\Build::STATUS_SUCCESS)); + ->will($this->returnCallback(function () { + return $this->buildStatus; + })); $this->mockBuild->expects($this->any()) ->method('getProject') ->will($this->returnValue($this->mockProject)); + $this->mockBuild->expects($this->any()) + ->method('getCommitterEmail') + ->will($this->returnValue('committer-email@example.com')); + $this->mockCiBuilder = $this->getMock( '\PHPCI\Builder', array( 'getSystemConfig', - 'getBuildProjectTitle', 'getBuild', 'log' ), @@ -100,30 +124,41 @@ class EmailTest extends \PHPUnit_Framework_TestCase ) ) ); - $this->mockCiBuilder->expects($this->any()) - ->method('getBuildProjectTitle') - ->will($this->returnValue('Test-Project')); - $this->mockCiBuilder->expects($this->any()) - ->method('getBuild') - ->will($this->returnValue($this->mockBuild)); - - $this->mockMailer = $this->getMock( - '\Swift_Mailer', - array('send'), - array(), - "mockMailer", - false - ); - - $this->loadEmailPluginWithOptions(); } - protected function loadEmailPluginWithOptions($arrOptions = array()) + protected function loadEmailPluginWithOptions($arrOptions = array(), $buildStatus = null, $mailDelivered = true) { - $this->testedEmailPlugin = new EmailPlugin( - $this->mockCiBuilder, - $this->mockBuild, - $arrOptions + $this->mailDelivered = $mailDelivered; + + if (is_null($buildStatus)) { + $this->buildStatus = Build::STATUS_SUCCESS; + } else { + $this->buildStatus = $buildStatus; + } + + // Reset current message. + $this->message = array(); + + $this->testedEmailPlugin = $this->getMock( + '\PHPCI\Plugin\Email', + array('sendEmail'), + array( + $this->mockCiBuilder, + $this->mockBuild, + $arrOptions + ) + ); + + $this->testedEmailPlugin->expects($this->any()) + ->method('sendEmail') + ->will($this->returnCallback(function ($to, $cc, $subject, $body) { + $this->message['to'][] = $to; + $this->message['cc'] = $cc; + $this->message['subject'] = $subject; + $this->message['body'] = $body; + + return $this->mailDelivered; + }) ); } @@ -132,7 +167,10 @@ class EmailTest extends \PHPUnit_Framework_TestCase */ public function testExecute_ReturnsFalseWithoutArgs() { + $this->loadEmailPluginWithOptions(); + $returnValue = $this->testedEmailPlugin->execute(); + // As no addresses will have been mailed as non are configured. $expectedReturn = false; @@ -147,145 +185,183 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->loadEmailPluginWithOptions( array( 'addresses' => array('test-receiver@example.com') - ) + ), + Build::STATUS_SUCCESS ); - /** @var \Swift_Message $actualMail */ - $actualMail = null; - $this->catchMailPassedToSend($actualMail); - $returnValue = $this->testedEmailPlugin->execute(); - $expectedReturn = true; - $this->assertSystemMail( - 'test-receiver@example.com', - 'test-from-address@example.com', - "Log Output:
Build Log
", - "PHPCI - Test-Project - Passing Build", - $actualMail + $this->assertContains('test-receiver@example.com', $this->message['to']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_BuildsDefaultEmails() + { + $this->loadEmailPluginWithOptions( + array( + 'default_mailto_address' => 'default-mailto-address@example.com' + ), + Build::STATUS_SUCCESS ); - $this->assertEquals($expectedReturn, $returnValue); - + $returnValue = $this->testedEmailPlugin->execute(); + $this->assertContains('default-mailto-address@example.com', $this->message['to']); } /** - * @covers PHPUnit::sendEmail + * @covers PHPUnit::execute */ - public function testSendEmail_CallsMailerSend() + public function testExecute_CcDefaultEmails() { - $this->mockMailer->expects($this->once()) - ->method('send'); - $this->testedEmailPlugin->sendEmail("test@email.com", array(), "hello", "body"); - } - - /** - * @covers PHPUnit::sendEmail - */ - public function testSendEmail_BuildsAMessageObject() - { - $subject = "Test mail"; - $body = "Message Body"; - $toAddress = "test@example.com"; - - $this->mockMailer->expects($this->once()) - ->method('send') - ->with($this->isInstanceOf('\Swift_Message'), $this->anything()); - $this->testedEmailPlugin->sendEmail($toAddress, array(), $subject, $body); - } - - /** - * @covers PHPUnit::sendEmail - */ - public function testSendEmail_BuildsExpectedMessage() - { - $subject = "Test mail"; - $body = "Message Body"; - $toAddress = "test@example.com"; - $expectedMessage = \Swift_Message::newInstance($subject) - ->setFrom('test-from-address@example.com') - ->setTo($toAddress) - ->setBody($body); - - /** @var \Swift_Message $actualMail */ - $actualMail = null; - $this->catchMailPassedToSend($actualMail); - - $this->testedEmailPlugin->sendEmail($toAddress, array(), $subject, $body); - - $this->assertSystemMail( - $toAddress, - 'test-from-address@example.com', - $body, - $subject, - $actualMail + $this->loadEmailPluginWithOptions( + array( + 'default_mailto_address' => 'default-mailto-address@example.com', + 'cc' => array( + 'cc-email-1@example.com', + 'cc-email-2@example.com', + 'cc-email-3@example.com', + ), + ), + Build::STATUS_SUCCESS ); - } - /** - * @param \Swift_Message $actualMail passed by ref and populated with - * the message object the mock mailer - * receives. - */ - protected function catchMailPassedToSend(&$actualMail) - { - $this->mockMailer->expects(is_array($actualMail) ? $this->atLeast(1) : $this->once()) - ->method('send') - ->will( - $this->returnCallback( - function ($passedMail) use (&$actualMail) { - if(is_array($actualMail)) { - $actualMail[] = $passedMail; - } else { - $actualMail = $passedMail; - } - return array(); - } - ) - ); - } - - /** - * Asserts that the actual mail object is populated as expected. - * - * @param string $expectedToAddress - * @param $expectedFromAddress - * @param string $expectedBody - * @param string $expectedSubject - * @param \Swift_Message $actualMail - */ - protected function assertSystemMail( - $expectedToAddress, - $expectedFromAddress, - $expectedBody, - $expectedSubject, - $actualMail - ) { - if (!($actualMail instanceof \Swift_Message)) { - $type = is_object($actualMail) ? get_class($actualMail) : gettype( - $actualMail - ); - throw new \Exception("Expected Swift_Message got " . $type); - } - $this->assertEquals( - array($expectedFromAddress => null), - $actualMail->getFrom() - ); + $this->testedEmailPlugin->execute(); $this->assertEquals( - array($expectedToAddress => null), - $actualMail->getTo() + array( + 'cc-email-1@example.com', + 'cc-email-2@example.com', + 'cc-email-3@example.com', + ), + $this->message['cc'] + ); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_BuildsCommitterEmails() + { + $this->loadEmailPluginWithOptions( + array( + 'committer' => true + ), + Build::STATUS_SUCCESS ); - $this->assertEquals( - $expectedBody, - $actualMail->getBody() + $this->testedEmailPlugin->execute(); + + $this->assertContains('committer-email@example.com', $this->message['to']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailSuccessfulBuildHaveProjectName() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_SUCCESS ); - $this->assertEquals( - $expectedSubject, - $actualMail->getSubject() + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertContains('Test-Project', $this->message['subject']); + $this->assertContains('Test-Project', $this->message['body']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailFailingBuildHaveProjectName() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_FAILED ); + + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertContains('Test-Project', $this->message['subject']); + $this->assertContains('Test-Project', $this->message['body']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailSuccessfulBuildHaveStatus() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_SUCCESS + ); + + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertContains('Passing', $this->message['subject']); + $this->assertContains('successfull', $this->message['body']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailFailingBuildHaveStatus() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_FAILED + ); + + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertContains('Failing', $this->message['subject']); + $this->assertContains('failed', $this->message['body']); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailDeliverySuccess() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_FAILED, + true + ); + + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertEquals(true, $returnValue); + } + + /** + * @covers PHPUnit::execute + */ + public function testExecute_MailDeliveryFail() + { + $this->loadEmailPluginWithOptions( + array( + 'addresses' => array('test-receiver@example.com') + ), + Build::STATUS_FAILED, + false + ); + + $returnValue = $this->testedEmailPlugin->execute(); + + $this->assertEquals(false, $returnValue); } }