diff --git a/lib/Cron/Workers/SendingQueue/SendingQueue.php b/lib/Cron/Workers/SendingQueue/SendingQueue.php index 00366b1226..d160234b39 100644 --- a/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -43,10 +43,19 @@ class SendingQueue { self::BATCH_SIZE ); foreach($subscriber_batches as $subscribers_to_process_ids) { - $found_subscribers = SubscriberModel::findSubscribersInSegments( - $subscribers_to_process_ids, $newsletter_segments_ids - )->findMany(); - $found_subscribers_ids = SubscriberModel::extractSubscribersIds($found_subscribers); + if (!empty($newsletter_segments_ids[0])) { + // Check that subscribers are in segments + $found_subscribers = SubscriberModel::findSubscribersInSegments( + $subscribers_to_process_ids, $newsletter_segments_ids + )->findMany(); + $found_subscribers_ids = SubscriberModel::extractSubscribersIds($found_subscribers); + } else { + // No segments = Welcome emails + $found_subscribers = SubscriberModel::whereIn('id', $subscribers_to_process_ids) + ->whereNull('deleted_at') + ->findMany(); + $found_subscribers_ids = SubscriberModel::extractSubscribersIds($found_subscribers); + } // if some subscribers weren't found, remove them from the processing list if(count($found_subscribers_ids) !== count($subscribers_to_process_ids)) { $subscibers_to_remove = array_diff( diff --git a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php index 54e6cc28b8..069fa796c3 100644 --- a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -282,6 +282,54 @@ class SendingQueueTest extends MailPoetTest { expect($statistics)->notEquals(false); } + function testItCanProcessWelcomeNewsletters() { + $this->newsletter->type = Newsletter::TYPE_WELCOME; + $this->newsletter_segment->delete(); + + $sending_queue_worker = new SendingQueueWorker( + $timer = false, + Stub::make( + new MailerTask(), + array( + 'send' => Stub::exactly(1, function($newsletter, $subscriber) { + // newsletter body should not be empty + expect(!empty($newsletter['body']['html']))->true(); + expect(!empty($newsletter['body']['text']))->true(); + return true; + }) + ) + ) + ); + $sending_queue_worker->process(); + + // newsletter status is set to sent + $updated_newsletter = Newsletter::findOne($this->newsletter->id); + expect($updated_newsletter->status)->equals(Newsletter::STATUS_SENT); + + // queue status is set to completed + $updated_queue = SendingQueue::findOne($this->queue->id); + expect($updated_queue->status)->equals(SendingQueue::STATUS_COMPLETED); + + // queue subscriber processed/to process count is updated + $updated_queue->subscribers = $updated_queue->getSubscribers(); + expect($updated_queue->subscribers)->equals( + array( + 'to_process' => array(), + 'processed' => array($this->subscriber->id) + ) + ); + expect($updated_queue->count_total)->equals(1); + expect($updated_queue->count_processed)->equals(1); + expect($updated_queue->count_to_process)->equals(0); + + // statistics entry should be created + $statistics = StatisticsNewsletters::where('newsletter_id', $this->newsletter->id) + ->where('subscriber_id', $this->subscriber->id) + ->where('queue_id', $this->queue->id) + ->findOne(); + expect($statistics)->notEquals(false); + } + function testItRemovesNonexistentSubscribersFromProcessingList() { $queue = $this->queue; $queue->subscribers = serialize(