Files
piratepoet/mailpoet/tests/integration/Migrations/MigrateDefaultInactiveSubscriberFrequencyTest.php
John Oleksowicz ed28dcc6e6 Update tests
[MAILPOET-4061]
2022-02-07 14:37:08 +01:00

124 lines
4.8 KiB
PHP

<?php
namespace MailPoet\Test\Migrations;
use Codeception\Stub;
use MailPoet\Config\Activator;
use MailPoet\Cron\Workers\InactiveSubscribers;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Settings\SettingsController;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
class MigrateDefaultInactiveSubscriberFrequencyTest extends \MailPoetTest {
/** @var SettingsController */
private $settingsController;
/** @var Activator */
private $activator;
public function _before() {
parent::_before();
$this->activator = $this->diContainer->get(Activator::class);
$this->settingsController = $this->diContainer->get(SettingsController::class);
$this->settingsController->delete('deactivate_subscriber_after_inactive_days');
}
public function testItDoesNotUpdateValuesOtherThanThePreviousDefault() {
$nonDefaultOptions = [ '', '90', '365' ];
foreach ($nonDefaultOptions as $option) {
$this->settingsController->set('db_version', '3.78.0');
$this->settingsController->set('deactivate_subscriber_after_inactive_days', $option);
$this->activator->activate();
$this->assertEquals($option, $this->settingsController->get('deactivate_subscriber_after_inactive_days'));
}
}
public function testItDoesUpdatePreviousDefaultValue() {
$this->settingsController->set('db_version', '3.78.0');
$this->settingsController->set('deactivate_subscriber_after_inactive_days', '180');
$this->activator->activate();
$this->assertEquals('365', $this->settingsController->get('deactivate_subscriber_after_inactive_days'));
}
public function testItDoesNotRunForUnexpectedVersions() {
$versions = ['3.78.1', '3.900.2', '4.8.0'];
foreach ($versions as $version) {
$this->settingsController->set('db_version', $version);
$this->settingsController->set('deactivate_subscriber_after_inactive_days', '180');
$this->assertEquals('180', $this->settingsController->get('deactivate_subscriber_after_inactive_days'));
$this->activator->activate();
$this->assertEquals('180', $this->settingsController->get('deactivate_subscriber_after_inactive_days'));
}
}
public function testItDoesNotRunForNewInstalls() {
$this->settingsController->delete('db_version');
$this->activator->activate();
$setting = $this->settingsController->get('deactivate_subscriber_after_inactive_days', 'not-set');
$this->assertEquals('not-set', $setting);
}
public function testItCreatesInactiveSubscribersTaskIfOneNotAlreadyScheduled() {
$currentTime = Carbon::now()->microsecond(0);
/** @var WPFunctions $wpStub */
$wpStub = Stub::make(new WPFunctions(), [
'currentTime' => asCallable(function() use ($currentTime) {
return $currentTime->getTimestamp();
}),
]);
WPFunctions::set($wpStub);
// Double check there isn't already a task in the DB
$scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
$shouldBeNull = $scheduledTasksRepository->findOneBy([
'type' => InactiveSubscribers::TASK_TYPE,
]);
$this->assertNull($shouldBeNull);
// Run the migration
$this->settingsController->set('db_version', '3.78.0');
$this->settingsController->set('deactivate_subscriber_after_inactive_days', '180');
$this->activator->activate();
$scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
$task = $scheduledTasksRepository->findOneBy([
'type' => InactiveSubscribers::TASK_TYPE,
]);
$this->assertNotNull($task);
$this->assertEquals($currentTime->subMinute(), $task->getScheduledAt());
}
public function testItReschedulesScheduledInactiveSubscribersTask() {
$currentTime = Carbon::now()->microsecond(0);
/** @var WPFunctions $wpStub */
$wpStub = Stub::make(new WPFunctions(), [
'currentTime' => asCallable(function() use ($currentTime) {
return $currentTime->getTimestamp();
}),
]);
WPFunctions::set($wpStub);
$twoHoursFromNow = $currentTime->copy()->addHours(2);
// Create existing task scheduled for the future
$existingTask = new ScheduledTaskEntity();
$existingTask->setType(InactiveSubscribers::TASK_TYPE);
$existingTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$existingTask->setScheduledAt($twoHoursFromNow);
$scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
$scheduledTasksRepository->persist($existingTask);
$scheduledTasksRepository->flush();
// Run the migration
$this->settingsController->set('db_version', '3.78.0');
$this->settingsController->set('deactivate_subscriber_after_inactive_days', '180');
$this->activator->activate();
$this->assertEquals($currentTime->subMinute(), $existingTask->getScheduledAt());
}
}