settings = SettingsController::getInstance(); $this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class); $this->truncateEntity(ScheduledTaskEntity::class); $this->settings->set('tracking.enabled', true); $this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); parent::_before(); } public function testItReactivateInactiveSubscribersWhenIntervalIsSetToNever() { $this->settings->set('deactivate_subscriber_after_inactive_days', 0); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub\Expected::never(), 'markActiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::once(), ], $this); $worker = new InactiveSubscribers($controllerMock, $this->settings); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); $task = $this->scheduledTasksRepository->findOneBy( ['type' => InactiveSubscribers::TASK_TYPE, 'status' => ScheduledTaskEntity::STATUS_SCHEDULED] ); assert($task instanceof ScheduledTaskEntity); expect($task)->isInstanceOf(ScheduledTaskEntity::class); expect($task->getScheduledAt())->greaterThan(new Carbon()); } public function testItDoesNotRunWhenTrackingIsDisabled() { $this->settings->set('deactivate_subscriber_after_inactive_days', 10); $this->settings->set('tracking.enabled', false); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub\Expected::never(), 'markActiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(), ], $this); $worker = new InactiveSubscribers($controllerMock, $this->settings); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); } public function testItSchedulesNextRunWhenFinished() { $this->settings->set('deactivate_subscriber_after_inactive_days', 5); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub\Expected::once(1), 'markActiveSubscribers' => Stub\Expected::once(1), 'reactivateInactiveSubscribers' => Stub\Expected::never(), ], $this); $worker = new InactiveSubscribers($controllerMock, $this->settings); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); $task = $this->scheduledTasksRepository->findOneBy( ['type' => InactiveSubscribers::TASK_TYPE, 'status' => ScheduledTaskEntity::STATUS_SCHEDULED] ); assert($task instanceof ScheduledTaskEntity); expect($task)->isInstanceOf(ScheduledTaskEntity::class); expect($task->getScheduledAt())->greaterThan(new Carbon()); } public function testRunBatchesUntilItIsFinished() { $this->settings->set('deactivate_subscriber_after_inactive_days', 5); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub::consecutive(InactiveSubscribers::BATCH_SIZE, InactiveSubscribers::BATCH_SIZE, 1, 0), 'markActiveSubscribers' => Stub::consecutive(InactiveSubscribers::BATCH_SIZE, 1, 0), 'reactivateInactiveSubscribers' => Stub\Expected::never(), ], $this); $worker = new InactiveSubscribers($controllerMock, $this->settings); $task = new ScheduledTaskEntity(); $task->setMeta(['max_subscriber_id' => 2001 /* 3 iterations of BATCH_SIZE in markInactiveSubscribers */]); $this->entityManager->persist($task); $this->entityManager->flush(); $worker->processTaskStrategy($task, microtime(true)); expect($controllerMock->markInactiveSubscribers(5, 1000))->equals(0); expect($controllerMock->markActiveSubscribers(5, 1000))->equals(0); } public function testItCanStopDeactivationIfMarkInactiveSubscribersReturnsFalse() { $this->settings->set('deactivate_subscriber_after_inactive_days', 5); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub\Expected::once(false), 'markActiveSubscribers' => Stub\Expected::once(1), 'reactivateInactiveSubscribers' => Stub\Expected::never(), ], $this); $task = new ScheduledTaskEntity(); $worker = new InactiveSubscribers($controllerMock, $this->settings); $worker->processTaskStrategy($task, microtime(true)); $meta = $task->getMeta(); expect(isset($meta['last_subscriber_id']))->equals(false); } public function testThrowsAnExceptionWhenTimeIsOut() { $this->settings->set('deactivate_subscriber_after_inactive_days', 5); $controllerMock = Stub::make(InactiveSubscribersController::class, [ 'markInactiveSubscribers' => Stub\Expected::once(InactiveSubscribers::BATCH_SIZE), 'markActiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(), ], $this); $worker = new InactiveSubscribers($controllerMock, $this->settings); $this->expectException(\Exception::class); $this->expectExceptionMessage('Maximum execution time has been reached.'); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true) - $this->cronHelper->getDaemonExecutionLimit()); } }