Fix flaky schedule automatic email test

[MAILPOET-3793]
This commit is contained in:
Brezo Cordero
2021-09-27 13:45:06 -05:00
committed by Veljko V
parent 06ddc42657
commit d37f0642d5
3 changed files with 20 additions and 6 deletions

View File

@@ -7,8 +7,18 @@ use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\SendingQueue;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\WP\Functions as WPFunctions;
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) {
$newsletters = Scheduler::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) return false;
@@ -92,7 +102,7 @@ class AutomaticEmailScheduler {
$sendingTask->status = SendingQueue::STATUS_SCHEDULED;
$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();
}
@@ -102,7 +112,7 @@ class AutomaticEmailScheduler {
$sendingTask->__set('meta', $meta);
}
// 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();
}
}

View File

@@ -33,8 +33,8 @@ class Scheduler {
return $previousRunDate;
}
public static function getScheduledTimeWithDelay($afterTimeType, $afterTimeNumber) {
$wp = WPFunctions::get();
public static function getScheduledTimeWithDelay($afterTimeType, $afterTimeNumber, $wp = null): Carbon {
$wp = $wp ?? WPFunctions::get();
$currentTime = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
switch ($afterTimeType) {
case 'minutes':

View File

@@ -148,7 +148,6 @@ class AutomaticEmailTest extends \MailPoetTest {
public function testItSchedulesAutomaticEmailWhenConditionMatches() {
$currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
Carbon::setTestNow($currentTime); // mock carbon to return current time
$newsletter1 = $this->_createNewsletter();
$this->_createNewsletterOptions(
$newsletter1->id,
@@ -175,8 +174,13 @@ class AutomaticEmailTest extends \MailPoetTest {
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")
$this->automaticEmailScheduler->scheduleAutomaticEmail('some_group', 'some_event', $condition);
$automaticEmailScheduler->scheduleAutomaticEmail('some_group', 'some_event', $condition);
$result = SendingQueue::findMany();
expect($result)->count(1);
expect($result[0]->newsletter_id)->equals($newsletter2->id);