View source
<?php
namespace Drupal\Tests\simplenews\Functional;
use Drupal\node\Entity\Node;
use Drupal\user\Entity\User;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\simplenews\Spool\SpoolStorageInterface;
class SimplenewsSendTest extends SimplenewsTestBase {
protected function setUp() {
parent::setUp();
$admin_user = $this
->drupalCreateUser([
'administer newsletters',
'send newsletter',
'administer nodes',
'administer simplenews subscriptions',
'create simplenews_issue content',
'edit any simplenews_issue content',
'view own unpublished content',
'delete any simplenews_issue content',
]);
$this
->drupalLogin($admin_user);
$this
->setUpSubscribers(5);
}
public function testProgrammaticNewsletter() {
$node = Node::create([
'type' => 'simplenews_issue',
'title' => $this
->randomString(10),
'uid' => 0,
'status' => 1,
]);
$node->simplenews_issue->target_id = $this
->getRandomNewsletter();
$node->simplenews_issue->handler = 'simplenews_all';
$node
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($node);
\Drupal::service('simplenews.mailer')
->sendSpool();
\Drupal::service('simplenews.spool_storage')
->clear();
\Drupal::service('simplenews.mailer')
->updateSendStatus();
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . $node
->getTitle(), t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
$node = Node::create([
'type' => 'simplenews_issue',
'title' => $this
->randomString(10),
'uid' => 0,
'status' => 1,
]);
$node->simplenews_issue->target_id = $this
->getRandomNewsletter();
$node->simplenews_issue->handler = 'simplenews_all';
$node
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($node);
$this
->assertEqual(\Drupal::service('simplenews.spool_storage')
->countMails(), 5);
$this
->assertEqual(count(\Drupal::service('simplenews.spool_storage')
->getMails(2)), 2);
$this
->assertEqual(count(\Drupal::service('simplenews.spool_storage')
->getMails()), 3);
$this
->assertEqual(\Drupal::service('simplenews.spool_storage')
->countMails(), 5);
}
public function testSendNowNoCron() {
$config = $this
->config('simplenews.settings');
$config
->set('mail.use_cron', FALSE);
$config
->save();
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$node = Node::load($matches[1]);
$this
->clickLink(t('Newsletter'));
$this
->assertText(t('Send'));
$this
->assertText(t('Test'));
$this
->assertNoText(t('Send newsletter when published'));
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
$this
->drupalPostForm(NULL, [], t('Send now'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $node->simplenews_issue->status, t('Newsletter sending finished'));
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . $edit['title[0][value]'], t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
$this
->assertEqual(5, $node->simplenews_issue->sent_count, 'subscriber count is correct');
}
public function testSendMultipleNoCron() {
$config = $this
->config('simplenews.settings');
$config
->set('mail.use_cron', FALSE);
$config
->save();
$nodes = [];
for ($i = 0; $i < 3; $i++) {
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
'status[value]' => $i != 2,
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$nodes[] = Node::load($matches[1]);
$node = current($nodes);
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
}
}
public function testSendNowCronThrottle() {
$config = $this
->config('simplenews.settings');
$config
->set('mail.throttle', 3);
$config
->save();
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$node = Node::load($matches[1]);
$this
->clickLink(t('Newsletter'));
$this
->assertText(t('Send'));
$this
->assertText(t('Test'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
$this
->drupalPostForm(NULL, [], t('Send now'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews_issue->status, t('Newsletter sending pending.'));
$mails = $this
->getMails();
$this
->assertEqual(0, count($mails), t('No mails were sent yet.'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(5, $spooled, t('5 mails have been added to the mail spool'));
simplenews_cron();
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews_issue->status, t('Newsletter sending pending.'));
$this
->assertEqual(3, $node->simplenews_issue->sent_count, 'subscriber count is correct');
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(2, $spooled, t('2 mails remaining in spool.'));
simplenews_cron();
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $node->simplenews_issue->status, t('Newsletter sending finished.'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(0, $spooled, t('No mails remaining in spool.'));
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . $edit['title[0][value]'], t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
$this
->assertEqual(5, $node->simplenews_issue->sent_count);
}
public function testSendNowCron() {
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
];
$this
->drupalPostForm(NULL, $edit, t('Preview'));
$this
->clickLink(t('Back to content editing'));
$this
->drupalPostForm(NULL, [], t('Save'));
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$node = Node::load($matches[1]);
$this
->clickLink(t('Newsletter'));
$this
->assertText(t('Send'));
$this
->assertText(t('Test'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
$this
->drupalPostForm(NULL, [], t('Send now'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews_issue->status, t('Newsletter sending pending.'));
$mails = $this
->getMails();
$this
->assertEqual(0, count($mails), t('No mails were sent yet.'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(5, $spooled, t('5 mails have been added to the mail spool'));
$this
->clickLink(t('Edit'));
$this
->assertText(t('This newsletter issue is currently being sent. Any changes will be reflected in the e-mails which have not been sent yet.'));
simplenews_cron();
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $node->simplenews_issue->status, t('Newsletter sending finished.'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(0, $spooled, t('No mails remaining in spool.'));
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . strip_tags($edit['title[0][value]']), t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
}
public function testSendPublishNoCron() {
$config = $this
->config('simplenews.settings');
$config
->set('mail.use_cron', FALSE);
$config
->save();
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
'status[value]' => FALSE,
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$node = Node::load($matches[1]);
$this
->clickLink(t('Newsletter'));
$this
->assertText(t('Send'));
$this
->assertText(t('Test'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
$this
->drupalPostForm(NULL, [], t('Send on publish'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache([
$node
->id(),
]);
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_PUBLISH, $node->simplenews_issue->status, t('Newsletter set up for sending on publish.'));
$this
->clickLink(t('Edit'));
$this
->drupalPostForm(NULL, [
'status[value]' => TRUE,
], t('Save'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache([
$node
->id(),
]);
\Drupal::service('simplenews.mailer')
->attemptImmediateSend([], FALSE);
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache([
$node
->id(),
]);
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $node->simplenews_issue->status, t('Newsletter sending finished'));
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . $edit['title[0][value]'], t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
}
public function testUpdateNewsletter() {
$this
->drupalGet('admin/config/services/simplenews');
$this
->clickLink(t('Add newsletter'));
$edit = [
'name' => $this
->randomString(10),
'id' => strtolower($this
->randomMachineName(10)),
'description' => $this
->randomString(20),
];
$this
->drupalPostForm(NULL, $edit, t('Save'));
$this
->assertText(t('Newsletter @name has been added', [
'@name' => $edit['name'],
]));
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$first_newsletter_id = $this
->getRandomNewsletter();
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => $first_newsletter_id,
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created.');
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($matches[1]);
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter sending not started.'));
$this
->assertEqual($first_newsletter_id, $node->simplenews_issue->target_id);
do {
$second_newsletter_id = $this
->getRandomNewsletter();
} while ($first_newsletter_id == $second_newsletter_id);
$this
->clickLink(t('Edit'));
$update = [
'simplenews_issue[target_id]' => $second_newsletter_id,
];
$this
->drupalPostForm(NULL, $update, t('Save'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter sending not started.'));
$this
->assertEqual($second_newsletter_id, $node->simplenews_issue->target_id, t('Newsletter has newsletter_id @id.', [
'@id' => $second_newsletter_id,
]));
}
public function testSendFail() {
$issue = Node::create([
'type' => 'simplenews_issue',
'title' => $this
->randomString(10),
'simplenews_issue' => [
'target_id' => $this
->getRandomNewsletter(),
],
]);
$issue
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($issue);
\Drupal::messenger()
->deleteAll();
$results_alter = [
SpoolStorageInterface::STATUS_PENDING,
SpoolStorageInterface::STATUS_FAILED,
-1,
];
$this->container
->get('state')
->set('simplenews.test_result_alter', $results_alter);
simplenews_cron();
$this
->assertEqual(count(\Drupal::messenger()
->messagesByType(MessengerInterface::TYPE_ERROR)), 0, t('No error messages printed'));
$this
->drupalGet('node/1/simplenews');
$this
->assertText('Newsletter issue is pending, 0 mails sent out of 5, 1 errors.');
$results_alter = [
SpoolStorageInterface::STATUS_DONE,
SpoolStorageInterface::STATUS_PENDING,
SpoolStorageInterface::STATUS_FAILED,
];
$this->container
->get('state')
->set('simplenews.test_result_alter', $results_alter);
simplenews_cron();
$this
->drupalGet('node/1/simplenews');
$this
->assertText('Newsletter issue sent to 2 subscribers, 3 errors.');
}
public function testDelete() {
$this
->drupalGet('node/add/simplenews_issue');
$this
->assertText(t('Create Newsletter Issue'));
$config = $this
->config('simplenews.settings');
$config
->set('mail.spool_expire', 1);
$config
->save();
$edit = [
'title[0][value]' => $this
->randomString(10),
'simplenews_issue[target_id]' => 'default',
];
$this
->drupalPostForm(NULL, $edit, 'Save');
$this
->assertEqual(1, preg_match('|node/(\\d+)$|', $this
->getUrl(), $matches), 'Node created');
$node = Node::load($matches[1]);
$this
->clickLink(t('Newsletter'));
$this
->assertText(t('Send'));
$this
->assertText(t('Test'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $node->simplenews_issue->status, t('Newsletter not sent yet.'));
$this
->drupalPostForm(NULL, [], t('Send now'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews_issue->status, t('Newsletter sending pending.'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(5, $spooled, t('5 mails remaining in spool.'));
$this
->clickLink(t('Edit'));
$this
->assertNoText(t('Delete'));
simplenews_cron();
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$node = Node::load($node
->id());
$this
->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $node->simplenews_issue->status, t('Newsletter sending finished'));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(5, $spooled, t('Mails are kept in simplenews_mail_spool after being sent.'));
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('All mails were sent.'));
foreach ($mails as $mail) {
$this
->assertEqual($mail['subject'], '[Default newsletter] ' . $edit['title[0][value]'], t('Mail has correct subject'));
$this
->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
unset($this->subscribers[$mail['to']]);
}
$this
->assertEqual(0, count($this->subscribers), t('all subscribers have received a mail'));
\Drupal::database()
->update('simplenews_mail_spool')
->fields([
'timestamp' => REQUEST_TIME - $this
->config('simplenews.settings')
->get('mail.spool_progress_expiration') - 1,
])
->execute();
simplenews_cron();
\Drupal::service('simplenews.spool_storage')
->getMails();
$mails = $this
->getMails();
$this
->assertEqual(5, count($mails), t('No additional mails have been sent.'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$this
->drupalGet($node
->toUrl('edit-form'));
$this
->clickLink(t('Delete'));
$this
->drupalPostForm(NULL, [], t('Delete'));
\Drupal::entityTypeManager()
->getStorage('node')
->resetCache();
$this
->assertEmpty(Node::load($node
->id()));
$spooled = \Drupal::database()
->query('SELECT COUNT(*) FROM {simplenews_mail_spool} WHERE entity_id = :nid AND entity_type = :type', [
':nid' => $node
->id(),
':type' => 'node',
])
->fetchField();
$this
->assertEqual(0, $spooled, t('No mails remaining in spool.'));
}
public function testImpersonation() {
$admin_user = $this
->drupalCreateUser([
'administer users',
]);
$this
->drupalLogin($admin_user);
$subscribers = array_slice($this->subscribers, -3);
$users = [];
foreach ($subscribers as $subscriber) {
$user = User::create([
'name' => $this
->randomMachineName(),
'mail' => $subscriber,
'status' => 1,
]);
$user
->save();
$users[$subscriber] = $user
->id();
}
$node = Node::create([
'type' => 'simplenews_issue',
'title' => $this
->randomString(10),
'uid' => '0',
'status' => 1,
'body' => 'User ID: [current-user:uid]',
]);
$node->simplenews_issue->target_id = $this
->getRandomNewsletter();
$node->simplenews_issue->handler = 'simplenews_all';
$node
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($node);
\Drupal::service('simplenews.mailer')
->sendSpool();
\Drupal::service('simplenews.spool_storage')
->clear();
\Drupal::service('simplenews.mailer')
->updateSendStatus();
$mails = $this
->getMails();
$mails_with_users = 0;
$mails_without_users = 0;
foreach ($mails as $mail) {
$body = $mail['body'];
$user_mail = $mail['to'];
if (isset($users[$user_mail])) {
if (strpos($body, 'User ID: ' . $users[$user_mail])) {
$mails_with_users++;
}
}
else {
if (strpos($body, 'User ID: not yet assigned')) {
$mails_without_users++;
}
}
}
$this
->assertEqual(3, $mails_with_users, '3 mails with user ids found');
$this
->assertEqual(2, $mails_without_users, '2 mails with no user ids found');
}
public function testNewsletterTheme() {
\Drupal::service('theme_installer')
->install([
'simplenews_newsletter_test_theme',
]);
\Drupal::theme()
->setActiveTheme(\Drupal::service('theme.initialization')
->initTheme('simplenews_newsletter_test_theme'));
$node = Node::create([
'type' => 'simplenews_issue',
'title' => $this
->randomString(10),
'uid' => '0',
'status' => 1,
]);
$node->simplenews_issue->target_id = $this
->getRandomNewsletter();
$node->simplenews_issue->handler = 'simplenews_all';
$node
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($node);
\Drupal::service('simplenews.mailer')
->sendSpool();
\Drupal::service('simplenews.spool_storage')
->clear();
\Drupal::service('simplenews.mailer')
->updateSendStatus();
$mails = $this
->getMails();
$this
->assertTrue(strpos($mails[0]['body'], 'Simplenews test theme') != FALSE);
$this
->assertEqual(1, preg_match('/ID: [0-9]/', $mails[0]['body']), 'Mail contains the subscriber ID');
}
public function testHtmlEscaping() {
$title = '><\'"-&&--*';
$node = Node::create([
'type' => 'simplenews_issue',
'title' => $title,
'uid' => '0',
'status' => 1,
]);
$node->simplenews_issue->target_id = $this
->getRandomNewsletter();
$node->simplenews_issue->handler = 'simplenews_all';
$node
->save();
\Drupal::service('simplenews.spool_storage')
->addIssue($node);
\Drupal::service('simplenews.mailer')
->sendSpool();
\Drupal::service('simplenews.spool_storage')
->clear();
\Drupal::service('simplenews.mailer')
->updateSendStatus();
$mails = $this
->getMails();
$this
->assertTrue(strpos($mails[0]['body'], strtoupper($title)) != FALSE);
$this
->assertTrue(strpos($mails[0]['subject'], $title) != FALSE);
}
}