diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php index 0b56ac9b21..c235c83712 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -185,7 +185,7 @@ class SendingQueue { if (!empty($newsletterSegmentsIds[0])) { // Check that subscribers are in segments $foundSubscribersIds = $this->subscribersFinder->findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds); - $foundSubscribers = SubscriberModel::whereIn('id', $subscribersToProcessIds) + $foundSubscribers = empty($foundSubscribersIds) ? [] : SubscriberModel::whereIn('id', $foundSubscribersIds) ->whereNull('deleted_at') ->findMany(); } else { diff --git a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 28c6903306..57d8f2e348 100644 --- a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -59,6 +59,7 @@ class SendingQueueTest extends \MailPoetTest { public $sendingQueueWorker; public $cronHelper; public $newsletterLink; + /* @var SendingTask */ public $queue; public $newsletterSegment; public $newsletter; @@ -706,6 +707,44 @@ class SendingQueueTest extends \MailPoetTest { expect($updatedQueue->countToProcess)->equals(0); } + public function testItPreventsSendingNewsletterToRecipientWhoIsUnsubscribed() { + $subscriberFactory = new \MailPoet\Test\DataFactories\Subscriber(); + $unsubscribedSubscriber = $subscriberFactory + ->withStatus(SubscriberEntity::STATUS_UNSUBSCRIBED) + ->create(); + $this->queue->setSubscribers([ + $this->subscriber->getId(), // subscriber that should be processed + $unsubscribedSubscriber->getId(), // subscriber that should be skipped + ]); + $sendingQueueWorker = $this->getSendingQueueWorker( + null, + Stub::make( + new MailerTask(), + [ + 'send' => Expected::exactly(1, function() { + return $this->mailerTaskDummyResponse; + }), + ], + $this + ) + ); + $sendingQueueWorker->process(); + + // queue status is set to completed + /** @var SendingQueue $updatedQueue */ + $updatedQueue = SendingQueue::findOne($this->queue->id); + $updatedQueue = SendingTask::createFromQueue($updatedQueue); + + // Unprocessable subscribers were removed + expect($updatedQueue->getSubscribers(ScheduledTaskSubscriber::STATUS_PROCESSED)) + ->equals([ + $this->subscriber->getId(), // subscriber that should be processed + ]); + expect($updatedQueue->countTotal)->equals(1); + expect($updatedQueue->countProcessed)->equals(1); + expect($updatedQueue->countToProcess)->equals(0); + } + public function testItRemovesNonexistentSubscribersFromProcessingList() { $queue = $this->queue; $queue->setSubscribers([