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:
@ -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.')
|
||||||
|
@ -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']);
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user