diff --git a/lib/Models/SendingQueue.php b/lib/Models/SendingQueue.php index 331fe15ea1..bf8512c599 100644 --- a/lib/Models/SendingQueue.php +++ b/lib/Models/SendingQueue.php @@ -65,6 +65,20 @@ class SendingQueue extends Model { return $this; } + /** + * Used only for checking processed subscribers in old queues + */ + private function getSubscribers() { + if(!is_serialized($this->subscribers)) { + return $this->subscribers; + } + $subscribers = unserialize($this->subscribers); + if(empty($subscribers['processed'])) { + $subscribers['processed'] = array(); + } + return $subscribers; + } + function getNewsletterRenderedBody($type = false) { $rendered_newsletter = $this->decodeRenderedNewsletterBodyObject($this->newsletter_rendered_body); return ($type && !empty($rendered_newsletter[$type])) ? @@ -95,8 +109,18 @@ class SendingQueue extends Model { } function isSubscriberProcessed($subscriber_id) { - $task_subscribers = new TaskSubscribers($this->task()->findOne()); - return $task_subscribers->isSubscriberProcessed($subscriber_id); + if(!empty($this->subscribers) + && ScheduledTaskSubscriber::getTotalCount($this->task_id) === 0 + ) { + $subscribers = $this->getSubscribers(); + return in_array($subscriber_id, $subscribers['processed']); + } else { + if($task = $this->task()->findOne()) { + $task_subscribers = new TaskSubscribers($task); + return $task_subscribers->isSubscriberProcessed($subscriber_id); + } + return false; + } } function asArray() { diff --git a/tests/unit/Models/SendingQueueTest.php b/tests/unit/Models/SendingQueueTest.php index 292a48a16e..eac1833017 100644 --- a/tests/unit/Models/SendingQueueTest.php +++ b/tests/unit/Models/SendingQueueTest.php @@ -3,7 +3,10 @@ namespace MailPoet\Test\Models; use AspectMock\Test as Mock; +use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\SendingQueue; +use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Util\Helpers; class SendingQueueTest extends \MailPoetTest { @@ -39,6 +42,23 @@ class SendingQueueTest extends \MailPoetTest { $mock->verifyInvokedMultipleTimes('decodeEntities', 2); } + function testItChecksProcessedSubscribersForOldQueues() { + $subscriber_id = 123; + expect($this->queue->isSubscriberProcessed($subscriber_id))->false(); + $this->queue->subscribers = array('processed' => array($subscriber_id)); + expect($this->queue->isSubscriberProcessed($subscriber_id))->true(); + } + + function testItChecksProcessedSubscribersForNewQueues() { + $subscriber_id = 123; + $queue = SendingTask::create(); + $queue->setSubscribers(array($subscriber_id)); + $queue->save(); + expect($queue->isSubscriberProcessed($subscriber_id))->false(); + $queue->updateProcessedSubscribers(array($subscriber_id)); + expect($queue->isSubscriberProcessed($subscriber_id))->true(); + } + function testItReadsSerializedRenderedNewsletterBody() { $queue = $this->queue; $data = array( @@ -99,6 +119,8 @@ class SendingQueueTest extends \MailPoetTest { function _after() { Mock::clean(); + \ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + \ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); } } \ No newline at end of file