Chris@0: mailManager = $this->getMock('\Drupal\Core\Mail\MailManagerInterface'); Chris@0: $this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface'); Chris@0: $this->logger = $this->getMock('\Psr\Log\LoggerInterface'); Chris@18: $this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class); Chris@0: $this->userStorage = $this->getMock('\Drupal\Core\Entity\EntityStorageInterface'); Chris@18: $this->entityTypeManager->expects($this->any()) Chris@0: ->method('getStorage') Chris@0: ->with('user') Chris@0: ->willReturn($this->userStorage); Chris@0: Chris@0: $string_translation = $this->getStringTranslationStub(); Chris@18: $this->contactMailHandler = new MailHandler($this->mailManager, $this->languageManager, $this->logger, $string_translation, $this->entityTypeManager); Chris@0: $language = new Language(['id' => 'en']); Chris@0: Chris@0: $this->languageManager->expects($this->any()) Chris@0: ->method('getDefaultLanguage') Chris@0: ->will($this->returnValue($language)); Chris@0: Chris@0: $this->languageManager->expects($this->any()) Chris@0: ->method('getCurrentLanguage') Chris@0: ->will($this->returnValue($language)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the children() method with an invalid key. Chris@0: * Chris@0: * @covers ::sendMailMessages Chris@0: */ Chris@0: public function testInvalidRecipient() { Chris@0: $message = $this->getMock('\Drupal\contact\MessageInterface'); Chris@0: $message->expects($this->once()) Chris@0: ->method('isPersonal') Chris@0: ->willReturn(TRUE); Chris@0: $message->expects($this->once()) Chris@0: ->method('getPersonalRecipient') Chris@0: ->willReturn(NULL); Chris@0: $message->expects($this->once()) Chris@0: ->method('getContactForm') Chris@0: ->willReturn($this->getMock('\Drupal\contact\ContactFormInterface')); Chris@0: $sender = $this->getMock('\Drupal\Core\Session\AccountInterface'); Chris@0: $this->userStorage->expects($this->any()) Chris@0: ->method('load') Chris@0: ->willReturn($sender); Chris@0: // User IDs 1 and 0 have special implications, use 3 instead. Chris@0: $sender->expects($this->any()) Chris@0: ->method('id') Chris@0: ->willReturn(3); Chris@0: $sender->expects($this->once()) Chris@0: ->method('isAnonymous') Chris@0: ->willReturn(FALSE); Chris@0: $this->setExpectedException(MailHandlerException::class, 'Unable to determine message recipient'); Chris@0: $this->contactMailHandler->sendMailMessages($message, $sender); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the sendMailMessages method. Chris@0: * Chris@0: * @dataProvider getSendMailMessages Chris@0: * Chris@0: * @covers ::sendMailMessages Chris@0: */ Chris@0: public function testSendMailMessages(MessageInterface $message, AccountInterface $sender, $results) { Chris@0: $this->logger->expects($this->once()) Chris@0: ->method('notice'); Chris@0: $this->mailManager->expects($this->any()) Chris@0: ->method('mail') Chris@0: ->willReturnCallback( Chris@0: function ($module, $key, $to, $langcode, $params, $from) use (&$results) { Chris@0: $result = array_shift($results); Chris@0: $this->assertEquals($module, $result['module']); Chris@0: $this->assertEquals($key, $result['key']); Chris@0: $this->assertEquals($to, $result['to']); Chris@0: $this->assertEquals($langcode, $result['langcode']); Chris@0: $this->assertArrayEquals($params, $result['params']); Chris@0: $this->assertEquals($from, $result['from']); Chris@0: }); Chris@0: $this->userStorage->expects($this->any()) Chris@0: ->method('load') Chris@0: ->willReturn(clone $sender); Chris@0: $this->contactMailHandler->sendMailMessages($message, $sender); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for ::testSendMailMessages. Chris@0: */ Chris@0: public function getSendMailMessages() { Chris@0: $data = []; Chris@0: $recipients = ['admin@drupal.org', 'user@drupal.org']; Chris@0: $default_result = [ Chris@0: 'module' => 'contact', Chris@0: 'key' => '', Chris@0: 'to' => implode(', ', $recipients), Chris@0: 'langcode' => 'en', Chris@0: 'params' => [], Chris@0: 'from' => 'anonymous@drupal.org', Chris@0: ]; Chris@0: $results = []; Chris@0: $message = $this->getAnonymousMockMessage($recipients, ''); Chris@0: $sender = $this->getMockSender(); Chris@0: $result = [ Chris@0: 'key' => 'page_mail', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'contact_form' => $message->getContactForm(), Chris@0: ], Chris@0: ]; Chris@0: $results[] = $result + $default_result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: $results = []; Chris@0: $message = $this->getAnonymousMockMessage($recipients, 'reply'); Chris@0: $sender = $this->getMockSender(); Chris@0: $result = [ Chris@0: 'key' => 'page_mail', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'contact_form' => $message->getContactForm(), Chris@0: ], Chris@0: ]; Chris@0: $results[] = $result + $default_result; Chris@0: $result['key'] = 'page_autoreply'; Chris@0: $result['to'] = 'anonymous@drupal.org'; Chris@0: $result['from'] = NULL; Chris@0: $results[] = $result + $default_result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: $results = []; Chris@0: $message = $this->getAnonymousMockMessage($recipients, '', TRUE); Chris@0: $sender = $this->getMockSender(); Chris@0: $result = [ Chris@0: 'key' => 'page_mail', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'contact_form' => $message->getContactForm(), Chris@0: ], Chris@0: ]; Chris@0: $results[] = $result + $default_result; Chris@0: $result['key'] = 'page_copy'; Chris@0: $result['to'] = 'anonymous@drupal.org'; Chris@0: $results[] = $result + $default_result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: $results = []; Chris@0: $message = $this->getAnonymousMockMessage($recipients, 'reply', TRUE); Chris@0: $sender = $this->getMockSender(); Chris@0: $result = [ Chris@0: 'key' => 'page_mail', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'contact_form' => $message->getContactForm(), Chris@0: ], Chris@0: ]; Chris@0: $results[] = $result + $default_result; Chris@0: $result['key'] = 'page_copy'; Chris@0: $result['to'] = 'anonymous@drupal.org'; Chris@0: $results[] = $result + $default_result; Chris@0: $result['key'] = 'page_autoreply'; Chris@0: $result['from'] = NULL; Chris@0: $results[] = $result + $default_result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: // For authenticated user. Chris@0: $results = []; Chris@0: $message = $this->getAuthenticatedMockMessage(); Chris@0: $sender = $this->getMockSender(FALSE, 'user@drupal.org'); Chris@0: $result = [ Chris@0: 'module' => 'contact', Chris@0: 'key' => 'user_mail', Chris@0: 'to' => 'user2@drupal.org', Chris@0: 'langcode' => 'en', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'recipient' => $message->getPersonalRecipient(), Chris@0: ], Chris@0: 'from' => 'user@drupal.org', Chris@0: ]; Chris@0: $results[] = $result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: $results = []; Chris@0: $message = $this->getAuthenticatedMockMessage(TRUE); Chris@0: $sender = $this->getMockSender(FALSE, 'user@drupal.org'); Chris@0: $result = [ Chris@0: 'module' => 'contact', Chris@0: 'key' => 'user_mail', Chris@0: 'to' => 'user2@drupal.org', Chris@0: 'langcode' => 'en', Chris@0: 'params' => [ Chris@0: 'contact_message' => $message, Chris@0: 'sender' => $sender, Chris@0: 'recipient' => $message->getPersonalRecipient(), Chris@0: ], Chris@0: 'from' => 'user@drupal.org', Chris@0: ]; Chris@0: $results[] = $result; Chris@0: Chris@0: $result['key'] = 'user_copy'; Chris@0: $result['to'] = $result['from']; Chris@0: $results[] = $result; Chris@0: $data[] = [$message, $sender, $results]; Chris@0: Chris@0: return $data; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds a mock sender on given scenario. Chris@0: * Chris@0: * @param bool $anonymous Chris@0: * TRUE if the sender is anonymous. Chris@0: * @param string $mail_address Chris@0: * The mail address of the user. Chris@0: * Chris@0: * @return \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject Chris@0: * Mock sender for testing. Chris@0: */ Chris@0: protected function getMockSender($anonymous = TRUE, $mail_address = 'anonymous@drupal.org') { Chris@0: $sender = $this->getMock('\Drupal\Core\Session\AccountInterface'); Chris@0: $sender->expects($this->once()) Chris@0: ->method('isAnonymous') Chris@0: ->willReturn($anonymous); Chris@0: $sender->expects($this->any()) Chris@0: ->method('getEmail') Chris@0: ->willReturn($mail_address); Chris@0: $sender->expects($this->any()) Chris@0: ->method('getDisplayName') Chris@0: ->willReturn('user'); Chris@0: // User ID 1 has special implications, use 3 instead. Chris@0: $sender->expects($this->any()) Chris@0: ->method('id') Chris@0: ->willReturn($anonymous ? 0 : 3); Chris@0: if ($anonymous) { Chris@0: // Anonymous user values set in params include updated values for name and Chris@0: // mail. Chris@0: $sender->name = 'Anonymous (not verified)'; Chris@0: $sender->mail = 'anonymous@drupal.org'; Chris@0: } Chris@0: return $sender; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds a mock message from anonymous user. Chris@0: * Chris@0: * @param array $recipients Chris@0: * An array of recipient email addresses. Chris@0: * @param bool $auto_reply Chris@0: * TRUE if auto reply is enable. Chris@0: * @param bool $copy_sender Chris@0: * TRUE if a copy should be sent, FALSE if not. Chris@0: * Chris@0: * @return \Drupal\contact\MessageInterface|\PHPUnit_Framework_MockObject_MockObject Chris@0: * Mock message for testing. Chris@0: */ Chris@0: protected function getAnonymousMockMessage($recipients, $auto_reply, $copy_sender = FALSE) { Chris@0: $message = $this->getMock('\Drupal\contact\MessageInterface'); Chris@0: $message->expects($this->any()) Chris@0: ->method('getSenderName') Chris@0: ->willReturn('Anonymous'); Chris@0: $message->expects($this->once()) Chris@0: ->method('getSenderMail') Chris@0: ->willReturn('anonymous@drupal.org'); Chris@0: $message->expects($this->any()) Chris@0: ->method('isPersonal') Chris@0: ->willReturn(FALSE); Chris@0: $message->expects($this->once()) Chris@0: ->method('copySender') Chris@0: ->willReturn($copy_sender); Chris@0: $message->expects($this->any()) Chris@0: ->method('getContactForm') Chris@0: ->willReturn($this->getMockContactForm($recipients, $auto_reply)); Chris@0: return $message; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds a mock message from authenticated user. Chris@0: * Chris@0: * @param bool $copy_sender Chris@0: * TRUE if a copy should be sent, FALSE if not. Chris@0: * Chris@0: * @return \Drupal\contact\MessageInterface|\PHPUnit_Framework_MockObject_MockObject Chris@0: * Mock message for testing. Chris@0: */ Chris@0: protected function getAuthenticatedMockMessage($copy_sender = FALSE) { Chris@0: $message = $this->getMock('\Drupal\contact\MessageInterface'); Chris@0: $message->expects($this->any()) Chris@0: ->method('isPersonal') Chris@0: ->willReturn(TRUE); Chris@0: $message->expects($this->once()) Chris@0: ->method('copySender') Chris@0: ->willReturn($copy_sender); Chris@0: $recipient = $this->getMock('\Drupal\user\UserInterface'); Chris@0: $recipient->expects($this->once()) Chris@0: ->method('getEmail') Chris@0: ->willReturn('user2@drupal.org'); Chris@14: $recipient->expects($this->any()) Chris@0: ->method('getDisplayName') Chris@0: ->willReturn('user2'); Chris@0: $recipient->expects($this->once()) Chris@0: ->method('getPreferredLangcode') Chris@0: ->willReturn('en'); Chris@0: $message->expects($this->any()) Chris@0: ->method('getPersonalRecipient') Chris@0: ->willReturn($recipient); Chris@0: $message->expects($this->any()) Chris@0: ->method('getContactForm') Chris@0: ->willReturn($this->getMockContactForm('user2@drupal.org', FALSE)); Chris@0: return $message; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds a mock message on given scenario. Chris@0: * Chris@0: * @param array $recipients Chris@0: * An array of recipient email addresses. Chris@0: * @param string $auto_reply Chris@0: * An auto-reply message to send to the message author. Chris@0: * Chris@0: * @return \Drupal\contact\ContactFormInterface|\PHPUnit_Framework_MockObject_MockObject Chris@0: * Mock message for testing. Chris@0: */ Chris@0: protected function getMockContactForm($recipients, $auto_reply) { Chris@0: $contact_form = $this->getMock('\Drupal\contact\ContactFormInterface'); Chris@0: $contact_form->expects($this->once()) Chris@0: ->method('getRecipients') Chris@0: ->willReturn($recipients); Chris@0: $contact_form->expects($this->once()) Chris@0: ->method('getReply') Chris@0: ->willReturn($auto_reply); Chris@0: Chris@0: return $contact_form; Chris@0: } Chris@0: Chris@0: }