Fix flaky schedule automatic email test
[MAILPOET-3793]
This commit is contained in:
@@ -7,8 +7,18 @@ use MailPoet\Models\ScheduledTask;
|
|||||||
use MailPoet\Models\ScheduledTaskSubscriber;
|
use MailPoet\Models\ScheduledTaskSubscriber;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
class AutomaticEmailScheduler {
|
class AutomaticEmailScheduler {
|
||||||
|
/** @var WPFunctions|null */
|
||||||
|
private $wp;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
?WPFunctions $wp = null
|
||||||
|
) {
|
||||||
|
$this->wp = $wp;
|
||||||
|
}
|
||||||
|
|
||||||
public function scheduleAutomaticEmail($group, $event, $schedulingCondition = false, $subscriberId = false, $meta = false) {
|
public function scheduleAutomaticEmail($group, $event, $schedulingCondition = false, $subscriberId = false, $meta = false) {
|
||||||
$newsletters = Scheduler::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
|
$newsletters = Scheduler::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
|
||||||
if (empty($newsletters)) return false;
|
if (empty($newsletters)) return false;
|
||||||
@@ -92,7 +102,7 @@ class AutomaticEmailScheduler {
|
|||||||
$sendingTask->status = SendingQueue::STATUS_SCHEDULED;
|
$sendingTask->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
$sendingTask->priority = SendingQueue::PRIORITY_MEDIUM;
|
$sendingTask->priority = SendingQueue::PRIORITY_MEDIUM;
|
||||||
|
|
||||||
$sendingTask->scheduledAt = Scheduler::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber);
|
$sendingTask->scheduledAt = Scheduler::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber, $this->wp);
|
||||||
return $sendingTask->save();
|
return $sendingTask->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +112,7 @@ class AutomaticEmailScheduler {
|
|||||||
$sendingTask->__set('meta', $meta);
|
$sendingTask->__set('meta', $meta);
|
||||||
}
|
}
|
||||||
// compute new 'scheduled_at' from now
|
// compute new 'scheduled_at' from now
|
||||||
$sendingTask->scheduledAt = Scheduler::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber);
|
$sendingTask->scheduledAt = Scheduler::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber, $this->wp);
|
||||||
$sendingTask->save();
|
$sendingTask->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,8 +33,8 @@ class Scheduler {
|
|||||||
return $previousRunDate;
|
return $previousRunDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getScheduledTimeWithDelay($afterTimeType, $afterTimeNumber) {
|
public static function getScheduledTimeWithDelay($afterTimeType, $afterTimeNumber, $wp = null): Carbon {
|
||||||
$wp = WPFunctions::get();
|
$wp = $wp ?? WPFunctions::get();
|
||||||
$currentTime = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
$currentTime = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
||||||
switch ($afterTimeType) {
|
switch ($afterTimeType) {
|
||||||
case 'minutes':
|
case 'minutes':
|
||||||
|
@@ -148,7 +148,6 @@ class AutomaticEmailTest extends \MailPoetTest {
|
|||||||
|
|
||||||
public function testItSchedulesAutomaticEmailWhenConditionMatches() {
|
public function testItSchedulesAutomaticEmailWhenConditionMatches() {
|
||||||
$currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
|
$currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
|
||||||
Carbon::setTestNow($currentTime); // mock carbon to return current time
|
|
||||||
$newsletter1 = $this->_createNewsletter();
|
$newsletter1 = $this->_createNewsletter();
|
||||||
$this->_createNewsletterOptions(
|
$this->_createNewsletterOptions(
|
||||||
$newsletter1->id,
|
$newsletter1->id,
|
||||||
@@ -175,8 +174,13 @@ class AutomaticEmailTest extends \MailPoetTest {
|
|||||||
return $email->sendTo === 'segment';
|
return $email->sendTo === 'segment';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$wpMock = $this->createMock(WPFunctions::class);
|
||||||
|
$wpMock->expects($this->any())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($currentTime->getTimestamp());
|
||||||
|
$automaticEmailScheduler = new AutomaticEmailScheduler($wpMock);
|
||||||
// email should only be scheduled if it matches condition ("send to segment")
|
// email should only be scheduled if it matches condition ("send to segment")
|
||||||
$this->automaticEmailScheduler->scheduleAutomaticEmail('some_group', 'some_event', $condition);
|
$automaticEmailScheduler->scheduleAutomaticEmail('some_group', 'some_event', $condition);
|
||||||
$result = SendingQueue::findMany();
|
$result = SendingQueue::findMany();
|
||||||
expect($result)->count(1);
|
expect($result)->count(1);
|
||||||
expect($result[0]->newsletter_id)->equals($newsletter2->id);
|
expect($result[0]->newsletter_id)->equals($newsletter2->id);
|
||||||
|
Reference in New Issue
Block a user