From: Gunnar Wrobel Date: Tue, 17 Aug 2010 12:36:53 +0000 (+0200) Subject: Complete unit testing for Horde_Itip. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=c7bc48514df50d139287fe88ad43cbfaa69f50ce;p=horde.git Complete unit testing for Horde_Itip. --- diff --git a/framework/Itip/lib/Horde/Itip.php b/framework/Itip/lib/Horde/Itip.php index 79898a128..77e366fa7 100644 --- a/framework/Itip/lib/Horde/Itip.php +++ b/framework/Itip/lib/Horde/Itip.php @@ -46,16 +46,6 @@ class Horde_Itip } /** - * Return the organizer mail address. - * - * @return string The mail address of the event organizer - */ - public function getOrganizer() - { - return $this->_response->getRequest()->getOrganizer(); - } - - /** * Return the response as an iCalendar vEvent object. * * @param Horde_Itip_Response_Type $type The response type. @@ -89,21 +79,27 @@ class Horde_Itip } /** - * Return the response as a MIME message. + * Send the response as a single part MIME message. + * + * @param Horde_Itip_Response_Type $type The response type. + * @param Horde_Itip_Response_Options $options The options for the response. + * @param Horde_Mail_Transport $transport The mail transport. * - * @param Horde_Itip_Response_Type $type The response type. - * @param string $product_id The ID that should be set - * as the iCalendar product - * id. * @return array A list of two object: The mime headers and the mime * message. */ - public function getMessageResponse( + public function sendSinglepartResponse( Horde_Itip_Response_Type $type, - $product_id + Horde_Itip_Response_Options $options, + Horde_Mail_Transport $transport ) { - return $this->_response->getMessage( - $type, $product_id + list($headers, $body) = $this->_response->getMessage( + $type, $options + ); + $body->send( + $this->_response->getRequest()->getOrganizer(), + $headers, + $transport ); } diff --git a/framework/Itip/lib/Horde/Itip/Response.php b/framework/Itip/lib/Horde/Itip/Response.php index c17470779..940a3e134 100644 --- a/framework/Itip/lib/Horde/Itip/Response.php +++ b/framework/Itip/lib/Horde/Itip/Response.php @@ -157,7 +157,7 @@ class Horde_Itip_Response $headers->addHeader('Date', date('r')); $headers->addHeader('From', $from); $headers->addHeader('To', $this->_request->getOrganizer()); - if ($reply_to != $from) { + if (!empty($reply_to) && $reply_to != $from) { $headers->addHeader('Reply-to', $reply_to); } $headers->addHeader( diff --git a/framework/Itip/test/Horde/Itip/Autoload.php b/framework/Itip/test/Horde/Itip/Autoload.php index bd9840f5d..6115b9fff 100644 --- a/framework/Itip/test/Horde/Itip/Autoload.php +++ b/framework/Itip/test/Horde/Itip/Autoload.php @@ -27,3 +27,6 @@ if (!spl_autoload_functions()) { /** Catch strict standards */ error_reporting(E_ALL | E_STRICT); + +/** Load dependencies from the test suite */ +require_once dirname(__FILE__) . '/Stub/Identity.php'; \ No newline at end of file diff --git a/framework/Itip/test/Horde/Itip/Integration/ItipTest.php b/framework/Itip/test/Horde/Itip/Integration/ItipTest.php index 2e36aa020..7f17f059c 100644 --- a/framework/Itip/test/Horde/Itip/Integration/ItipTest.php +++ b/framework/Itip/test/Horde/Itip/Integration/ItipTest.php @@ -36,22 +36,18 @@ require_once dirname(__FILE__) . '/../Autoload.php'; class Horde_Itip_Integration_ItipTest extends PHPUnit_Framework_TestCase { - public function testMinimalItipHandlingSteps() + public function setUp() { - $iTip = $this->_getItip(); - $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() - ); - $this->assertEquals($reply->getAttribute('ATTENDEE'), 'MAILTO:test@example.org'); + $this->_transport = new Horde_Mail_Transport_Mock(); } - public function testDefaultSequenceIdSetToZero() + public function testMinimalItipHandlingSteps() { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); - $this->assertSame($reply->getAttribute('SEQUENCE'), 0); + $this->assertEquals($reply->getAttribute('ATTENDEE'), 'mailto:test@example.org'); } public function testForCopiedSequenceIdFromRequestToResponse() @@ -60,7 +56,7 @@ extends PHPUnit_Framework_TestCase $inv->setAttribute('SEQUENCE', 555); $iTip = $this->_getItip($inv); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('SEQUENCE'), 555); } @@ -69,7 +65,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertEquals(1222419600, $reply->getAttribute('DTSTART')); } @@ -78,7 +74,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertEquals(1222423200, $reply->getAttribute('DTEND')); } @@ -96,7 +92,7 @@ extends PHPUnit_Framework_TestCase $inv->setAttribute('DURATION', 3600); $iTip = $this->_getItip($inv); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('DURATION'), 3600); } @@ -105,7 +101,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('ORGANIZER'), 'orga@example.org'); } @@ -114,7 +110,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('LOCATION'), 'Somewhere'); } @@ -123,7 +119,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('DESCRIPTION'), 'You are invited'); } @@ -132,7 +128,7 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept() + new Horde_Itip_Response_Type_Accept($this->_getResource()) ); $this->assertSame($reply->getAttribute('UID'), '1'); } @@ -141,90 +137,170 @@ extends PHPUnit_Framework_TestCase { $iTip = $this->_getItip(); $reply = $iTip->getIcalendarResponse( - new Horde_Itip_Response_Type_Accept(), '' + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab() ); $this->assertEquals($reply->getAttribute('METHOD'), 'REPLY'); } - public function testIcalendarResponseAllowsSettingTheProductId() + public function testMessageResponseHasFromAddress() { + $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getIcalendarResponse( - new Horde_Itip_Response_Type_Accept(), 'My product' + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + + $this->assertContains( + 'From: Mister Test ', + $this->_transport->sentMessages[0]['header_text'] ); - $this->assertEquals($reply->getAttribute('PRODID'), 'My product'); } - public function testMessageResponseHasFromAddress() + public function testMessageResponseWithIdentityResourceHasFromAddress() { $_SERVER['SERVER_NAME'] = 'localhost'; - $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse( - new Horde_Itip_Response_Type_Accept(), '', '' + $invitation = $this->_getInvitation(); + $resource = new Horde_Itip_Resource_Identity( + new Horde_Itip_Stub_Identity(), + 'mailto:test@example.org', + 'test' + ); + $iTip = Horde_Itip::factory( + $invitation, + $resource + ); + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($resource), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + + $this->assertContains( + 'From: "Mr. Test" ', + $this->_transport->sentMessages[0]['header_text'] + ); + } + + public function testMessageResponseWithDefaultIdentityResourceHasDefaultFromAddress() + { + $_SERVER['SERVER_NAME'] = 'localhost'; + $invitation = $this->_getInvitation(); + $resource = new Horde_Itip_Resource_Identity( + new Horde_Itip_Stub_Identity(), + 'mailto:default@example.org', + 'default' + ); + $iTip = Horde_Itip::factory( + $invitation, + $resource + ); + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($resource), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + + $this->assertContains( + 'From: default@example.org', + $this->_transport->sentMessages[0]['header_text'] ); - - $this->assertContains('From: Mister Test ', $reply[0]->toString()); } public function testMessageResponseHasToAddress() { $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse( - new Horde_Itip_Response_Type_Accept(), '', '' + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport ); - $this->assertContains('To: orga@example.org', $reply[0]->toString()); + $this->assertContains( + 'To: orga@example.org', + $this->_transport->sentMessages[0]['header_text'] + ); } public function testMessageAcceptResponseHasAcceptSubject() { $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse(new Horde_Itip_Response_Type_Accept(), ''); - $this->assertContains('Subject: Accepted: Test', $reply[0]->toString()); + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Accepted: Test', + $this->_transport->sentMessages[0]['header_text'] + ); } public function testMessageDeclineResponseHasDeclineSubject() { $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse(new Horde_Itip_Response_Type_Decline(), ''); - $this->assertContains('Subject: Declined: Test', $reply[0]->toString()); + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Decline($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Declined: Test', + $this->_transport->sentMessages[0]['header_text'] + ); } public function testMessageTentativeResponseHasTentativeSubject() { $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse(new Horde_Itip_Response_Type_Tentative(), ''); - $this->assertContains('Subject: Tentative: Test', $reply[0]->toString()); + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Tentative($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Tentative: Test', + $this->_transport->sentMessages[0]['header_text'] + ); } public function testMessageResponseAllowsAddingCommentsToTheSubject() { $_SERVER['SERVER_NAME'] = 'localhost'; $iTip = $this->_getItip(); - $reply = $iTip->getMessageResponse( - new Horde_Itip_Response_Type_Accept(), '', 'info' + $reply = $iTip->sendSinglepartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource(), 'info'), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Accepted [info]: Test', + $this->_transport->sentMessages[0]['header_text'] ); - $this->assertContains('Subject: Accepted [info]: Test', $reply[0]->toString()); } public function testAttendeeHoldsInformationAboutMailAddress() { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept(), '' + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab() ); - $this->assertEquals($reply->getAttribute('ATTENDEE'), 'MAILTO:test@example.org'); + $this->assertEquals($reply->getAttribute('ATTENDEE'), 'mailto:test@example.org'); } public function testAttendeeHoldsInformationAboutCommonNameAndStatus() { $iTip = $this->_getItip(); $reply = $iTip->getVeventResponse( - new Horde_Itip_Response_Type_Accept(), '' + new Horde_Itip_Response_Type_Accept($this->_getResource()), + new Horde_Itip_Response_Options_Kolab() ); $parameters = $reply->getAttribute('ATTENDEE', true); $this->assertEquals( @@ -236,6 +312,70 @@ extends PHPUnit_Framework_TestCase ); } + public function testMultipartMessageResponseHoldsMultipleParts() + { + $_SERVER['SERVER_NAME'] = 'localhost'; + $iTip = $this->_getItip(); + $reply = $iTip->sendMultipartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource(), 'info'), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $mail = ''; + $mail .= $this->_transport->sentMessages[0]['header_text'] . "\n\n"; + $body = $this->_transport->sentMessages[0]['body']; + while (!feof($body)) { + $mail .= fread($body, 8192); + } + $part = Horde_Mime_Part::parseMessage($mail); + $this->assertEquals(2, count($part->getParts())); + } + + public function testMultipartMessageDeclineResponseHasDeclineSubject() + { + $_SERVER['SERVER_NAME'] = 'localhost'; + $iTip = $this->_getItip(); + $reply = $iTip->sendMultipartResponse( + new Horde_Itip_Response_Type_Decline($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Declined: Test', + $this->_transport->sentMessages[0]['header_text'] + ); + } + + public function testMultipartMessageTentativeResponseHasTentativeSubject() + { + $_SERVER['SERVER_NAME'] = 'localhost'; + $iTip = $this->_getItip(); + $reply = $iTip->sendMultipartResponse( + new Horde_Itip_Response_Type_Tentative($this->_getResource()), + new Horde_Itip_Response_Options_Kolab(), + $this->_transport + ); + $this->assertContains( + 'Subject: Tentative: Test', + $this->_transport->sentMessages[0]['header_text'] + ); + } + + public function testMultipartMessageWithHordeOptionsHasMessageId() + { + $_SERVER['REMOTE_ADDR'] = 'none'; + $_SERVER['SERVER_NAME'] = 'localhost'; + $iTip = $this->_getItip(); + $reply = $iTip->sendMultipartResponse( + new Horde_Itip_Response_Type_Accept($this->_getResource(), 'info'), + new Horde_Itip_Response_Options_Horde('UTF-8', array()), + $this->_transport + ); + $this->assertContains( + 'Message-ID:', + $this->_transport->sentMessages[0]['header_text'] + ); + } private function _getItip($invitation = null) { diff --git a/framework/Itip/test/Horde/Itip/Stub/Identity.php b/framework/Itip/test/Horde/Itip/Stub/Identity.php new file mode 100644 index 000000000..ce283decd --- /dev/null +++ b/framework/Itip/test/Horde/Itip/Stub/Identity.php @@ -0,0 +1,82 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Imp + */ + +/** + * Dummy IMP_Prefs_Identity stub. + * + * Copyright 2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (GPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/gpl.html. + * + * @category Horde + * @package IMP + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/gpl.html GPL + * @link http://pear.horde.org/index.php?package=Imp + */ +class Horde_Itip_Stub_Identity +{ + private $_id = 'default'; + + public function getMatchingIdentity($mail) + { + if ($mail == 'test@example.org') { + return 'test'; + } + } + + public function setDefault($id) + { + if ($id != 'test' && $id != 'other' && $id != 'default') { + throw new Exception("Unexpected default $id!"); + } + $this->_id = $id; + } + + public function getDefault() + { + return $this->_id; + } + + public function getFromAddress() + { + if ($this->_id == 'test') { + return 'test@example.org'; + } + if ($this->_id == 'default') { + return 'default@example.org'; + } + } + + public function getValue($value) + { + switch ($value) { + case 'fullname': + if ($this->_id == 'test') { + return 'Mr. Test'; + } else { + return ''; + } + case 'replyto_addr': + switch ($this->_id) { + case 'test': + return 'test@example.org'; + case 'other': + return 'reply@example.org'; + } + } + } +} \ No newline at end of file diff --git a/framework/Itip/test/Horde/Itip/Unit/Response/Type/BaseTest.php b/framework/Itip/test/Horde/Itip/Unit/Response/Type/BaseTest.php new file mode 100644 index 000000000..17bb47c34 --- /dev/null +++ b/framework/Itip/test/Horde/Itip/Unit/Response/Type/BaseTest.php @@ -0,0 +1,49 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Itip + */ + +/** + * Prepare the test setup. + */ +require_once dirname(__FILE__) . '/../../../Autoload.php'; + +/** + * Test the base response definition. + * + * Copyright 2010 Kolab Systems AG + * + * See the enclosed file COPYING for license information (LGPL). If you did not + * receive this file, see + * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + * + * @category Horde + * @package Itip + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Itip + */ +class Horde_Itip_Unit_Response_Type_BaseTest +extends PHPUnit_Framework_TestCase +{ + /** + * @expectedException Horde_Itip_Exception + */ + public function testExceptionOnUndefinedRequest() + { + $type = new Horde_Itip_Response_Type_Accept( + new Horde_Itip_Resource_Base('', '') + ); + $type->getRequest(); + } +}