Mercurial > hg > cmmr2012-drupal-site
diff core/modules/contact/tests/src/Unit/MailHandlerTest.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | 12f9dff5fda9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/contact/tests/src/Unit/MailHandlerTest.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,408 @@ +<?php + +namespace Drupal\Tests\contact\Unit; + +use Drupal\contact\MailHandler; +use Drupal\contact\MailHandlerException; +use Drupal\contact\MessageInterface; +use Drupal\Core\Language\Language; +use Drupal\Core\Session\AccountInterface; +use Drupal\Tests\UnitTestCase; + +/** + * @coversDefaultClass \Drupal\contact\MailHandler + * @group contact + */ +class MailHandlerTest extends UnitTestCase { + + /** + * Language manager service. + * + * @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $languageManager; + + /** + * Logger service. + * + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $logger; + + /** + * Mail manager service. + * + * @var \Drupal\Core\Mail\MailManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mailManager; + + /** + * Contact mail messages service. + * + * @var \Drupal\contact\MailHandlerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contactMailHandler; + + /** + * The contact form entity. + * + * @var \Drupal\contact\ContactFormInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contactForm; + + /** + * The entity manager service. + * + * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityManager; + + /** + * The user storage handler. + * + * @var \Drupal\Core\Entity\EntityStorageInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $userStorage; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + $this->mailManager = $this->getMock('\Drupal\Core\Mail\MailManagerInterface'); + $this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface'); + $this->logger = $this->getMock('\Psr\Log\LoggerInterface'); + $this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface'); + $this->userStorage = $this->getMock('\Drupal\Core\Entity\EntityStorageInterface'); + $this->entityManager->expects($this->any()) + ->method('getStorage') + ->with('user') + ->willReturn($this->userStorage); + + $string_translation = $this->getStringTranslationStub(); + $this->contactMailHandler = new MailHandler($this->mailManager, $this->languageManager, $this->logger, $string_translation, $this->entityManager); + $language = new Language(['id' => 'en']); + + $this->languageManager->expects($this->any()) + ->method('getDefaultLanguage') + ->will($this->returnValue($language)); + + $this->languageManager->expects($this->any()) + ->method('getCurrentLanguage') + ->will($this->returnValue($language)); + } + + /** + * Tests the children() method with an invalid key. + * + * @covers ::sendMailMessages + */ + public function testInvalidRecipient() { + $message = $this->getMock('\Drupal\contact\MessageInterface'); + $message->expects($this->once()) + ->method('isPersonal') + ->willReturn(TRUE); + $message->expects($this->once()) + ->method('getPersonalRecipient') + ->willReturn(NULL); + $message->expects($this->once()) + ->method('getContactForm') + ->willReturn($this->getMock('\Drupal\contact\ContactFormInterface')); + $sender = $this->getMock('\Drupal\Core\Session\AccountInterface'); + $this->userStorage->expects($this->any()) + ->method('load') + ->willReturn($sender); + // User IDs 1 and 0 have special implications, use 3 instead. + $sender->expects($this->any()) + ->method('id') + ->willReturn(3); + $sender->expects($this->once()) + ->method('isAnonymous') + ->willReturn(FALSE); + $this->setExpectedException(MailHandlerException::class, 'Unable to determine message recipient'); + $this->contactMailHandler->sendMailMessages($message, $sender); + } + + /** + * Tests the sendMailMessages method. + * + * @dataProvider getSendMailMessages + * + * @covers ::sendMailMessages + */ + public function testSendMailMessages(MessageInterface $message, AccountInterface $sender, $results) { + $this->logger->expects($this->once()) + ->method('notice'); + $this->mailManager->expects($this->any()) + ->method('mail') + ->willReturnCallback( + function ($module, $key, $to, $langcode, $params, $from) use (&$results) { + $result = array_shift($results); + $this->assertEquals($module, $result['module']); + $this->assertEquals($key, $result['key']); + $this->assertEquals($to, $result['to']); + $this->assertEquals($langcode, $result['langcode']); + $this->assertArrayEquals($params, $result['params']); + $this->assertEquals($from, $result['from']); + }); + $this->userStorage->expects($this->any()) + ->method('load') + ->willReturn(clone $sender); + $this->contactMailHandler->sendMailMessages($message, $sender); + } + + /** + * Data provider for ::testSendMailMessages. + */ + public function getSendMailMessages() { + $data = []; + $recipients = ['admin@drupal.org', 'user@drupal.org']; + $default_result = [ + 'module' => 'contact', + 'key' => '', + 'to' => implode(', ', $recipients), + 'langcode' => 'en', + 'params' => [], + 'from' => 'anonymous@drupal.org', + ]; + $results = []; + $message = $this->getAnonymousMockMessage($recipients, ''); + $sender = $this->getMockSender(); + $result = [ + 'key' => 'page_mail', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'contact_form' => $message->getContactForm(), + ], + ]; + $results[] = $result + $default_result; + $data[] = [$message, $sender, $results]; + + $results = []; + $message = $this->getAnonymousMockMessage($recipients, 'reply'); + $sender = $this->getMockSender(); + $result = [ + 'key' => 'page_mail', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'contact_form' => $message->getContactForm(), + ], + ]; + $results[] = $result + $default_result; + $result['key'] = 'page_autoreply'; + $result['to'] = 'anonymous@drupal.org'; + $result['from'] = NULL; + $results[] = $result + $default_result; + $data[] = [$message, $sender, $results]; + + $results = []; + $message = $this->getAnonymousMockMessage($recipients, '', TRUE); + $sender = $this->getMockSender(); + $result = [ + 'key' => 'page_mail', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'contact_form' => $message->getContactForm(), + ], + ]; + $results[] = $result + $default_result; + $result['key'] = 'page_copy'; + $result['to'] = 'anonymous@drupal.org'; + $results[] = $result + $default_result; + $data[] = [$message, $sender, $results]; + + $results = []; + $message = $this->getAnonymousMockMessage($recipients, 'reply', TRUE); + $sender = $this->getMockSender(); + $result = [ + 'key' => 'page_mail', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'contact_form' => $message->getContactForm(), + ], + ]; + $results[] = $result + $default_result; + $result['key'] = 'page_copy'; + $result['to'] = 'anonymous@drupal.org'; + $results[] = $result + $default_result; + $result['key'] = 'page_autoreply'; + $result['from'] = NULL; + $results[] = $result + $default_result; + $data[] = [$message, $sender, $results]; + + // For authenticated user. + $results = []; + $message = $this->getAuthenticatedMockMessage(); + $sender = $this->getMockSender(FALSE, 'user@drupal.org'); + $result = [ + 'module' => 'contact', + 'key' => 'user_mail', + 'to' => 'user2@drupal.org', + 'langcode' => 'en', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'recipient' => $message->getPersonalRecipient(), + ], + 'from' => 'user@drupal.org', + ]; + $results[] = $result; + $data[] = [$message, $sender, $results]; + + $results = []; + $message = $this->getAuthenticatedMockMessage(TRUE); + $sender = $this->getMockSender(FALSE, 'user@drupal.org'); + $result = [ + 'module' => 'contact', + 'key' => 'user_mail', + 'to' => 'user2@drupal.org', + 'langcode' => 'en', + 'params' => [ + 'contact_message' => $message, + 'sender' => $sender, + 'recipient' => $message->getPersonalRecipient(), + ], + 'from' => 'user@drupal.org', + ]; + $results[] = $result; + + $result['key'] = 'user_copy'; + $result['to'] = $result['from']; + $results[] = $result; + $data[] = [$message, $sender, $results]; + + return $data; + } + + /** + * Builds a mock sender on given scenario. + * + * @param bool $anonymous + * TRUE if the sender is anonymous. + * @param string $mail_address + * The mail address of the user. + * + * @return \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject + * Mock sender for testing. + */ + protected function getMockSender($anonymous = TRUE, $mail_address = 'anonymous@drupal.org') { + $sender = $this->getMock('\Drupal\Core\Session\AccountInterface'); + $sender->expects($this->once()) + ->method('isAnonymous') + ->willReturn($anonymous); + $sender->expects($this->any()) + ->method('getEmail') + ->willReturn($mail_address); + $sender->expects($this->any()) + ->method('getDisplayName') + ->willReturn('user'); + // User ID 1 has special implications, use 3 instead. + $sender->expects($this->any()) + ->method('id') + ->willReturn($anonymous ? 0 : 3); + if ($anonymous) { + // Anonymous user values set in params include updated values for name and + // mail. + $sender->name = 'Anonymous (not verified)'; + $sender->mail = 'anonymous@drupal.org'; + } + return $sender; + } + + /** + * Builds a mock message from anonymous user. + * + * @param array $recipients + * An array of recipient email addresses. + * @param bool $auto_reply + * TRUE if auto reply is enable. + * @param bool $copy_sender + * TRUE if a copy should be sent, FALSE if not. + * + * @return \Drupal\contact\MessageInterface|\PHPUnit_Framework_MockObject_MockObject + * Mock message for testing. + */ + protected function getAnonymousMockMessage($recipients, $auto_reply, $copy_sender = FALSE) { + $message = $this->getMock('\Drupal\contact\MessageInterface'); + $message->expects($this->any()) + ->method('getSenderName') + ->willReturn('Anonymous'); + $message->expects($this->once()) + ->method('getSenderMail') + ->willReturn('anonymous@drupal.org'); + $message->expects($this->any()) + ->method('isPersonal') + ->willReturn(FALSE); + $message->expects($this->once()) + ->method('copySender') + ->willReturn($copy_sender); + $message->expects($this->any()) + ->method('getContactForm') + ->willReturn($this->getMockContactForm($recipients, $auto_reply)); + return $message; + } + + /** + * Builds a mock message from authenticated user. + * + * @param bool $copy_sender + * TRUE if a copy should be sent, FALSE if not. + * + * @return \Drupal\contact\MessageInterface|\PHPUnit_Framework_MockObject_MockObject + * Mock message for testing. + */ + protected function getAuthenticatedMockMessage($copy_sender = FALSE) { + $message = $this->getMock('\Drupal\contact\MessageInterface'); + $message->expects($this->any()) + ->method('isPersonal') + ->willReturn(TRUE); + $message->expects($this->once()) + ->method('copySender') + ->willReturn($copy_sender); + $recipient = $this->getMock('\Drupal\user\UserInterface'); + $recipient->expects($this->once()) + ->method('getEmail') + ->willReturn('user2@drupal.org'); + $recipient->expects($this->any()) + ->method('getDisplayName') + ->willReturn('user2'); + $recipient->expects($this->once()) + ->method('getPreferredLangcode') + ->willReturn('en'); + $message->expects($this->any()) + ->method('getPersonalRecipient') + ->willReturn($recipient); + $message->expects($this->any()) + ->method('getContactForm') + ->willReturn($this->getMockContactForm('user2@drupal.org', FALSE)); + return $message; + } + + /** + * Builds a mock message on given scenario. + * + * @param array $recipients + * An array of recipient email addresses. + * @param string $auto_reply + * An auto-reply message to send to the message author. + * + * @return \Drupal\contact\ContactFormInterface|\PHPUnit_Framework_MockObject_MockObject + * Mock message for testing. + */ + protected function getMockContactForm($recipients, $auto_reply) { + $contact_form = $this->getMock('\Drupal\contact\ContactFormInterface'); + $contact_form->expects($this->once()) + ->method('getRecipients') + ->willReturn($recipients); + $contact_form->expects($this->once()) + ->method('getReply') + ->willReturn($auto_reply); + + return $contact_form; + } + +}