[ 'id' => 'php_mail', 'class' => 'Drupal\Core\Mail\Plugin\Mail\PhpMail', ], 'test_mail_collector' => [ 'id' => 'test_mail_collector', 'class' => 'Drupal\Core\Mail\Plugin\Mail\TestMailCollector', ], ]; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); // Prepare the default constructor arguments required by MailManager. $this->cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface'); $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'); // Mock a Discovery object to replace AnnotationClassDiscovery. $this->discovery = $this->getMock('Drupal\Component\Plugin\Discovery\DiscoveryInterface'); $this->discovery->expects($this->any()) ->method('getDefinitions') ->will($this->returnValue($this->definitions)); } /** * Sets up the mail manager for testing. */ protected function setUpMailManager($interface = []) { // Use the provided config for system.mail.interface settings. $this->configFactory = $this->getConfigFactoryStub([ 'system.mail' => [ 'interface' => $interface, ], 'system.site' => [ 'mail' => 'test@example.com', ], ]); $logger_factory = $this->getMock('\Drupal\Core\Logger\LoggerChannelFactoryInterface'); $string_translation = $this->getStringTranslationStub(); $this->renderer = $this->getMock(RendererInterface::class); // Construct the manager object and override its discovery. $this->mailManager = new TestMailManager(new \ArrayObject(), $this->cache, $this->moduleHandler, $this->configFactory, $logger_factory, $string_translation, $this->renderer); $this->mailManager->setDiscovery($this->discovery); // @see \Drupal\Core\Plugin\Factory\ContainerFactory::createInstance() $container = new ContainerBuilder(); $container->set('config.factory', $this->configFactory); \Drupal::setContainer($container); } /** * Tests the getInstance method. * * @covers ::getInstance */ public function testGetInstance() { $interface = [ 'default' => 'php_mail', 'default' => 'test_mail_collector', ]; $this->setUpMailManager($interface); // Test that an unmatched message_id returns the default plugin instance. $options = ['module' => 'foo', 'key' => 'bar']; $instance = $this->mailManager->getInstance($options); $this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\PhpMail', $instance); // Test that a matching message_id returns the specified plugin instance. $options = ['module' => 'example', 'key' => 'testkey']; $instance = $this->mailManager->getInstance($options); $this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\TestMailCollector', $instance); } /** * Tests that mails are sent in a separate render context. * * @covers ::mail */ public function testMailInRenderContext() { $interface = [ 'default' => 'php_mail', 'example_testkey' => 'test_mail_collector', ]; $this->setUpMailManager($interface); $this->renderer->expects($this->exactly(1)) ->method('executeInRenderContext') ->willReturnCallback(function (RenderContext $render_context, $callback) { $message = $callback(); $this->assertEquals('example', $message['module']); }); $this->mailManager->mail('example', 'key', 'to@example.org', 'en'); } } /** * Provides a testing version of MailManager with an empty constructor. */ class TestMailManager extends MailManager { /** * Sets the discovery for the manager. * * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $discovery * The discovery object. */ public function setDiscovery(DiscoveryInterface $discovery) { $this->discovery = $discovery; } /** * {@inheritdoc} */ public function doMail($module, $key, $to, $langcode, $params = [], $reply = NULL, $send = TRUE) { // Build a simplified message array and return it. $message = [ 'id' => $module . '_' . $key, 'module' => $module, 'key' => $key, 'to' => $to, 'from' => 'from@example.org', 'reply-to' => $reply, 'langcode' => $langcode, 'params' => $params, 'send' => TRUE, 'subject' => '', 'body' => [], ]; return $message; } }