diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 505cd64278..23deda134e 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -1,6 +1,7 @@ newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue); $queue->newsletter_rendered_body = $rendered_newsletter; $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( 'queue_save', __('There was an error processing your newsletter during sending. If possible, please contact us and report this issue.') diff --git a/lib/Models/SendingQueue.php b/lib/Models/SendingQueue.php index 7c5c27d844..cd335278e4 100644 --- a/lib/Models/SendingQueue.php +++ b/lib/Models/SendingQueue.php @@ -86,9 +86,8 @@ class SendingQueue extends Model { function asArray() { $model = parent::asArray(); - $model['subscribers'] = (is_serialized($this->subscribers)) - ? unserialize($this->subscribers) - : $this->subscribers; + $model['subscribers'] = $this->getSubscribers(); + $model['newsletter_rendered_body'] = $this->getNewsletterRenderedBody(); return $model; } @@ -120,6 +119,11 @@ class SendingQueue extends Model { $this->updateCount(); } + function isRenderedNewsletterBodyValid() { + $newsletter_body = $this->getNewsletterRenderedBody(); + return (is_array($newsletter_body) && !empty($newsletter_body['html']) && !empty($newsletter_body['text'])); + } + function updateCount() { $this->subscribers = $this->getSubscribers(); $this->count_processed = count($this->subscribers['processed']); diff --git a/tests/unit/Cron/Workers/SendingQueue/Tasks/NewsletterTest.php b/tests/unit/Cron/Workers/SendingQueue/Tasks/NewsletterTest.php index 1ebabf2599..f0e956a798 100644 --- a/tests/unit/Cron/Workers/SendingQueue/Tasks/NewsletterTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/Tasks/NewsletterTest.php @@ -1,5 +1,6 @@ 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() { WPHooksHelper::releaseAllHooks(); ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);