Use separate scheduler for welcome emails
[MAILPOET-2321]
This commit is contained in:
@ -12,7 +12,7 @@ use MailPoet\Models\Form;
|
|||||||
use MailPoet\Models\StatisticsForms;
|
use MailPoet\Models\StatisticsForms;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Segments\BulkAction;
|
use MailPoet\Segments\BulkAction;
|
||||||
use MailPoet\Segments\SubscribersListings;
|
use MailPoet\Segments\SubscribersListings;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
@ -343,7 +343,8 @@ class Subscribers extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($new_segments)) {
|
if (!empty($new_segments)) {
|
||||||
Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $new_segments);
|
$scheduler = new WelcomeScheduler();
|
||||||
|
$scheduler->scheduleSubscriberWelcomeNotification($subscriber->id, $new_segments);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->successResponse(
|
return $this->successResponse(
|
||||||
|
@ -6,7 +6,7 @@ use MailPoet\Models\CustomField;
|
|||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Subscribers\RequiredCustomFieldValidator;
|
use MailPoet\Subscribers\RequiredCustomFieldValidator;
|
||||||
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
||||||
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
||||||
@ -30,16 +30,21 @@ class API {
|
|||||||
/** @var ApiDataSanitizer */
|
/** @var ApiDataSanitizer */
|
||||||
private $custom_fields_data_sanitizer;
|
private $custom_fields_data_sanitizer;
|
||||||
|
|
||||||
|
/** @var WelcomeScheduler */
|
||||||
|
private $welcome_scheduler;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
NewSubscriberNotificationMailer $new_subscriber_notification_mailer,
|
NewSubscriberNotificationMailer $new_subscriber_notification_mailer,
|
||||||
ConfirmationEmailMailer $confirmation_email_mailer,
|
ConfirmationEmailMailer $confirmation_email_mailer,
|
||||||
RequiredCustomFieldValidator $required_custom_field_validator,
|
RequiredCustomFieldValidator $required_custom_field_validator,
|
||||||
ApiDataSanitizer $custom_fields_data_sanitizer
|
ApiDataSanitizer $custom_fields_data_sanitizer,
|
||||||
|
WelcomeScheduler $welcome_scheduler
|
||||||
) {
|
) {
|
||||||
$this->new_subscriber_notification_mailer = $new_subscriber_notification_mailer;
|
$this->new_subscriber_notification_mailer = $new_subscriber_notification_mailer;
|
||||||
$this->confirmation_email_mailer = $confirmation_email_mailer;
|
$this->confirmation_email_mailer = $confirmation_email_mailer;
|
||||||
$this->required_custom_field_validator = $required_custom_field_validator;
|
$this->required_custom_field_validator = $required_custom_field_validator;
|
||||||
$this->custom_fields_data_sanitizer = $custom_fields_data_sanitizer;
|
$this->custom_fields_data_sanitizer = $custom_fields_data_sanitizer;
|
||||||
|
$this->welcome_scheduler = $welcome_scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSubscriberFields() {
|
function getSubscriberFields() {
|
||||||
@ -361,7 +366,7 @@ class API {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
|
protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
|
||||||
$result = Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $segments);
|
$result = $this->welcome_scheduler->scheduleSubscriberWelcomeNotification($subscriber->id, $segments);
|
||||||
if (is_array($result)) {
|
if (is_array($result)) {
|
||||||
foreach ($result as $queue) {
|
foreach ($result as $queue) {
|
||||||
if ($queue instanceof Sending && $queue->getErrors()) {
|
if ($queue instanceof Sending && $queue->getErrors()) {
|
||||||
|
@ -183,6 +183,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
// Newsletter
|
// Newsletter
|
||||||
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class);
|
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class);
|
||||||
|
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class);
|
||||||
// Util
|
// Util
|
||||||
$container->autowire(\MailPoet\Util\Cookies::class);
|
$container->autowire(\MailPoet\Util\Cookies::class);
|
||||||
$container->autowire(\MailPoet\Util\Url::class)->setPublic(true);
|
$container->autowire(\MailPoet\Util\Url::class)->setPublic(true);
|
||||||
|
@ -59,20 +59,6 @@ class Scheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function scheduleSubscriberWelcomeNotification($subscriber_id, $segments) {
|
|
||||||
$newsletters = self::getNewsletters(Newsletter::TYPE_WELCOME);
|
|
||||||
if (empty($newsletters)) return false;
|
|
||||||
$result = [];
|
|
||||||
foreach ($newsletters as $newsletter) {
|
|
||||||
if ($newsletter->event === 'segment' &&
|
|
||||||
in_array($newsletter->segment, $segments)
|
|
||||||
) {
|
|
||||||
$result[] = self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function scheduleAutomaticEmail($group, $event, $scheduling_condition = false, $subscriber_id = false, $meta = false) {
|
static function scheduleAutomaticEmail($group, $event, $scheduling_condition = false, $subscriber_id = false, $meta = false) {
|
||||||
$newsletters = self::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
|
$newsletters = self::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
|
||||||
if (empty($newsletters)) return false;
|
if (empty($newsletters)) return false;
|
||||||
@ -144,52 +130,6 @@ class Scheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function scheduleWPUserWelcomeNotification(
|
|
||||||
$subscriber_id,
|
|
||||||
$wp_user,
|
|
||||||
$old_user_data = false
|
|
||||||
) {
|
|
||||||
$newsletters = self::getNewsletters(Newsletter::TYPE_WELCOME);
|
|
||||||
if (empty($newsletters)) return false;
|
|
||||||
foreach ($newsletters as $newsletter) {
|
|
||||||
if ($newsletter->event === 'user') {
|
|
||||||
if (!empty($old_user_data['roles'])) {
|
|
||||||
// do not schedule welcome newsletter if roles have not changed
|
|
||||||
$old_role = $old_user_data['roles'];
|
|
||||||
$new_role = $wp_user['roles'];
|
|
||||||
if ($newsletter->role === self::WORDPRESS_ALL_ROLES ||
|
|
||||||
!array_diff($old_role, $new_role)
|
|
||||||
) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($newsletter->role === self::WORDPRESS_ALL_ROLES ||
|
|
||||||
in_array($newsletter->role, $wp_user['roles'])
|
|
||||||
) {
|
|
||||||
self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static function createWelcomeNotificationSendingTask($newsletter, $subscriber_id) {
|
|
||||||
$previously_scheduled_notification = SendingQueue::joinWithSubscribers()
|
|
||||||
->where('queues.newsletter_id', $newsletter->id)
|
|
||||||
->where('subscribers.subscriber_id', $subscriber_id)
|
|
||||||
->findOne();
|
|
||||||
if (!empty($previously_scheduled_notification)) return;
|
|
||||||
$sending_task = SendingTask::create();
|
|
||||||
$sending_task->newsletter_id = $newsletter->id;
|
|
||||||
$sending_task->setSubscribers([$subscriber_id]);
|
|
||||||
$sending_task->status = SendingQueue::STATUS_SCHEDULED;
|
|
||||||
$sending_task->priority = SendingQueue::PRIORITY_HIGH;
|
|
||||||
$sending_task->scheduled_at = self::getScheduledTimeWithDelay(
|
|
||||||
$newsletter->afterTimeType,
|
|
||||||
$newsletter->afterTimeNumber
|
|
||||||
);
|
|
||||||
return $sending_task->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta) {
|
static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta) {
|
||||||
$sending_task = SendingTask::create();
|
$sending_task = SendingTask::create();
|
||||||
$sending_task->newsletter_id = $newsletter->id;
|
$sending_task->newsletter_id = $newsletter->id;
|
||||||
|
71
lib/Newsletter/Scheduler/WelcomeScheduler.php
Normal file
71
lib/Newsletter/Scheduler/WelcomeScheduler.php
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter\Scheduler;
|
||||||
|
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Models\SendingQueue;
|
||||||
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
|
||||||
|
class WelcomeScheduler {
|
||||||
|
|
||||||
|
function scheduleSubscriberWelcomeNotification($subscriber_id, $segments) {
|
||||||
|
$newsletters = Scheduler::getNewsletters(Newsletter::TYPE_WELCOME);
|
||||||
|
if (empty($newsletters)) return false;
|
||||||
|
$result = [];
|
||||||
|
foreach ($newsletters as $newsletter) {
|
||||||
|
if ($newsletter->event === 'segment' &&
|
||||||
|
in_array($newsletter->segment, $segments)
|
||||||
|
) {
|
||||||
|
$result[] = $this->createWelcomeNotificationSendingTask($newsletter, $subscriber_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleWPUserWelcomeNotification(
|
||||||
|
$subscriber_id,
|
||||||
|
$wp_user,
|
||||||
|
$old_user_data = false
|
||||||
|
) {
|
||||||
|
$newsletters = Scheduler::getNewsletters(Newsletter::TYPE_WELCOME);
|
||||||
|
if (empty($newsletters)) return false;
|
||||||
|
foreach ($newsletters as $newsletter) {
|
||||||
|
if ($newsletter->event === 'user') {
|
||||||
|
if (!empty($old_user_data['roles'])) {
|
||||||
|
// do not schedule welcome newsletter if roles have not changed
|
||||||
|
$old_role = $old_user_data['roles'];
|
||||||
|
$new_role = $wp_user['roles'];
|
||||||
|
if ($newsletter->role === Scheduler::WORDPRESS_ALL_ROLES ||
|
||||||
|
!array_diff($old_role, $new_role)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($newsletter->role === Scheduler::WORDPRESS_ALL_ROLES ||
|
||||||
|
in_array($newsletter->role, $wp_user['roles'])
|
||||||
|
) {
|
||||||
|
$this->createWelcomeNotificationSendingTask($newsletter, $subscriber_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createWelcomeNotificationSendingTask($newsletter, $subscriber_id) {
|
||||||
|
$previously_scheduled_notification = SendingQueue::joinWithSubscribers()
|
||||||
|
->where('queues.newsletter_id', $newsletter->id)
|
||||||
|
->where('subscribers.subscriber_id', $subscriber_id)
|
||||||
|
->findOne();
|
||||||
|
if (!empty($previously_scheduled_notification)) return;
|
||||||
|
$sending_task = SendingTask::create();
|
||||||
|
$sending_task->newsletter_id = $newsletter->id;
|
||||||
|
$sending_task->setSubscribers([$subscriber_id]);
|
||||||
|
$sending_task->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
|
$sending_task->priority = SendingQueue::PRIORITY_HIGH;
|
||||||
|
$sending_task->scheduled_at = Scheduler::getScheduledTimeWithDelay(
|
||||||
|
$newsletter->afterTimeType,
|
||||||
|
$newsletter->afterTimeNumber
|
||||||
|
);
|
||||||
|
return $sending_task->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -7,7 +7,7 @@ use MailPoet\Models\StatisticsOpens;
|
|||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Subscribers\Source;
|
use MailPoet\Subscribers\Source;
|
||||||
|
|
||||||
@ -73,7 +73,8 @@ class WP {
|
|||||||
|
|
||||||
// welcome email
|
// welcome email
|
||||||
if ($schedule_welcome_newsletter === true) {
|
if ($schedule_welcome_newsletter === true) {
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
$scheduler = new WelcomeScheduler();
|
||||||
|
$scheduler->scheduleWPUserWelcomeNotification(
|
||||||
$subscriber->id,
|
$subscriber->id,
|
||||||
(array)$wp_user,
|
(array)$wp_user,
|
||||||
(array)$old_wp_user_data
|
(array)$old_wp_user_data
|
||||||
|
@ -7,6 +7,7 @@ use MailPoet\Models\Segment;
|
|||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
|
|
||||||
@ -24,17 +25,22 @@ class SubscriberActions {
|
|||||||
/** @var BulkActionFactory */
|
/** @var BulkActionFactory */
|
||||||
private $bulk_action_factory;
|
private $bulk_action_factory;
|
||||||
|
|
||||||
|
/** @var WelcomeScheduler */
|
||||||
|
private $welcome_scheduler;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
SettingsController $settings,
|
SettingsController $settings,
|
||||||
NewSubscriberNotificationMailer $new_subscriber_notification_mailer,
|
NewSubscriberNotificationMailer $new_subscriber_notification_mailer,
|
||||||
ConfirmationEmailMailer $confirmation_email_mailer,
|
ConfirmationEmailMailer $confirmation_email_mailer,
|
||||||
BulkActionFactory $bulk_action_factory
|
BulkActionFactory $bulk_action_factory,
|
||||||
|
WelcomeScheduler $welcome_scheduler
|
||||||
) {
|
) {
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->new_subscriber_notification_mailer = $new_subscriber_notification_mailer;
|
$this->new_subscriber_notification_mailer = $new_subscriber_notification_mailer;
|
||||||
$this->confirmation_email_mailer = $confirmation_email_mailer;
|
$this->confirmation_email_mailer = $confirmation_email_mailer;
|
||||||
$this->bulk_action_factory = $bulk_action_factory;
|
$this->bulk_action_factory = $bulk_action_factory;
|
||||||
$this->bulk_action_factory->registerAction('\MailPoet\Models\Subscriber', 'bulkSendConfirmationEmail', $this);
|
$this->bulk_action_factory->registerAction('\MailPoet\Models\Subscriber', 'bulkSendConfirmationEmail', $this);
|
||||||
|
$this->welcome_scheduler = $welcome_scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
function subscribe($subscriber_data = [], $segment_ids = []) {
|
function subscribe($subscriber_data = [], $segment_ids = []) {
|
||||||
@ -91,7 +97,7 @@ class SubscriberActions {
|
|||||||
if ($subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
|
if ($subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
|
||||||
$this->new_subscriber_notification_mailer->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany());
|
$this->new_subscriber_notification_mailer->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany());
|
||||||
|
|
||||||
Scheduler::scheduleSubscriberWelcomeNotification(
|
$this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
$subscriber->id,
|
$subscriber->id,
|
||||||
$segment_ids
|
$segment_ids
|
||||||
);
|
);
|
||||||
|
@ -2,12 +2,11 @@
|
|||||||
|
|
||||||
namespace MailPoet\Subscription;
|
namespace MailPoet\Subscription;
|
||||||
|
|
||||||
use MailPoet\Models\Form as FormModel;
|
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Models\CustomField;
|
use MailPoet\Models\CustomField;
|
||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
@ -42,18 +41,23 @@ class Pages {
|
|||||||
/** @var CaptchaRenderer */
|
/** @var CaptchaRenderer */
|
||||||
private $captcha_renderer;
|
private $captcha_renderer;
|
||||||
|
|
||||||
|
/** @var WelcomeScheduler */
|
||||||
|
private $welcome_scheduler;
|
||||||
|
|
||||||
function __construct(
|
function __construct(
|
||||||
NewSubscriberNotificationMailer $new_subscriber_notification_sender,
|
NewSubscriberNotificationMailer $new_subscriber_notification_sender,
|
||||||
WPFunctions $wp,
|
WPFunctions $wp,
|
||||||
SettingsController $settings,
|
SettingsController $settings,
|
||||||
UrlHelper $url_helper,
|
UrlHelper $url_helper,
|
||||||
CaptchaRenderer $captcha_renderer
|
CaptchaRenderer $captcha_renderer,
|
||||||
|
WelcomeScheduler $welcome_scheduler
|
||||||
) {
|
) {
|
||||||
$this->wp = $wp;
|
$this->wp = $wp;
|
||||||
$this->new_subscriber_notification_sender = $new_subscriber_notification_sender;
|
$this->new_subscriber_notification_sender = $new_subscriber_notification_sender;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->url_helper = $url_helper;
|
$this->url_helper = $url_helper;
|
||||||
$this->captcha_renderer = $captcha_renderer;
|
$this->captcha_renderer = $captcha_renderer;
|
||||||
|
$this->welcome_scheduler = $welcome_scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
function init($action = false, $data = [], $init_shortcodes = false, $init_page_filters = false) {
|
function init($action = false, $data = [], $init_shortcodes = false, $init_page_filters = false) {
|
||||||
@ -122,7 +126,7 @@ class Pages {
|
|||||||
// send welcome notification
|
// send welcome notification
|
||||||
$subscriber_segments = $this->subscriber->segments()->findMany();
|
$subscriber_segments = $this->subscriber->segments()->findMany();
|
||||||
if ($subscriber_segments) {
|
if ($subscriber_segments) {
|
||||||
Scheduler::scheduleSubscriberWelcomeNotification(
|
$this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
$this->subscriber->id,
|
$this->subscriber->id,
|
||||||
array_map(function ($segment) {
|
array_map(function ($segment) {
|
||||||
return $segment->get('id');
|
return $segment->get('id');
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace MailPoet\Test\API\MP;
|
namespace MailPoet\Test\API\MP;
|
||||||
|
|
||||||
use AspectMock\Test as Mock;
|
|
||||||
use Codeception\Util\Fixtures;
|
use Codeception\Util\Fixtures;
|
||||||
use Codeception\Stub;
|
use Codeception\Stub;
|
||||||
use Codeception\Stub\Expected;
|
use Codeception\Stub\Expected;
|
||||||
@ -12,6 +11,7 @@ use MailPoet\Models\ScheduledTask;
|
|||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
||||||
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
||||||
@ -26,7 +26,8 @@ class APITest extends \MailPoetTest {
|
|||||||
Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
|
Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
|
||||||
Stub::makeEmpty(ConfirmationEmailMailer::class, ['sendConfirmationEmail']),
|
Stub::makeEmpty(ConfirmationEmailMailer::class, ['sendConfirmationEmail']),
|
||||||
Stub::makeEmptyExcept(RequiredCustomFieldValidator::class, 'validate'),
|
Stub::makeEmptyExcept(RequiredCustomFieldValidator::class, 'validate'),
|
||||||
Stub::makeEmpty(ApiDataSanitizer::class)
|
Stub::makeEmpty(ApiDataSanitizer::class),
|
||||||
|
Stub::makeEmpty(WelcomeScheduler::class)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +281,8 @@ class APITest extends \MailPoetTest {
|
|||||||
$notificationMailer,
|
$notificationMailer,
|
||||||
$this->makeEmpty(ConfirmationEmailMailer::class),
|
$this->makeEmpty(ConfirmationEmailMailer::class),
|
||||||
$this->makeEmpty(RequiredCustomFieldValidator::class),
|
$this->makeEmpty(RequiredCustomFieldValidator::class),
|
||||||
$this->makeEmpty(ApiDataSanitizer::class)
|
$this->makeEmpty(ApiDataSanitizer::class),
|
||||||
|
Stub::makeEmpty(WelcomeScheduler::class)
|
||||||
);
|
);
|
||||||
$API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => true]);
|
$API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => true]);
|
||||||
|
|
||||||
@ -291,7 +293,8 @@ class APITest extends \MailPoetTest {
|
|||||||
$notificationMailer,
|
$notificationMailer,
|
||||||
$this->makeEmpty(ConfirmationEmailMailer::class),
|
$this->makeEmpty(ConfirmationEmailMailer::class),
|
||||||
$this->makeEmpty(RequiredCustomFieldValidator::class),
|
$this->makeEmpty(RequiredCustomFieldValidator::class),
|
||||||
$this->makeEmpty(ApiDataSanitizer::class)
|
$this->makeEmpty(ApiDataSanitizer::class),
|
||||||
|
Stub::makeEmpty(WelcomeScheduler::class)
|
||||||
);
|
);
|
||||||
$API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => false]);
|
$API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => false]);
|
||||||
}
|
}
|
||||||
@ -532,7 +535,7 @@ class APITest extends \MailPoetTest {
|
|||||||
$task->type = 'sending';
|
$task->type = 'sending';
|
||||||
$task->setError("Big Error");
|
$task->setError("Big Error");
|
||||||
$sendingStub = Sending::create($task, SendingQueue::create());
|
$sendingStub = Sending::create($task, SendingQueue::create());
|
||||||
Mock::double('MailPoet\Newsletter\Scheduler\Scheduler', [
|
$welcome_scheduler = $this->make('MailPoet\Newsletter\Scheduler\WelcomeScheduler', [
|
||||||
'scheduleSubscriberWelcomeNotification' => [$sendingStub],
|
'scheduleSubscriberWelcomeNotification' => [$sendingStub],
|
||||||
]);
|
]);
|
||||||
$segment = Segment::createOrUpdate(
|
$segment = Segment::createOrUpdate(
|
||||||
@ -541,7 +544,13 @@ class APITest extends \MailPoetTest {
|
|||||||
'type' => Segment::TYPE_DEFAULT,
|
'type' => Segment::TYPE_DEFAULT,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
$API = $this->getApi();
|
$API = new \MailPoet\API\MP\v1\API(
|
||||||
|
Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
|
||||||
|
Stub::makeEmpty(ConfirmationEmailMailer::class, ['sendConfirmationEmail']),
|
||||||
|
Stub::makeEmptyExcept(RequiredCustomFieldValidator::class, 'validate'),
|
||||||
|
Stub::makeEmpty(ApiDataSanitizer::class),
|
||||||
|
$welcome_scheduler
|
||||||
|
);
|
||||||
$subscriber = [
|
$subscriber = [
|
||||||
'email' => 'test@example.com',
|
'email' => 'test@example.com',
|
||||||
];
|
];
|
||||||
@ -857,7 +866,6 @@ class APITest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _after() {
|
function _after() {
|
||||||
Mock::clean();
|
|
||||||
\ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
\ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||||
\ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
|
\ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
|
||||||
\ORM::raw_execute('TRUNCATE ' . Segment::$_table);
|
\ORM::raw_execute('TRUNCATE ' . Segment::$_table);
|
||||||
|
@ -117,102 +117,6 @@ class SchedulerTest extends \MailPoetTest {
|
|||||||
expect(SendingQueue::findMany())->count(2);
|
expect(SendingQueue::findMany())->count(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItDoesNotCreateDuplicateWelcomeNotificationSendingTasks() {
|
|
||||||
$newsletter = (object)[
|
|
||||||
'id' => 1,
|
|
||||||
'afterTimeNumber' => 2,
|
|
||||||
'afterTimeType' => 'hours',
|
|
||||||
];
|
|
||||||
$existing_subscriber = 678;
|
|
||||||
$existing_queue = SendingTask::create();
|
|
||||||
$existing_queue->newsletter_id = $newsletter->id;
|
|
||||||
$existing_queue->setSubscribers([$existing_subscriber]);
|
|
||||||
$existing_queue->save();
|
|
||||||
|
|
||||||
// queue is not scheduled
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, $existing_subscriber);
|
|
||||||
expect(SendingQueue::findMany())->count(1);
|
|
||||||
|
|
||||||
// queue is not scheduled
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, 1);
|
|
||||||
expect(SendingQueue::findMany())->count(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInHours() {
|
|
||||||
$newsletter = (object)[
|
|
||||||
'id' => 1,
|
|
||||||
'afterTimeNumber' => 2,
|
|
||||||
];
|
|
||||||
|
|
||||||
// queue is scheduled delivery in 2 hours
|
|
||||||
$newsletter->afterTimeType = 'hours';
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId(1)
|
|
||||||
->findOne();
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
expect($queue->id)->greaterOrEquals(1);
|
|
||||||
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addHours(2)->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInDays() {
|
|
||||||
$newsletter = (object)[
|
|
||||||
'id' => 1,
|
|
||||||
'afterTimeNumber' => 2,
|
|
||||||
];
|
|
||||||
|
|
||||||
// queue is scheduled for delivery in 2 days
|
|
||||||
$newsletter->afterTimeType = 'days';
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId(1)
|
|
||||||
->findOne();
|
|
||||||
expect($queue->id)->greaterOrEquals(1);
|
|
||||||
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addDays(2)->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInWeeks() {
|
|
||||||
$newsletter = (object)[
|
|
||||||
'id' => 1,
|
|
||||||
'afterTimeNumber' => 2,
|
|
||||||
];
|
|
||||||
|
|
||||||
// queue is scheduled for delivery in 2 weeks
|
|
||||||
$newsletter->afterTimeType = 'weeks';
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId(1)
|
|
||||||
->findOne();
|
|
||||||
expect($queue->id)->greaterOrEquals(1);
|
|
||||||
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addWeeks(2)->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendImmediately() {
|
|
||||||
$newsletter = (object)[
|
|
||||||
'id' => 1,
|
|
||||||
'afterTimeNumber' => 2,
|
|
||||||
];
|
|
||||||
|
|
||||||
// queue is scheduled for immediate delivery
|
|
||||||
$newsletter->afterTimeType = null;
|
|
||||||
Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId(1)->findOne();
|
|
||||||
expect($queue->id)->greaterOrEquals(1);
|
|
||||||
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function tesIttDoesNotSchedulePostNotificationWhenNotificationWasAlreadySentForPost() {
|
function tesIttDoesNotSchedulePostNotificationWhenNotificationWasAlreadySentForPost() {
|
||||||
$newsletter = $this->_createNewsletter();
|
$newsletter = $this->_createNewsletter();
|
||||||
$newsletter_post = NewsletterPost::create();
|
$newsletter_post = NewsletterPost::create();
|
||||||
@ -249,167 +153,6 @@ class SchedulerTest extends \MailPoetTest {
|
|||||||
expect($queue->scheduled_at)->startsWith($next_run_date->format('Y-m-d 05:00'));
|
expect($queue->scheduled_at)->startsWith($next_run_date->format('Y-m-d 05:00'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItDoesNotSchedulesSubscriberWelcomeNotificationWhenSubscriberIsNotInSegment() {
|
|
||||||
// do not schedule when subscriber is not in segment
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
Scheduler::scheduleSubscriberWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$segments = []
|
|
||||||
);
|
|
||||||
|
|
||||||
// queue is not created
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect($queue)->false();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItSchedulesSubscriberWelcomeNotification() {
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
$this->_createNewsletterOptions(
|
|
||||||
$newsletter->id,
|
|
||||||
Newsletter::TYPE_WELCOME,
|
|
||||||
[
|
|
||||||
'event' => 'segment',
|
|
||||||
'segment' => 2,
|
|
||||||
'afterTimeType' => 'days',
|
|
||||||
'afterTimeNumber' => 1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
// queue is created and scheduled for delivery one day later
|
|
||||||
$result = Scheduler::scheduleSubscriberWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$segments = [
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
|
||||||
expect($result[0]->id())->equals($queue->id());
|
|
||||||
}
|
|
||||||
|
|
||||||
function itDoesNotScheduleAnythingWhenNewsletterDoesNotExist() {
|
|
||||||
// post notification is not scheduled
|
|
||||||
expect(Scheduler::schedulePostNotification($post_id = 10))->false();
|
|
||||||
|
|
||||||
// subscriber welcome notification is not scheduled
|
|
||||||
$result = Scheduler::scheduleSubscriberWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$segments = []
|
|
||||||
);
|
|
||||||
expect($result)->false();
|
|
||||||
|
|
||||||
// WP user welcome notification is not scheduled
|
|
||||||
$result = Scheduler::scheduleSubscriberWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$segments = []
|
|
||||||
);
|
|
||||||
expect($result)->false();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItDoesNotScheduleWPUserWelcomeNotificationWhenRoleHasNotChanged() {
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
$this->_createNewsletterOptions(
|
|
||||||
$newsletter->id,
|
|
||||||
Newsletter::TYPE_WELCOME,
|
|
||||||
[
|
|
||||||
'event' => 'user',
|
|
||||||
'role' => 'editor',
|
|
||||||
'afterTimeType' => 'days',
|
|
||||||
'afterTimeNumber' => 1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$wp_user = ['roles' => ['editor']],
|
|
||||||
$old_user_data = ['roles' => ['editor']]
|
|
||||||
);
|
|
||||||
|
|
||||||
// queue is not created
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect($queue)->false();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItDoesNotScheduleWPUserWelcomeNotificationWhenUserRoleDoesNotMatch() {
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
$this->_createNewsletterOptions(
|
|
||||||
$newsletter->id,
|
|
||||||
Newsletter::TYPE_WELCOME,
|
|
||||||
[
|
|
||||||
'event' => 'user',
|
|
||||||
'role' => 'editor',
|
|
||||||
'afterTimeType' => 'days',
|
|
||||||
'afterTimeNumber' => 1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$wp_user = ['roles' => ['administrator']]
|
|
||||||
);
|
|
||||||
|
|
||||||
// queue is not created
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect($queue)->false();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItSchedulesWPUserWelcomeNotificationWhenUserRolesMatches() {
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
$this->_createNewsletterOptions(
|
|
||||||
$newsletter->id,
|
|
||||||
Newsletter::TYPE_WELCOME,
|
|
||||||
[
|
|
||||||
'event' => 'user',
|
|
||||||
'role' => 'administrator',
|
|
||||||
'afterTimeType' => 'days',
|
|
||||||
'afterTimeNumber' => 1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$wp_user = ['roles' => ['administrator']]
|
|
||||||
);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
// queue is created and scheduled for delivery one day later
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItSchedulesWPUserWelcomeNotificationWhenUserHasAnyRole() {
|
|
||||||
$newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME);
|
|
||||||
$this->_createNewsletterOptions(
|
|
||||||
$newsletter->id,
|
|
||||||
Newsletter::TYPE_WELCOME,
|
|
||||||
[
|
|
||||||
'event' => 'user',
|
|
||||||
'role' => Scheduler::WORDPRESS_ALL_ROLES,
|
|
||||||
'afterTimeType' => 'days',
|
|
||||||
'afterTimeNumber' => 1,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
|
||||||
$subscriber_id = 10,
|
|
||||||
$wp_user = ['roles' => ['administrator']]
|
|
||||||
);
|
|
||||||
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
|
||||||
Carbon::setTestNow($current_time); // mock carbon to return current time
|
|
||||||
// queue is created and scheduled for delivery one day later
|
|
||||||
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
|
||||||
->findOne();
|
|
||||||
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
|
||||||
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItProcessesPostNotificationScheduledForDailyDelivery() {
|
function testItProcessesPostNotificationScheduledForDailyDelivery() {
|
||||||
$newsletter_option_field = NewsletterOptionField::create();
|
$newsletter_option_field = NewsletterOptionField::create();
|
||||||
$newsletter_option_field->name = 'schedule';
|
$newsletter_option_field->name = 'schedule';
|
||||||
|
320
tests/integration/Newsletter/Scheduler/WelcomeTest.php
Normal file
320
tests/integration/Newsletter/Scheduler/WelcomeTest.php
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter\Scheduler;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Models\NewsletterOption;
|
||||||
|
use MailPoet\Models\NewsletterOptionField;
|
||||||
|
use MailPoet\Models\NewsletterPost;
|
||||||
|
use MailPoet\Models\ScheduledTask;
|
||||||
|
use MailPoet\Models\ScheduledTaskSubscriber;
|
||||||
|
use MailPoet\Models\SendingQueue;
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
|
||||||
|
class WelcomeTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var WelcomeScheduler */
|
||||||
|
private $welcome_scheduler;
|
||||||
|
|
||||||
|
function _before() {
|
||||||
|
parent::_before();
|
||||||
|
$this->welcome_scheduler = new WelcomeScheduler;
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDoesNotCreateDuplicateWelcomeNotificationSendingTasks() {
|
||||||
|
$newsletter = (object)[
|
||||||
|
'id' => 1,
|
||||||
|
'afterTimeNumber' => 2,
|
||||||
|
'afterTimeType' => 'hours',
|
||||||
|
];
|
||||||
|
$existing_subscriber = 678;
|
||||||
|
$existing_queue = SendingTask::create();
|
||||||
|
$existing_queue->newsletter_id = $newsletter->id;
|
||||||
|
$existing_queue->setSubscribers([$existing_subscriber]);
|
||||||
|
$existing_queue->save();
|
||||||
|
|
||||||
|
// queue is not scheduled
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, $existing_subscriber);
|
||||||
|
expect(SendingQueue::findMany())->count(1);
|
||||||
|
|
||||||
|
// queue is not scheduled
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, 1);
|
||||||
|
expect(SendingQueue::findMany())->count(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInHours() {
|
||||||
|
$newsletter = (object)[
|
||||||
|
'id' => 1,
|
||||||
|
'afterTimeNumber' => 2,
|
||||||
|
];
|
||||||
|
|
||||||
|
// queue is scheduled delivery in 2 hours
|
||||||
|
$newsletter->afterTimeType = 'hours';
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId(1)
|
||||||
|
->findOne();
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
expect($queue->id)->greaterOrEquals(1);
|
||||||
|
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addHours(2)->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInDays() {
|
||||||
|
$newsletter = (object)[
|
||||||
|
'id' => 1,
|
||||||
|
'afterTimeNumber' => 2,
|
||||||
|
];
|
||||||
|
|
||||||
|
// queue is scheduled for delivery in 2 days
|
||||||
|
$newsletter->afterTimeType = 'days';
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId(1)
|
||||||
|
->findOne();
|
||||||
|
expect($queue->id)->greaterOrEquals(1);
|
||||||
|
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addDays(2)->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInWeeks() {
|
||||||
|
$newsletter = (object)[
|
||||||
|
'id' => 1,
|
||||||
|
'afterTimeNumber' => 2,
|
||||||
|
];
|
||||||
|
|
||||||
|
// queue is scheduled for delivery in 2 weeks
|
||||||
|
$newsletter->afterTimeType = 'weeks';
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId(1)
|
||||||
|
->findOne();
|
||||||
|
expect($queue->id)->greaterOrEquals(1);
|
||||||
|
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addWeeks(2)->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCreatesWelcomeNotificationSendingTaskScheduledToSendImmediately() {
|
||||||
|
$newsletter = (object)[
|
||||||
|
'id' => 1,
|
||||||
|
'afterTimeNumber' => 2,
|
||||||
|
];
|
||||||
|
|
||||||
|
// queue is scheduled for immediate delivery
|
||||||
|
$newsletter->afterTimeType = null;
|
||||||
|
$this->welcome_scheduler->createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId(1)->findOne();
|
||||||
|
expect($queue->id)->greaterOrEquals(1);
|
||||||
|
expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH);
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDoesNotSchedulesSubscriberWelcomeNotificationWhenSubscriberIsNotInSegment() {
|
||||||
|
// do not schedule when subscriber is not in segment
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$segments = []
|
||||||
|
);
|
||||||
|
|
||||||
|
// queue is not created
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect($queue)->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSchedulesSubscriberWelcomeNotification() {
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->_createNewsletterOptions(
|
||||||
|
$newsletter->id,
|
||||||
|
[
|
||||||
|
'event' => 'segment',
|
||||||
|
'segment' => 2,
|
||||||
|
'afterTimeType' => 'days',
|
||||||
|
'afterTimeNumber' => 1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// queue is created and scheduled for delivery one day later
|
||||||
|
$result = $this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$segments = [
|
||||||
|
3,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
||||||
|
expect($result[0]->id())->equals($queue->id());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function itDoesNotScheduleAnythingWhenNewsletterDoesNotExist() {
|
||||||
|
|
||||||
|
// subscriber welcome notification is not scheduled
|
||||||
|
$result = $this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$segments = []
|
||||||
|
);
|
||||||
|
expect($result)->false();
|
||||||
|
|
||||||
|
// WP user welcome notification is not scheduled
|
||||||
|
$result = $this->welcome_scheduler->scheduleSubscriberWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$segments = []
|
||||||
|
);
|
||||||
|
expect($result)->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDoesNotScheduleWPUserWelcomeNotificationWhenRoleHasNotChanged() {
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->_createNewsletterOptions(
|
||||||
|
$newsletter->id,
|
||||||
|
[
|
||||||
|
'event' => 'user',
|
||||||
|
'role' => 'editor',
|
||||||
|
'afterTimeType' => 'days',
|
||||||
|
'afterTimeNumber' => 1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->welcome_scheduler->scheduleWPUserWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$wp_user = ['roles' => ['editor']],
|
||||||
|
$old_user_data = ['roles' => ['editor']]
|
||||||
|
);
|
||||||
|
|
||||||
|
// queue is not created
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect($queue)->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDoesNotScheduleWPUserWelcomeNotificationWhenUserRoleDoesNotMatch() {
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->_createNewsletterOptions(
|
||||||
|
$newsletter->id,
|
||||||
|
[
|
||||||
|
'event' => 'user',
|
||||||
|
'role' => 'editor',
|
||||||
|
'afterTimeType' => 'days',
|
||||||
|
'afterTimeNumber' => 1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->welcome_scheduler->scheduleWPUserWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$wp_user = ['roles' => ['administrator']]
|
||||||
|
);
|
||||||
|
|
||||||
|
// queue is not created
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect($queue)->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSchedulesWPUserWelcomeNotificationWhenUserRolesMatches() {
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->_createNewsletterOptions(
|
||||||
|
$newsletter->id,
|
||||||
|
[
|
||||||
|
'event' => 'user',
|
||||||
|
'role' => 'administrator',
|
||||||
|
'afterTimeType' => 'days',
|
||||||
|
'afterTimeNumber' => 1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->welcome_scheduler->scheduleWPUserWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$wp_user = ['roles' => ['administrator']]
|
||||||
|
);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
// queue is created and scheduled for delivery one day later
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSchedulesWPUserWelcomeNotificationWhenUserHasAnyRole() {
|
||||||
|
$newsletter = $this->_createNewsletter();
|
||||||
|
$this->_createNewsletterOptions(
|
||||||
|
$newsletter->id,
|
||||||
|
[
|
||||||
|
'event' => 'user',
|
||||||
|
'role' => Scheduler::WORDPRESS_ALL_ROLES,
|
||||||
|
'afterTimeType' => 'days',
|
||||||
|
'afterTimeNumber' => 1,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->welcome_scheduler->scheduleWPUserWelcomeNotification(
|
||||||
|
$subscriber_id = 10,
|
||||||
|
$wp_user = ['roles' => ['administrator']]
|
||||||
|
);
|
||||||
|
$current_time = Carbon::createFromTimestamp(current_time('timestamp'));
|
||||||
|
Carbon::setTestNow($current_time); // mock carbon to return current time
|
||||||
|
// queue is created and scheduled for delivery one day later
|
||||||
|
$queue = SendingQueue::findTaskByNewsletterId($newsletter->id)
|
||||||
|
->findOne();
|
||||||
|
expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i'))
|
||||||
|
->equals($current_time->addDay()->format('Y-m-d H:i'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function _createNewsletter(
|
||||||
|
$status = Newsletter::STATUS_ACTIVE
|
||||||
|
) {
|
||||||
|
$newsletter = Newsletter::create();
|
||||||
|
$newsletter->type = Newsletter::TYPE_WELCOME;
|
||||||
|
$newsletter->status = $status;
|
||||||
|
$newsletter->save();
|
||||||
|
expect($newsletter->getErrors())->false();
|
||||||
|
return $newsletter;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _createNewsletterOptions($newsletter_id, $options) {
|
||||||
|
foreach ($options as $option => $value) {
|
||||||
|
$newsletter_option_field = NewsletterOptionField::where('name', $option)->findOne();
|
||||||
|
if (!$newsletter_option_field) {
|
||||||
|
$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 = $newsletter_id;
|
||||||
|
$newsletter_option->value = $value;
|
||||||
|
$newsletter_option->save();
|
||||||
|
expect($newsletter_option->getErrors())->false();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _after() {
|
||||||
|
Carbon::setTestNow();
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . NewsletterPost::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user