Use separate scheduler for welcome emails

[MAILPOET-2321]
This commit is contained in:
Pavel Dohnal
2019-08-28 14:06:49 +02:00
committed by M. Shull
parent 10e374ca60
commit c90a2e41a1
11 changed files with 437 additions and 337 deletions

View File

@@ -117,102 +117,6 @@ class SchedulerTest extends \MailPoetTest {
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() {
$newsletter = $this->_createNewsletter();
$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'));
}
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() {
$newsletter_option_field = NewsletterOptionField::create();
$newsletter_option_field->name = 'schedule';