diff --git a/lib/Newsletter/Scheduler/AutomaticEmailScheduler.php b/lib/Newsletter/Scheduler/AutomaticEmailScheduler.php index e8b75757f3..cba13940be 100644 --- a/lib/Newsletter/Scheduler/AutomaticEmailScheduler.php +++ b/lib/Newsletter/Scheduler/AutomaticEmailScheduler.php @@ -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(); } } diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index 3fe89917c2..5bba6b71d7 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -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': diff --git a/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php b/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php index c565a182e8..b1b9157ef0 100644 --- a/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php +++ b/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php @@ -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);