mockBuild = $this->getMock( '\PHPCI\Model\Build', array('getLog'), array(), "mockBuild", false ); $this->mockBuild->expects($this->any()) ->method('getLog') ->will($this->returnValue("Build Log")); $this->mockCiBuilder = $this->getMock( '\PHPCI\Builder', array('getSystemConfig', 'getBuildProjectTitle', 'getBuild', 'log'), array(), "mockBuilder", 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, $arrOptions, $this->mockMailer ); } /** * @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", "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, $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, $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($this->once()) ->method('send') ->will( $this->returnCallback( function ($passedMail) use (&$actualMail) { $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() ); } }