Make sure only subscribed users recieve welcome emails

[MAILPOET-2331]
This commit is contained in:
Pavel Dohnal
2019-09-18 15:20:02 +02:00
committed by Jack Kitterhing
parent 03cb02caac
commit 11b2516d99
4 changed files with 70 additions and 8 deletions

View File

@ -171,13 +171,7 @@ class Scheduler {
$queue->delete();
return false;
}
// check if subscriber is confirmed (subscribed)
if ($subscriber->status !== Subscriber::STATUS_SUBSCRIBED) {
// reschedule delivery
$queue->rescheduleProgressively();
return false;
}
return true;
return $this->verifySubscriber($subscriber, $queue);
}
function verifyWPSubscriber($subscriber_id, $newsletter, $queue) {
@ -194,6 +188,18 @@ class Scheduler {
$queue->delete();
return false;
}
return $this->verifySubscriber($subscriber, $queue);
}
function verifySubscriber($subscriber, $queue) {
if ($subscriber->status === Subscriber::STATUS_UNCONFIRMED) {
// reschedule delivery
$queue->rescheduleProgressively();
return false;
} else if ($subscriber->status === Subscriber::STATUS_UNSUBSCRIBED) {
$queue->delete();
return false;
}
return true;
}

View File

@ -88,6 +88,7 @@ class SendingQueue {
} else {
// No segments = Welcome emails
$found_subscribers = SubscriberModel::whereIn('id', $subscribers_to_process_ids)
->where('status', SubscriberModel::STATUS_SUBSCRIBED)
->whereNull('deleted_at')
->findMany();
$found_subscribers_ids = SubscriberModel::extractSubscribersIds($found_subscribers);

View File

@ -305,7 +305,7 @@ class SchedulerTest extends \MailPoetTest {
function testItReschedulesQueueDeliveryWhenMailpoetSubscriberHasNotConfirmedSubscription() {
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
Carbon::setTestNow($current_time); // mock carbon to return current time
$subscriber = $this->_createSubscriber($wp_user_id = null, 'unsubscribed');
$subscriber = $this->_createSubscriber($wp_user_id = null, 'unconfirmed');
$segment = $this->_createSegment();
$subscriber_segment = $this->_createSubscriberSegment($subscriber->id, $segment->id);
$newsletter = $this->_createNewsletter();
@ -331,6 +331,31 @@ class SchedulerTest extends \MailPoetTest {
);
}
function testItDoesntRunQueueDeliveryWhenMailpoetSubscriberHasUnsubscribed() {
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
Carbon::setTestNow($current_time); // mock carbon to return current time
$subscriber = $this->_createSubscriber($wp_user_id = null, 'unsubscribed');
$segment = $this->_createSegment();
$subscriber_segment = $this->_createSubscriberSegment($subscriber->id, $segment->id);
$newsletter = $this->_createNewsletter();
$newsletter_option_field =
$this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION);
$newsletter_option = $this->_createNewsletterOption(
$newsletter_option_field->id, $newsletter->id,
$segment->id
);
$newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION)
->findOne($newsletter->id);
$queue = $this->_createQueue($newsletter->id);
$scheduler = new Scheduler($this->makeEmpty(SubscribersFinder::class));
// return false
$result = $scheduler->verifyMailpoetSubscriber($subscriber->id, $newsletter, $queue);
expect($result)->false();
// update the time queue is scheduled to run at
expect(SendingQueue::findOne($queue->id))->false();
}
function testItCanVerifyMailpoetSubscriber() {
$subscriber = $this->_createSubscriber();
$segment = $this->_createSegment();

View File

@ -488,6 +488,36 @@ class SendingQueueTest extends \MailPoetTest {
expect($statistics)->notEquals(false);
}
function testItPreventsSendingWelcomeEmailWhenSubscriberIsUnsubscribed() {
$this->newsletter->type = Newsletter::TYPE_WELCOME;
$this->subscriber->status = Subscriber::STATUS_UNSUBSCRIBED;
$this->subscriber->save();
$this->newsletter_segment->delete();
$sending_queue_worker = new SendingQueueWorker(
$this->sending_error_handler,
$this->stats_notifications_worker,
$timer = false,
Stub::make(
new MailerTask(),
[
'send' => Expected::exactly(0),
],
$this
)
);
$sending_queue_worker->process();
// queue status is set to completed
$updated_queue = SendingTask::createFromQueue(SendingQueue::findOne($this->queue->id));
expect($updated_queue->getSubscribers(ScheduledTaskSubscriber::STATUS_PROCESSED))
->equals([]);
expect($updated_queue->count_total)->equals(0);
expect($updated_queue->count_processed)->equals(0);
expect($updated_queue->count_to_process)->equals(0);
}
function testItRemovesNonexistentSubscribersFromProcessingList() {
$queue = $this->queue;
$queue->setSubscribers([