diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index f50493e651..2a825b1ae7 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -73,6 +73,10 @@ class Scheduler { } static function createWelcomeNotificationQueue($newsletter, $subscriber_id) { + $previously_scheduled_notification = SendingQueue::where('newsletter_id', $newsletter->id) + ->whereLike('subscribers', '%' . serialize(array($subscriber_id)) . '%') + ->findOne(); + if(!empty($previously_scheduled_notification)) return; $queue = SendingQueue::create(); $queue->newsletter_id = $newsletter->id; $queue->subscribers = serialize( diff --git a/lib/Subscription/Pages.php b/lib/Subscription/Pages.php index f525bd44de..1b642ab6b9 100644 --- a/lib/Subscription/Pages.php +++ b/lib/Subscription/Pages.php @@ -57,7 +57,7 @@ class Pages { } function confirm() { - if($this->subscriber === false) { + if($this->subscriber === false || $this->subscriber->status === Subscriber::STATUS_SUBSCRIBED) { return false; } @@ -205,7 +205,6 @@ class Pages { } } - private function getConfirmContent() { if($this->isPreview() || $this->subscriber !== false) { return __("Yup, we've added you to our email list. You'll hear from us shortly.", 'mailpoet'); diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index acfbf2a30e..71ce9153d6 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -10,7 +10,7 @@ use MailPoet\Models\SendingQueue; use MailPoet\Newsletter\Scheduler\Scheduler; class NewsletterSchedulerTest extends MailPoetTest { - function testItSetsConstants() { + function testItSetsConstants() { expect(Scheduler::SECONDS_IN_HOUR)->notEmpty(); expect(Scheduler::LAST_WEEKDAY_FORMAT)->notEmpty(); expect(Scheduler::WORDPRESS_ALL_ROLES)->notEmpty(); @@ -63,6 +63,27 @@ class NewsletterSchedulerTest extends MailPoetTest { expect(SendingQueue::findMany())->count(1); } + function testItDoesNotCreateDuplicateWelcomeNotificationQueueRecords() { + $newsletter = (object)array( + 'id' => 1, + 'afterTimeNumber' => 2, + 'afterTimeType' => 'hours' + ); + $existing_subscriber = 678; + $existing_queue = SendingQueue::create(); + $existing_queue->newsletter_id = $newsletter->id; + $existing_queue->subscribers = array('to_process' => array($existing_subscriber)); + $existing_queue->save(); + + // queue is not scheduled + Scheduler::createWelcomeNotificationQueue($newsletter, $existing_subscriber); + expect(SendingQueue::findMany())->count(1); + + // queue is not scheduled + Scheduler::createWelcomeNotificationQueue($newsletter, 1); + expect(SendingQueue::findMany())->count(2); + } + function testItCreatesWelcomeNotificationQueueRecord() { $newsletter = (object)array( 'id' => 1, diff --git a/tests/unit/Subscription/PagesTest.php b/tests/unit/Subscription/PagesTest.php index 712835dac4..5422350591 100644 --- a/tests/unit/Subscription/PagesTest.php +++ b/tests/unit/Subscription/PagesTest.php @@ -27,6 +27,14 @@ class PagesTest extends MailPoetTest { expect($confirmed_subscriber->status)->equals(Subscriber::STATUS_SUBSCRIBED); } + function testItDoesNotConfirmSubscriptionOnDuplicateAttempt() { + $subscriber = $this->subscriber; + $subscriber->status = Subscriber::STATUS_SUBSCRIBED; + $subscriber->save(); + $subscription = new Pages($action = false, $this->data); + expect($subscription->confirm())->false(); + } + function testItSendsWelcomeNotificationUponConfirmingSubscription() { // create segment $segment = Segment::create();