From 7eb0e23d2258c80a9e45731d40a4daab6710bc12 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Tue, 16 Apr 2019 15:07:08 +0200 Subject: [PATCH] Add cron worker for inactive subscribers [MAILPOET-1791] --- lib/Cron/Workers/InactiveSubscribers.php | 47 ++++++++++ .../Cron/Workers/InactiveSubscribersTest.php | 85 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 lib/Cron/Workers/InactiveSubscribers.php create mode 100644 tests/integration/Cron/Workers/InactiveSubscribersTest.php diff --git a/lib/Cron/Workers/InactiveSubscribers.php b/lib/Cron/Workers/InactiveSubscribers.php new file mode 100644 index 0000000000..662d05a572 --- /dev/null +++ b/lib/Cron/Workers/InactiveSubscribers.php @@ -0,0 +1,47 @@ +inactive_subscribers_controller = $inactive_subscribers_controller; + $this->settings = $settings; + parent::__construct($timer); + } + + + function processTaskStrategy(ScheduledTask $task) { + $days_to_inactive = (int)$this->settings->get('deactivate_subscriber_after_inactive_days'); + if ($days_to_inactive === 0) { + self::schedule(); + return true; + } + while ($this->inactive_subscribers_controller->markInactiveSubscribers($days_to_inactive, self::BATCH_SIZE) === self::BATCH_SIZE) { + CronHelper::enforceExecutionLimit($this->timer); + }; + while ($this->inactive_subscribers_controller->markActiveSubscribers($days_to_inactive, self::BATCH_SIZE) === self::BATCH_SIZE) { + CronHelper::enforceExecutionLimit($this->timer); + }; + self::schedule(); + return true; + } +} diff --git a/tests/integration/Cron/Workers/InactiveSubscribersTest.php b/tests/integration/Cron/Workers/InactiveSubscribersTest.php new file mode 100644 index 0000000000..5e8bc12a7d --- /dev/null +++ b/tests/integration/Cron/Workers/InactiveSubscribersTest.php @@ -0,0 +1,85 @@ +settings = new SettingsController(); + \ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + parent::_before(); + } + + function testItSchedulesNextRunWhenThereIsNothingToDo() { + $this->settings->set('deactivate_subscriber_after_inactive_days', 0); + $controller_mock = Stub::make(InactiveSubscribersController::class, [ + 'markInactiveSubscribers' => Stub\Expected::never(), + 'markActiveSubscribers' => Stub\Expected::never(), + ], $this); + + $worker = new InactiveSubscribers($controller_mock, $this->settings); + $worker->processTaskStrategy(ScheduledTask::createOrUpdate([])); + + $task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE) + ->where('status', ScheduledTask::STATUS_SCHEDULED) + ->findOne(); + + expect($task)->isInstanceOf(ScheduledTask::class); + expect($task->scheduled_at)->greaterThan(new Carbon()); + } + + function testItSchedulesNextRunWhenFinished() { + $this->settings->set('deactivate_subscriber_after_inactive_days', 5); + $controller_mock = Stub::make(InactiveSubscribersController::class, [ + 'markInactiveSubscribers' => Stub\Expected::once(1), + 'markActiveSubscribers' => Stub\Expected::once(1), + ], $this); + + $worker = new InactiveSubscribers($controller_mock, $this->settings); + $worker->processTaskStrategy(ScheduledTask::createOrUpdate([])); + + $task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE) + ->where('status', ScheduledTask::STATUS_SCHEDULED) + ->findOne(); + + expect($task)->isInstanceOf(ScheduledTask::class); + expect($task->scheduled_at)->greaterThan(new Carbon()); + } + + function testRunBatchesUntilItIsFinished() { + $this->settings->set('deactivate_subscriber_after_inactive_days', 5); + $controller_mock = Stub::make(InactiveSubscribersController::class, [ + 'markInactiveSubscribers' => Stub::consecutive(InactiveSubscribers::BATCH_SIZE, InactiveSubscribers::BATCH_SIZE, 1, 'ok'), + 'markActiveSubscribers' => Stub::consecutive(InactiveSubscribers::BATCH_SIZE, 1, 'ok'), + ], $this); + + $worker = new InactiveSubscribers($controller_mock, $this->settings); + $worker->processTaskStrategy(ScheduledTask::createOrUpdate([])); + + expect($controller_mock->markInactiveSubscribers(5, 1000))->equals('ok'); + expect($controller_mock->markActiveSubscribers(5, 1000))->equals('ok'); + } + + function testThrowsAnExceptionWhenTimeIsOut() { + $this->settings->set('deactivate_subscriber_after_inactive_days', 5); + $controller_mock = Stub::make(InactiveSubscribersController::class, [ + 'markInactiveSubscribers' => Stub\Expected::once(InactiveSubscribers::BATCH_SIZE), + 'markActiveSubscribers' => Stub\Expected::never(), + ], $this); + + $worker = new InactiveSubscribers($controller_mock, $this->settings, microtime(true) - (CronHelper::DAEMON_EXECUTION_LIMIT - 1)); + sleep(1); + $this->setExpectedException(\Exception::class, 'Maximum execution time has been reached.'); + $worker->processTaskStrategy(ScheduledTask::createOrUpdate([])); + } +}