diff --git a/mailpoet/lib/Newsletter/Scheduler/Scheduler.php b/mailpoet/lib/Newsletter/Scheduler/Scheduler.php index 1e41349ef5..ba839c96e7 100644 --- a/mailpoet/lib/Newsletter/Scheduler/Scheduler.php +++ b/mailpoet/lib/Newsletter/Scheduler/Scheduler.php @@ -27,17 +27,17 @@ class Scheduler { /** * @return string|false */ - public function getNextRunDate($schedule, $fromTimestamp = false) { - $nextRunDateTime = $this->getNextRunDateTime($schedule, $fromTimestamp); + public function getNextRunDate($schedule) { + $nextRunDateTime = $this->getNextRunDateTime($schedule); return $nextRunDateTime ? $nextRunDateTime->format('Y-m-d H:i:s') : $nextRunDateTime; } - public function getPreviousRunDate($schedule, $fromTimestamp = false) { + public function getPreviousRunDate($schedule) { // User enters time in WordPress site timezone, but we need to calculate it in UTC before we save it to DB - // 1) As the initial tile we use time in site timezone (gmt is false) + // 1) As the initial time we use time in site timezone (gmt is false) // 2) We use CronExpression to calculate previous run (still in site's timezone) // 3) We convert the calculated time to UTC - $fromTimestamp = ($fromTimestamp) ?: $this->wp->currentTime('timestamp', false); + $fromTimestamp = $this->wp->currentTime('timestamp', false); try { $schedule = \Cron\CronExpression::factory($schedule); $previousRunDate = $schedule->getPreviousRunDate(Carbon::createFromTimestamp($fromTimestamp, $this->wp->wpTimezone())); @@ -86,12 +86,12 @@ class Scheduler { /** * @return \DateTime|false */ - public function getNextRunDateTime($schedule, $fromTimestamp = false) { + public function getNextRunDateTime($schedule) { // User enters time in WordPress site timezone, but we need to calculate it in UTC before we save it to DB - // 1) As the initial tile we use time in site timezone (gmt is false) + // 1) As the initial time we use time in site timezone (gmt is false) // 2) We use CronExpression to calculate next run (still in site's timezone) // 3) We convert the calculated time to UTC - $fromTimestamp = $fromTimestamp ?: $this->wp->currentTime('timestamp', false); + $fromTimestamp = $this->wp->currentTime('timestamp', false); try { $schedule = \Cron\CronExpression::factory($schedule); $nextRunDate = $schedule->getNextRunDate(Carbon::createFromTimestamp($fromTimestamp, $this->wp->wpTimezone())); diff --git a/mailpoet/tests/integration/Newsletter/Scheduler/PostNotificationTest.php b/mailpoet/tests/integration/Newsletter/Scheduler/PostNotificationTest.php index 5a68a86c8f..aec7d3fa67 100644 --- a/mailpoet/tests/integration/Newsletter/Scheduler/PostNotificationTest.php +++ b/mailpoet/tests/integration/Newsletter/Scheduler/PostNotificationTest.php @@ -19,6 +19,7 @@ use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionsFactory; use MailPoet\Test\DataFactories\ScheduledTask; use MailPoet\Test\DataFactories\SendingQueue as SendingQueueFactory; use MailPoet\WP\DateTime; +use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Posts as WPPosts; use MailPoetVendor\Carbon\Carbon; @@ -187,8 +188,8 @@ class PostNotificationTest extends \MailPoetTest { $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + $scheduler = $this->getSchedulerWithMockedTime(1483275600); // Sunday, 1 January 2017 @ 1:00pm (UTC) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-01 14:00:00'); // testing scheduling by minutes @@ -206,8 +207,7 @@ class PostNotificationTest extends \MailPoetTest { $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-01 14:15:00'); } @@ -228,8 +228,8 @@ class PostNotificationTest extends \MailPoetTest { $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + $scheduler = $this->getSchedulerWithMockedTime(1483275600); // Sunday, 1 January 2017 @ 1:00pm (UTC) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-03 14:00:00'); // testing scheduling by minutes @@ -248,8 +248,7 @@ class PostNotificationTest extends \MailPoetTest { $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-03 23:45:00'); } @@ -269,8 +268,8 @@ class PostNotificationTest extends \MailPoetTest { $this->postNotificationScheduler->processPostNotificationSchedule($newsletter); $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + $scheduler = $this->getSchedulerWithMockedTime(1483275600); // Sunday, 1 January 2017 @ 1:00pm (UTC) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-19 14:00:00'); // testing scheduling by minutes @@ -288,8 +287,7 @@ class PostNotificationTest extends \MailPoetTest { $this->postNotificationScheduler->processPostNotificationSchedule($newsletter); $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-19 00:45:00'); } @@ -309,8 +307,8 @@ class PostNotificationTest extends \MailPoetTest { $this->postNotificationScheduler->processPostNotificationSchedule($newsletter); $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1485694800; // Sunday, 29 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + $scheduler = $this->getSchedulerWithMockedTime(1485694800);// Sunday, 29 January 2017 @ 1:00pm (UTC) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-02-25 14:00:00'); // testing scheduling by minutes @@ -328,8 +326,7 @@ class PostNotificationTest extends \MailPoetTest { $this->postNotificationScheduler->processPostNotificationSchedule($newsletter); $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1485694800; // Sunday, 29 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-02-25 14:15:00'); } @@ -349,8 +346,8 @@ class PostNotificationTest extends \MailPoetTest { $this->postNotificationScheduler->processPostNotificationSchedule($newsletter); $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE); $this->assertInstanceOf(NewsletterOptionEntity::class, $scheduleOption); - $currentTime = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) - verify($this->scheduler->getNextRunDate($scheduleOption->getValue(), $currentTime)) + $scheduler = $this->getSchedulerWithMockedTime(1483275600); + verify($scheduler->getNextRunDate($scheduleOption->getValue())) ->equals('2017-01-01 13:01:00'); } @@ -447,4 +444,12 @@ class PostNotificationTest extends \MailPoetTest { $this->newsletterPostsRepository->flush(); return $newsletterPost; } + + private function getSchedulerWithMockedTime(int $timestamp): Scheduler { + $wpMock = $this->createMock(WPFunctions::class); + $wpMock->method('currentTime')->willReturn($timestamp); + return $this->getServiceWithOverrides(Scheduler::class, [ + 'wp' => $wpMock, + ]); + } }