diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 8fc7389094..bf4a765bce 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -31,13 +31,13 @@ class Scheduler { ->findOne($queue->newsletter_id); if(!$newsletter || $newsletter->deleted_at !== null) { $queue->delete(); - } elseif($newsletter->status !== 'active') { + } elseif($newsletter->status !== Newsletter::STATUS_ACTIVE && $newsletter->status !== Newsletter::STATUS_SCHEDULED) { continue; - } elseif($newsletter->type === 'welcome') { + } elseif($newsletter->type === Newsletter::TYPE_WELCOME) { $this->processWelcomeNewsletter($newsletter, $queue); - } elseif($newsletter->type === 'notification') { + } elseif($newsletter->type === Newsletter::TYPE_NOTIFICATION) { $this->processPostNotificationNewsletter($newsletter, $queue); - } elseif($newsletter->type === 'standard') { + } elseif($newsletter->type === Newsletter::TYPE_STANDARD) { $this->processScheduledStandardNewsletter($newsletter, $queue); } CronHelper::enforceExecutionLimit($this->timer); @@ -99,6 +99,8 @@ class Scheduler { $queue->count_total = $queue->count_to_process = count($subscribers); $queue->status = null; $queue->save(); + // update notification status + $notification_history->setStatus(Newsletter::STATUS_SENDING); return true; } @@ -118,6 +120,8 @@ class Scheduler { $queue->count_total = $queue->count_to_process = count($subscribers); $queue->status = null; $queue->save(); + // update newsletter status + $newsletter->setStatus(Newsletter::STATUS_SENDING); return true; } @@ -134,7 +138,7 @@ class Scheduler { return false; } // check if subscriber is confirmed (subscribed) - if($subscriber->status !== 'subscribed') { + if($subscriber->status !== Subscriber::STATUS_SUBSCRIBED) { // reschedule delivery in 5 minutes $scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); $queue->scheduled_at = $scheduled_at->addMinutes( @@ -187,7 +191,7 @@ class Scheduler { } static function getScheduledQueues() { - return SendingQueue::where('status', 'scheduled') + return SendingQueue::where('status', SendingQueue::STATUS_SCHEDULED) ->whereLte('scheduled_at', Carbon::createFromTimestamp(current_time('timestamp'))) ->whereNull('type') ->findMany(); diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index a6b284640e..09bedbb0fa 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -367,6 +367,9 @@ class SchedulerTest extends MailPoetTest { expect($updated_queue_subscribers['to_process'])->equals(array($subscriber->id)); // set queue's status to null expect($updated_queue->status)->null(); + // set newsletter's status to sending + $updated_newsletter = Newsletter::findOne($newsletter->id); + expect($updated_newsletter->status)->equals(Newsletter::STATUS_SENDING); } function testItFailsToProcessPostNotificationNewsletterWhenSegmentsDontExist() { @@ -422,6 +425,10 @@ class SchedulerTest extends MailPoetTest { $updated_queue_subscribers = $updated_queue->getSubscribers(); expect($updated_queue_subscribers['to_process'])->equals(array($subscriber->id)); expect($updated_queue->newsletter_id)->equals($notification_history->id); + // set notification history's status to sending + $updated_notification_history = Newsletter::where('parent_id', $newsletter->id) + ->findOne(); + expect($updated_notification_history->status)->equals(Newsletter::STATUS_SENDING); } function testItFailsToProcessWhenScheduledQueuesNotFound() { @@ -513,6 +520,35 @@ class SchedulerTest extends MailPoetTest { 'processScheduledStandardNewsletter' => Stub::never() ), $this); // scheduled job is not processed + $scheduler->timer = microtime(true); + $scheduler->process(); + } + + function testItProcessesScheduledJobsWhenNewsletterIsActive() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_STANDARD, Newsletter::STATUS_ACTIVE); + $queue = $this->_createQueue($newsletter->id); + $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $queue->save(); + + $scheduler = Stub::make(new Scheduler(), array( + 'processScheduledStandardNewsletter' => Stub::once() + ), $this); + // scheduled job is processed + $scheduler->timer = microtime(true); + $scheduler->process(); + } + + function testItProcessesScheduledJobsWhenNewsletterIsScheduled() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_STANDARD, Newsletter::STATUS_SCHEDULED); + $queue = $this->_createQueue($newsletter->id); + $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $queue->save(); + + $scheduler = Stub::make(new Scheduler(), array( + 'processScheduledStandardNewsletter' => Stub::once() + ), $this); + // scheduled job is processed + $scheduler->timer = microtime(true); $scheduler->process(); } @@ -535,7 +571,6 @@ class SchedulerTest extends MailPoetTest { return $subscriber_segment; } - function _createSegment() { $segment = Segment::create(); $segment->name = 'test';