Add cron worker for inactive subscribers
[MAILPOET-1791]
This commit is contained in:
committed by
M. Shull
parent
7b433a4273
commit
7eb0e23d22
47
lib/Cron/Workers/InactiveSubscribers.php
Normal file
47
lib/Cron/Workers/InactiveSubscribers.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Cron\Workers;
|
||||||
|
|
||||||
|
use MailPoet\Cron\CronHelper;
|
||||||
|
use MailPoet\Models\ScheduledTask;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\Subscribers\InactiveSubscribersController;
|
||||||
|
|
||||||
|
if (!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
|
class InactiveSubscribers extends SimpleWorker {
|
||||||
|
const TASK_TYPE = 'inactive_subscribers';
|
||||||
|
const BATCH_SIZE = 1000;
|
||||||
|
|
||||||
|
/** @var InactiveSubscribersController */
|
||||||
|
private $inactive_subscribers_controller;
|
||||||
|
|
||||||
|
/** @var SettingsController */
|
||||||
|
private $settings;
|
||||||
|
|
||||||
|
function __construct(
|
||||||
|
InactiveSubscribersController $inactive_subscribers_controller,
|
||||||
|
SettingsController $settings,
|
||||||
|
$timer = false
|
||||||
|
) {
|
||||||
|
$this->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;
|
||||||
|
}
|
||||||
|
}
|
85
tests/integration/Cron/Workers/InactiveSubscribersTest.php
Normal file
85
tests/integration/Cron/Workers/InactiveSubscribersTest.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Test\Cron\Workers;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Codeception\Stub;
|
||||||
|
use MailPoet\Cron\CronHelper;
|
||||||
|
use MailPoet\Cron\Workers\InactiveSubscribers;
|
||||||
|
use MailPoet\Models\ScheduledTask;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\Subscribers\InactiveSubscribersController;
|
||||||
|
|
||||||
|
class InactiveSubscribersTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var SettingsController */
|
||||||
|
private $settings;
|
||||||
|
|
||||||
|
function _before() {
|
||||||
|
$this->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([]));
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user