diff --git a/lib/Models/ModelValidator.php b/lib/Models/ModelValidator.php index 0593df90c3..389dd2d7a6 100644 --- a/lib/Models/ModelValidator.php +++ b/lib/Models/ModelValidator.php @@ -2,6 +2,8 @@ namespace MailPoet\Models; +use MailPoet\Util\Helpers; + if(!defined('ABSPATH')) exit; class ModelValidator extends \Sudzy\Engine { @@ -35,9 +37,11 @@ class ModelValidator extends \Sudzy\Engine { } function validateRenderedNewsletterBody($newsletter_body) { - $newsletter_body = (!is_serialized($newsletter_body)) ? - $newsletter_body : - unserialize($newsletter_body); + if(is_serialized($newsletter_body)) { + $newsletter_body = unserialize($newsletter_body); + } else if(Helpers::isJson($newsletter_body)) { + $newsletter_body = json_decode($newsletter_body, true); + } return (is_null($newsletter_body) || (is_array($newsletter_body) && !empty($newsletter_body['html']) && !empty($newsletter_body['text']))); } } \ No newline at end of file diff --git a/lib/Models/SendingQueue.php b/lib/Models/SendingQueue.php index 39073cce1d..8b3c9fb279 100644 --- a/lib/Models/SendingQueue.php +++ b/lib/Models/SendingQueue.php @@ -1,6 +1,7 @@ subscribers) && !is_null($this->subscribers)) { $this->set('subscribers', serialize($this->subscribers)); } - if(!is_serialized($this->newsletter_rendered_body) && !is_null($this->newsletter_rendered_body)) { + if(!Helpers::isJson($this->newsletter_rendered_body) && !is_null($this->newsletter_rendered_body)) { $this->set( 'newsletter_rendered_body', - serialize($this->encodeEmojisInBody($this->newsletter_rendered_body)) + json_encode($this->encodeEmojisInBody($this->newsletter_rendered_body)) ); } // set the default priority to medium @@ -84,9 +85,7 @@ class SendingQueue extends Model { } function getNewsletterRenderedBody($type = false) { - $rendered_newsletter = (!is_serialized($this->newsletter_rendered_body)) ? - $this->newsletter_rendered_body : - $this->decodeEmojisInBody(unserialize($this->newsletter_rendered_body)); + $rendered_newsletter = $this->decodeRenderedNewsletterBodyObject($this->newsletter_rendered_body); return ($type && !empty($rendered_newsletter[$type])) ? $rendered_newsletter[$type] : $rendered_newsletter; @@ -165,4 +164,15 @@ class SendingQueue extends Model { } return $this->save(); } + + private function decodeRenderedNewsletterBodyObject($rendered_body) { + if(is_serialized($rendered_body)) { + return $this->decodeEmojisInBody(unserialize($rendered_body)); + } + if(Helpers::isJson($rendered_body)) { + return $this->decodeEmojisInBody(json_decode($rendered_body, true)); + } + return $rendered_body; + } + } \ No newline at end of file diff --git a/tests/unit/Models/ModelValidatorTest.php b/tests/unit/Models/ModelValidatorTest.php index 949df0e0de..55d1d5948d 100644 --- a/tests/unit/Models/ModelValidatorTest.php +++ b/tests/unit/Models/ModelValidatorTest.php @@ -36,5 +36,7 @@ class ModelValidatorTest extends \MailPoetTest { expect($this->validator->validateRenderedNewsletterBody(serialize(null)))->true(); expect($this->validator->validateRenderedNewsletterBody(serialize(array('html' => 'test', 'text' => 'test'))))->true(); expect($this->validator->validateRenderedNewsletterBody(array('html' => 'test', 'text' => 'test')))->true(); + expect($this->validator->validateRenderedNewsletterBody(json_encode(null)))->true(); + expect($this->validator->validateRenderedNewsletterBody(json_encode(array('html' => 'test', 'text' => 'test'))))->true(); } } \ No newline at end of file diff --git a/tests/unit/Models/SendingQueueTest.php b/tests/unit/Models/SendingQueueTest.php index 223b31e09c..de6834a8ee 100644 --- a/tests/unit/Models/SendingQueueTest.php +++ b/tests/unit/Models/SendingQueueTest.php @@ -1,12 +1,15 @@ queue = SendingQueue::create(); + $this->queue->newsletter_id = 1; $this->queue->save(); $this->rendered_body = array( @@ -35,8 +38,44 @@ class SendingQueueTest extends \MailPoetTest { $mock->verifyInvokedMultipleTimes('decodeEntities', 2); } + function testItReadsSerializedRenderedNewsletterBody() { + $queue = $this->queue; + $data = array( + 'html' => 'html', + 'text' => 'text' + ); + $queue->newsletter_rendered_body = serialize($data); + expect($queue->getNewsletterRenderedBody())->equals($data); + } + + function testItReadsJsonEncodedRenderedNewsletterBody() { + $queue = $this->queue; + $data = array( + 'html' => 'html', + 'text' => 'text' + ); + $queue->newsletter_rendered_body = json_encode($data); + expect($queue->getNewsletterRenderedBody())->equals($data); + } + + function testItJsonEncodesRenderedNewsletterBodyWhenSaving() { + $queue = SendingQueue::create(); + $data = array( + 'html' => 'html', + 'text' => 'text' + ); + $queue->newsletter_id = 1; + $queue->newsletter_rendered_body = $data; + $queue->save(); + + $queue = SendingQueue::findOne($queue->id); + + expect(Helpers::isJson($queue->newsletter_rendered_body))->true(); + expect(json_decode($queue->newsletter_rendered_body, true))->equals($data); + } + function _after() { Mock::clean(); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); } -} +} \ No newline at end of file