Adds method to validate rendered newsletter body on sending queue

Prevents sending queue worker from sending when sending queue's rendered
newsletter body is invalid
This commit is contained in:
Vlad
2017-07-22 18:44:45 -04:00
parent 197537d6ca
commit 1a522794d6
3 changed files with 56 additions and 4 deletions

View File

@ -1,6 +1,7 @@
<?php <?php
namespace MailPoet\Cron\Workers\SendingQueue\Tasks; namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Links as LinksTask; use MailPoet\Cron\Workers\SendingQueue\Tasks\Links as LinksTask;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Posts as PostsTask; use MailPoet\Cron\Workers\SendingQueue\Tasks\Posts as PostsTask;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes as ShortcodesTask; use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes as ShortcodesTask;
@ -89,7 +90,14 @@ class Newsletter {
$queue->newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue); $queue->newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue);
$queue->newsletter_rendered_body = $rendered_newsletter; $queue->newsletter_rendered_body = $rendered_newsletter;
$queue->save(); $queue->save();
if($queue->getErrors()) { // catch DB errors
$queue_errors = $queue->getErrors();
if(!$queue_errors) {
// verify that the rendered body was successfully saved
$queue = SendingQueueModel::findOne($queue->id);
$queue_errors = ($queue->isRenderedNewsletterBodyValid() !== true);
}
if($queue_errors) {
return MailerLog::processError( return MailerLog::processError(
'queue_save', 'queue_save',
__('There was an error processing your newsletter during sending. If possible, please contact us and report this issue.') __('There was an error processing your newsletter during sending. If possible, please contact us and report this issue.')

View File

@ -86,9 +86,8 @@ class SendingQueue extends Model {
function asArray() { function asArray() {
$model = parent::asArray(); $model = parent::asArray();
$model['subscribers'] = (is_serialized($this->subscribers)) $model['subscribers'] = $this->getSubscribers();
? unserialize($this->subscribers) $model['newsletter_rendered_body'] = $this->getNewsletterRenderedBody();
: $this->subscribers;
return $model; return $model;
} }
@ -120,6 +119,11 @@ class SendingQueue extends Model {
$this->updateCount(); $this->updateCount();
} }
function isRenderedNewsletterBodyValid() {
$newsletter_body = $this->getNewsletterRenderedBody();
return (is_array($newsletter_body) && !empty($newsletter_body['html']) && !empty($newsletter_body['text']));
}
function updateCount() { function updateCount() {
$this->subscribers = $this->getSubscribers(); $this->subscribers = $this->getSubscribers();
$this->count_processed = count($this->subscribers['processed']); $this->count_processed = count($this->subscribers['processed']);

View File

@ -1,5 +1,6 @@
<?php <?php
use AspectMock\Test as Mock;
use Codeception\Util\Fixtures; use Codeception\Util\Fixtures;
use Helper\WordPressHooks as WPHooksHelper; use Helper\WordPressHooks as WPHooksHelper;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterTask; use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterTask;
@ -271,6 +272,45 @@ class NewsletterTaskTest extends MailPoetTest {
} }
} }
function testItLogsErrorWhenQueueRenderedNewsletterBodyIsInvalid() {
$queue = $this->queue;
$queue_mock = Mock::double(
new stdClass(),
array(
'getNewsletterRenderedBody' => null
)
);
$queue_mock->id = $queue->id;
// broken serialized object
$queue->newsletter_rendered_body = 'a:2:{s:4:"html"';
$queue->save();
try {
$this->newsletter_task->preProcessNewsletter($this->newsletter, $queue_mock);
self::fail('Sending error exception was not thrown.');
} catch(Exception $e) {
$mailer_log = MailerLog::getMailerLog();
expect($mailer_log['error']['operation'])->equals('queue_save');
expect($mailer_log['error']['error_message'])->equals('There was an error processing your newsletter during sending. If possible, please contact us and report this issue.');
}
}
function testItPreProcessesNewsletterWhenQueueRenderedNewsletterBodyIsValid() {
$queue = $this->queue;
$queue_mock = Mock::double(
new stdClass(),
array(
'getNewsletterRenderedBody' => null
)
);
$queue_mock->id = $queue->id;
// properly serialized object
$queue->newsletter_rendered_body = 'a:2:{s:4:"html";s:4:"test";s:4:"text";s:4:"test";}';
$queue->save();
expect($this->newsletter_task->preProcessNewsletter($this->newsletter, $queue_mock))->equals($this->newsletter);
}
function _after() { function _after() {
WPHooksHelper::releaseAllHooks(); WPHooksHelper::releaseAllHooks();
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);