diff --git a/lib/Cron/Workers/SendingQueue/SendingQueue.php b/lib/Cron/Workers/SendingQueue/SendingQueue.php index 825c40e61c..9075f42035 100644 --- a/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -168,6 +168,10 @@ class SendingQueue { $this->newsletterTask->markNewsletterAsSent($newsletter, $queue); continue; } + // if there aren't any subscribers to process in batch (e.g. all unsubscribed or were deleted) continue with next batch + if (count($foundSubscribersIds) === 0) { + continue; + } } $this->loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->addInfo( 'before queue chunk processing', diff --git a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 74a1365f3c..8e7e09094a 100644 --- a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -629,6 +629,41 @@ class SendingQueueTest extends \MailPoetTest { expect(count($statistics))->equals(1); } + public function testItDoesNotCallMailerWithEmptyBatch() { + $queue = $this->queue; + $subscribers = []; + while (count($subscribers) < 2 * SendingQueueWorker::BATCH_SIZE) { + $subscribers[] = 1234564545 + count($subscribers); + } + $subscribers[] = $this->subscriber->id(); + $queue->setSubscribers($subscribers); + $queue->countTotal = count($subscribers); + $queue->save(); + $sendingQueueWorker = $this->sendingQueueWorker; + $sendingQueueWorker->mailerTask = Stub::make( + new MailerTask(), + [ + 'send' => Expected::exactly(1, function() { + return $this->mailerTaskDummyResponse; + }), + ], + $this + ); + $sendingQueueWorker->process(); + + /** @var SendingQueue $updatedQueue */ + $updatedQueue = SendingQueue::findOne($queue->id); + $updatedQueue = SendingTask::createFromQueue($updatedQueue); + // queue subscriber processed/to process count is updated + expect($updatedQueue->getSubscribers(ScheduledTaskSubscriber::STATUS_UNPROCESSED)) + ->equals([]); + expect($updatedQueue->getSubscribers(ScheduledTaskSubscriber::STATUS_PROCESSED)) + ->equals([$this->subscriber->id]); + expect($updatedQueue->countTotal)->equals(1); + expect($updatedQueue->countProcessed)->equals(1); + expect($updatedQueue->countToProcess)->equals(0); + } + public function testItUpdatesQueueSubscriberCountWhenNoneOfSubscribersExist() { $queue = $this->queue; $queue->setSubscribers([