View source
<?php
namespace Drupal\Tests\queue_mail\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\Core\Test\AssertMailTrait;
use Drupal\Tests\Traits\Core\CronRunTrait;
class QueueMailFunctionalTest extends BrowserTestBase {
use AssertMailTrait;
use CronRunTrait;
protected $langcode;
protected $defaultTheme = 'stark';
protected static $modules = [
'queue_mail',
'queue_mail_test',
];
public function setUp() : void {
parent::setUp();
$this->langcode = \Drupal::languageManager()
->getDefaultLanguage()
->getId();
}
protected function getMessageParams() {
return [
'content' => $this
->randomMachineName(),
];
}
protected function setAllEmailsToBeQueued() {
\Drupal::configFactory()
->getEditable('queue_mail.settings')
->set('queue_mail_keys', '*')
->save();
}
public function testNonQueuedEmail() {
\Drupal::configFactory()
->getEditable('queue_mail.settings')
->set('queue_mail_keys', '')
->save();
$this
->sendEmailAndTest('basic', FALSE);
}
public function testQueuedEmail() {
$this
->setAllEmailsToBeQueued();
$this
->sendEmailAndTest();
}
public function testQueuedEmailKeyMatching() {
\Drupal::configFactory()
->getEditable('queue_mail.settings')
->set('queue_mail_keys', 'queue_mail_test_queued')
->save();
$this
->sendEmailAndTest('queued', TRUE);
$this
->sendEmailAndTest('not_queued', FALSE);
\Drupal::configFactory()
->getEditable('queue_mail.settings')
->set('queue_mail_keys', 'queue_mail_test_que*')
->save();
$this
->sendEmailAndTest('queued', TRUE);
$this
->sendEmailAndTest('not_queued', FALSE);
}
public function testSkippedEmail() {
$this
->setAllEmailsToBeQueued();
$this
->assertEmpty($this
->getMails(), 'Ensure that mail collector is empty.');
$this
->sendQueueMailTest('skipped', 'info@example.com', $this
->getMessageParams());
$this
->assertEmpty($this
->getMails(), 'Emails has not been sent.');
$queue = _queue_mail_get_queue();
$this
->assertEquals(0, $queue
->numberOfItems(), 'Email has not been added to the mail queue.');
$this
->cronRun();
$this
->assertEmpty($this
->getMails(), 'Emails has not been sent after cron run.');
}
public function sendEmailAndTest($mail_key = 'basic', $should_be_queued = TRUE) {
$queue = _queue_mail_get_queue();
$queue_count_before = $queue
->numberOfItems();
$email_count_before = count($this
->getMails());
$content = $this
->randomMachineName();
$message = $this
->sendQueueMailTest($mail_key, 'info@example.com', [
'content' => $content,
]);
$queue_count_after = $queue
->numberOfItems();
$email_count_after = count($this
->getMails());
if ($should_be_queued === TRUE) {
$this
->assertEquals(1, $queue_count_after - $queue_count_before, 'Email is queued.');
$this
->assertEquals(0, $email_count_after - $email_count_before, 'Queued email is not sent immediately.');
$queue_count_before = $queue
->numberOfItems();
$email_count_before = count($this
->getMails());
$this
->cronRun();
$this
->assertMailString('body', $content, 1);
$queue_count_after = $queue
->numberOfItems();
$email_count_after = count($this
->getMails());
$this
->assertEquals(-1, $queue_count_after - $queue_count_before, 'Email is sent from the queue.');
$this
->assertEquals(1, $email_count_after - $email_count_before, 'Queued email is sent on cron.');
$this
->assertMail('current_langcode', $this->langcode, 'The mail language was respected');
$this
->assertTrue($message['queued'], 'Message has been added to the queue.');
}
elseif ($should_be_queued === FALSE) {
$this
->assertEquals(0, $queue_count_after - $queue_count_before, 'Email is not queued.');
$this
->assertEquals(1, $email_count_after - $email_count_before, 'Email is sent immediately.');
$this
->assertMailString('body', $content, 1);
$this
->assertFalse($message['queued'], 'Message has not been added to the queue.');
}
}
public function testCancelMessage() {
$this
->setAllEmailsToBeQueued();
$queue = _queue_mail_get_queue();
$queue_count_init = $queue
->numberOfItems();
$params = $this
->getMessageParams();
$this
->sendQueueMailTest('cancel_message', 'cancel@example.com', $params);
$this
->sendQueueMailTest('send_message', 'send@example.com', $params);
$queue_count_after_adding = $queue
->numberOfItems();
$this
->assertEquals(2, $queue_count_after_adding - $queue_count_init, 'Emails are queued.');
$this
->cronRun();
$queue_count_after_sending = $queue
->numberOfItems();
$this
->assertEquals($queue_count_init, $queue_count_after_sending, 'Emails have been removed from queue');
$email_count_after_sending = count($this
->getMails());
$this
->assertEquals(1, $email_count_after_sending, 'One email is sent only.');
$this
->assertMailString('key', 'send_message', 1);
}
protected function sendQueueMailTest($key, $to, array $params = []) {
return \Drupal::service('plugin.manager.mail')
->mail('queue_mail_test', $key, $to, $this->langcode, $params);
}
public function testFailMessage() {
$this
->setAllEmailsToBeQueued();
$queue = _queue_mail_get_queue();
$queue_count_init = $queue
->numberOfItems();
$params = $this
->getMessageParams();
$this
->sendQueueMailTest('fail_message', 'fail@example.com', $params);
$this
->cronRun();
$queue_count_after_adding = $queue
->numberOfItems();
$this
->assertEquals(1, $queue_count_after_adding - $queue_count_init, 'Mail sending has been failed. Message is in the queue.');
$this
->sendQueueMailTest('send_message', 'send@example.com', $params);
$queue_count_after_adding = $queue
->numberOfItems();
$this
->assertEquals(2, $queue_count_after_adding - $queue_count_init, 'Mail sending has been failed. Message is in the queue.');
$this
->cronRun();
$queue_count_after_adding = $queue
->numberOfItems();
$this
->assertEquals(1, $queue_count_after_adding - $queue_count_init, 'One message has been processed.');
}
}