daemonTrigger = $this->diContainer->get(DaemonTrigger::class); $this->cleanup(); $this->scheduledTaskFactory = new ScheduledTask(); $this->scheduledTaskFactory->withDefaultTasks(); $this->actionSchedulerHelper = new ActionSchedulerTestHelper(); } public function testItSchedulesTriggerActionOnInit(): void { $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(0); $this->daemonTrigger->init(); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(1); $action = reset($actions); $this->assertInstanceOf(\ActionScheduler_Action::class, $action); expect($action->get_hook())->equals(DaemonTrigger::NAME); } public function testTriggerDoesNotTriggerAnythingIfThereAreNoJobs(): void { $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(0); $this->daemonTrigger->process(); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(0); } public function testTriggerUnschedulesRunJobIfThereIsNoMoreWork(): void { $actionScheduler = $this->diContainer->get(ActionScheduler::class); $actionScheduler->scheduleRecurringAction(time() + 60, 1, DaemonRun::NAME); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(1); $this->daemonTrigger->process(); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(0); } public function testTriggerTriggerRunnerActionWhenThereIsJob(): void { $this->diContainer->get(SettingsController::class)->set('cron_trigger.method', CronTrigger::METHOD_ACTION_SCHEDULER); $this->createDueScheduledTask(); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(0); $remoteExecutorHandlerMock = $this->createMock(RemoteExecutorHandler::class); $remoteExecutorHandlerMock->expects($this->once()) ->method('triggerExecutor'); $daemonTrigger = $this->getServiceWithOverrides(DaemonTrigger::class, [ 'remoteExecutorHandler' => $remoteExecutorHandlerMock, ]); $daemonTrigger->process(); $actions = $this->actionSchedulerHelper->getMailPoetScheduledActions(); expect($actions)->count(1); $action = reset($actions); $this->assertInstanceOf(\ActionScheduler_Action::class, $action); expect($action->get_hook())->equals(DaemonRun::NAME); $this->cleanup(); } private function createDueScheduledTask(): void { $date = Carbon::now()->subSecond(); $this->scheduledTaskFactory->create(UnsubscribeTokens::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED, $date); } private function cleanup(): void { global $wpdb; $actionsTable = $wpdb->prefix . 'actionscheduler_actions'; $wpdb->query('TRUNCATE ' . $actionsTable); $claimsTable = $wpdb->prefix . 'actionscheduler_claims'; $wpdb->query('TRUNCATE ' . $claimsTable); } }