From 5d5b61b76feef1e8f892ecff5a36824937a57af0 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 18 Dec 2017 19:44:09 -0500 Subject: [PATCH] Schedules welcome notification when adding/editing subscriber --- assets/js/src/subscribers/form.jsx | 1 + lib/API/JSON/v1/Subscribers.php | 13 ++-- tests/unit/API/JSON/v1/SubscribersTest.php | 83 +++++++++++++++++++++- views/subscribers/subscribers.html | 1 + 4 files changed, 91 insertions(+), 7 deletions(-) diff --git a/assets/js/src/subscribers/form.jsx b/assets/js/src/subscribers/form.jsx index e1707f8e6b..ab015ea35a 100644 --- a/assets/js/src/subscribers/form.jsx +++ b/assets/js/src/subscribers/form.jsx @@ -60,6 +60,7 @@ define( label: MailPoet.I18n.t('lists'), type: 'selection', placeholder: MailPoet.I18n.t('selectList'), + tip: MailPoet.I18n.t('welcomeEmailTip'), api_version: window.mailpoet_api_version, endpoint: 'segments', multiple: true, diff --git a/lib/API/JSON/v1/Subscribers.php b/lib/API/JSON/v1/Subscribers.php index 385f0a384a..e7448ac4fa 100644 --- a/lib/API/JSON/v1/Subscribers.php +++ b/lib/API/JSON/v1/Subscribers.php @@ -10,6 +10,7 @@ use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Models\Form; use MailPoet\Models\StatisticsForms; use MailPoet\Models\Subscriber; +use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Segments\SubscribersListings; use MailPoet\Subscription\Throttling as SubscriptionThrottling; use MailPoet\WP\Hooks; @@ -158,11 +159,15 @@ class Subscribers extends APIEndpoint { if(!empty($errors)) { return $this->badRequest($errors); - } else { - return $this->successResponse( - Subscriber::findOne($subscriber->id)->asArray() - ); } + + if(!empty($data['segments'])) { + Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $data['segments']); + } + + return $this->successResponse( + Subscriber::findOne($subscriber->id)->asArray() + ); } function restore($data = array()) { diff --git a/tests/unit/API/JSON/v1/SubscribersTest.php b/tests/unit/API/JSON/v1/SubscribersTest.php index 6cf8378191..d0cb6d72be 100644 --- a/tests/unit/API/JSON/v1/SubscribersTest.php +++ b/tests/unit/API/JSON/v1/SubscribersTest.php @@ -7,10 +7,15 @@ use MailPoet\API\JSON\v1\Subscribers; use MailPoet\API\JSON\Response as APIResponse; use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Models\Form; +use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; +use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberIP; use MailPoet\Models\Segment; use MailPoet\Models\Setting; +use MailPoet\Models\SubscriberSegment; class SubscribersTest extends \MailPoetTest { function _before() { @@ -137,6 +142,7 @@ class SubscribersTest extends \MailPoetTest { expect($response->data['first_name'])->equals('Super Jane'); } + function testItCanRemoveListsFromAnExistingSubscriber() { $router = new Subscribers(); $subscriber_data = $this->subscriber_2->asArray(); @@ -563,9 +569,80 @@ class SubscribersTest extends \MailPoetTest { } } + function testItSchedulesWelcomeEmailNotificationWhenSubscriberIsAdded() { + $this->_createWelcomeNewsletter(); + $subscriber_data = array( + 'email' => 'raul.doe@mailpoet.com', + 'first_name' => 'Raul', + 'last_name' => 'Doe', + 'segments' => array( + $this->segment_1->id + ) + ); + + $router = new Subscribers(); + $router->save($subscriber_data); + expect(SendingQueue::findMany())->count(1); + } + + function testItSchedulesWelcomeEmailNotificationWhenExistedSubscriberIsUpdated() { + $this->_createWelcomeNewsletter(); + $subscriber_data = array( + 'email' => 'raul.doe@mailpoet.com', + 'first_name' => 'Raul', + 'last_name' => 'Doe', + 'segments' => array( + $this->segment_2->id + ) + ); + + // welcome notification is created only for segment #1 + $router = new Subscribers(); + $router->save($subscriber_data); + expect(SendingQueue::findMany())->isEmpty(); + + $subscriber_data['segments'] = array($this->segment_1->id); + $router->save($subscriber_data); + expect(SendingQueue::findMany())->count(1); + } + + private function _createWelcomeNewsletter() { + $welcome_newsletter = Newsletter::create(); + $welcome_newsletter->type = Newsletter::TYPE_WELCOME; + $welcome_newsletter->status = Newsletter::STATUS_ACTIVE; + $welcome_newsletter->save(); + expect($welcome_newsletter->getErrors())->false(); + + $welcome_newsletter_options = array( + 'event' => 'segment', + 'segment' => $this->segment_1->id, + 'schedule' => '* * * * *' + ); + + foreach($welcome_newsletter_options as $option => $value) { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = $option; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_WELCOME; + $newsletter_option_field->save(); + expect($newsletter_option_field->getErrors())->false(); + + $newsletter_option = NewsletterOption::create(); + $newsletter_option->option_field_id = $newsletter_option_field->id; + $newsletter_option->newsletter_id = $welcome_newsletter->id; + $newsletter_option->value = $value; + $newsletter_option->save(); + expect($newsletter_option->getErrors())->false(); + } + } + function _after() { - Segment::deleteMany(); - Subscriber::deleteMany(); - SubscriberIP::deleteMany(); + \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + \ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + \ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + \ORM::raw_execute('TRUNCATE ' . Segment::$_table); + \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + \ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + \ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table); + \ORM::raw_execute('TRUNCATE ' . SubscriberIP::$_table); } } diff --git a/views/subscribers/subscribers.html b/views/subscribers/subscribers.html index 3e2d77cc05..74e9ae6aa7 100644 --- a/views/subscribers/subscribers.html +++ b/views/subscribers/subscribers.html @@ -60,6 +60,7 @@ 'unsubscribedOn': __('Unsubscribed on %$1s'), 'subscriberUpdated': __('Subscriber was updated successfully!'), 'subscriberAdded': __('Subscriber was added successfully!'), + 'welcomeEmailTip': __('This subscriber will receive Welcome Emails if any are active for your lists.'), 'subscriber': __('Subscriber'), 'status': __('Status'),