mockProject = $this->getMock( '\PHPCI\Model\Project', array('getTitle'), array(), "mockProject", false ); $this->mockProject->expects($this->any()) ->method('getTitle') ->will($this->returnValue("Test project")); $this->mockBuild = $this->getMock( '\PHPCI\Model\Build', array('getLog', 'getStatus', 'getProject'), array(), "mockBuild", false ); $this->mockBuild->expects($this->any()) ->method('getLog') ->will($this->returnValue("Build Log")); $this->mockBuild->expects($this->any()) ->method('getStatus') ->will($this->returnValue(\PHPCI\Model\Build::STATUS_SUCCESS)); $this->mockBuild->expects($this->any()) ->method('getProject') ->will($this->returnValue($this->mockProject)); $this->mockCiBuilder = $this->getMock( '\PHPCI\Builder', array( 'getSystemConfig', 'getBuildProjectTitle', 'getBuild', 'log' ), array(), "mockBuilder_email", false ); $this->mockCiBuilder->buildPath = "/"; $this->mockCiBuilder->expects($this->any()) ->method('getSystemConfig') ->with('phpci') ->will( $this->returnValue( array( 'email_settings' => array( 'from_address' => "test-from-address@example.com" ) ) ) ); $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()) { $this->testedEmailPlugin = new EmailPlugin( $this->mockCiBuilder, $this->mockBuild, $arrOptions ); } /** * @covers PHPUnit::execute */ public function testExecute_ReturnsFalseWithoutArgs() { $returnValue = $this->testedEmailPlugin->execute(); // As no addresses will have been mailed as non are configured. $expectedReturn = false; $this->assertEquals($expectedReturn, $returnValue); } /** * @covers PHPUnit::execute */ public function testExecute_BuildsBasicEmails() { $this->loadEmailPluginWithOptions( array( 'addresses' => array('test-receiver@example.com') ) ); /** @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->assertEquals($expectedReturn, $returnValue); } /** * @covers PHPUnit::sendEmail */ public function testSendEmail_CallsMailerSend() { $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 ); } /** * @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->assertEquals( array($expectedToAddress => null), $actualMail->getTo() ); $this->assertEquals( $expectedBody, $actualMail->getBody() ); $this->assertEquals( $expectedSubject, $actualMail->getSubject() ); } }