Files
piratepoet/mailpoet/tests/integration/Automation/Engine/Builder/UpdateAutomationControllerTest.php
Jan Jakes a1632ea512 Satisfy PHPCS checks also in tests
[MAILPOET-6150]
2024-08-29 17:23:34 +02:00

119 lines
5.6 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\Test\Automation\Engine\Control;
use ActionScheduler_Store;
use MailPoet\Automation\Engine\Builder\UpdateAutomationController;
use MailPoet\Automation\Engine\Data\Automation;
use MailPoet\Automation\Engine\Data\AutomationRun;
use MailPoet\Automation\Engine\Data\NextStep;
use MailPoet\Automation\Engine\Data\Step;
use MailPoet\Automation\Engine\Hooks;
use MailPoet\Automation\Engine\Storage\AutomationRunStorage;
use MailPoet\Automation\Engine\Storage\AutomationStorage;
use MailPoetTest;
class UpdateAutomationControllerTest extends MailPoetTest {
public function testItUnschedulesTasksWhenSwitchedToDraft(): void {
$automation = $this->tester->createAutomation(
'Test automation',
new Step('t', Step::TYPE_TRIGGER, 'test:trigger', [], [new NextStep('a1')]),
new Step('a1', Step::TYPE_ACTION, 'test:action', [], [new NextStep('a2')]),
new Step('a2', Step::TYPE_ACTION, 'test:action', [], [])
);
$run1 = $this->tester->createAutomationRun($automation);
$run2 = $this->tester->createAutomationRun($automation);
$run3 = $this->tester->createAutomationRun($automation);
$run4 = $this->tester->createAutomationRun($automation);
$runStorage = $this->diContainer->get(AutomationRunStorage::class);
$runStorage->updateStatus($run1->getId(), AutomationRun::STATUS_RUNNING);
$runStorage->updateStatus($run2->getId(), AutomationRun::STATUS_COMPLETE);
$runStorage->updateStatus($run3->getId(), AutomationRun::STATUS_FAILED);
$runStorage->updateStatus($run4->getId(), AutomationRun::STATUS_CANCELLED);
$this->scheduleAction(time() + 100, ['automation_run_id' => $run1->getId(), 'step_id' => 'aaa', 'run_number' => 1]);
$this->scheduleAction(time() + 200, ['automation_run_id' => $run1->getId(), 'step_id' => 'bbb', 'run_number' => 1]);
$this->scheduleAction(time() + 300, ['automation_run_id' => $run1->getId(), 'step_id' => 'bbb', 'run_number' => 2]);
$this->assertCount(3, $this->getActions());
$this->assertCount(3, $this->getActions(['status' => ActionScheduler_Store::STATUS_PENDING]));
// switch to draft
$controller = $this->diContainer->get(UpdateAutomationController::class);
$controller->updateAutomation($automation->getId(), [
'status' => Automation::STATUS_DRAFT,
]);
$automationStorage = $this->diContainer->get(AutomationStorage::class);
$updatedAutomation = $automationStorage->getAutomation($automation->getId());
$this->assertInstanceOf(Automation::class, $updatedAutomation);
$this->assertSame(Automation::STATUS_DRAFT, $updatedAutomation->getStatus());
$this->assertSame(AutomationRun::STATUS_CANCELLED, $this->getAutomationRun($run1->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_COMPLETE, $this->getAutomationRun($run2->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_FAILED, $this->getAutomationRun($run3->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_CANCELLED, $this->getAutomationRun($run4->getId())->getStatus());
$this->assertCount(3, $this->getActions());
$this->assertCount(3, $this->getActions(['status' => ActionScheduler_Store::STATUS_CANCELED]));
$this->assertCount(0, $this->getActions(['status' => ActionScheduler_Store::STATUS_PENDING]));
// resume automation and check that no run status was changed
$controller->updateAutomation($automation->getId(), [
'status' => Automation::STATUS_ACTIVE,
]);
$automationStorage = $this->diContainer->get(AutomationStorage::class);
$updatedAutomation = $automationStorage->getAutomation($automation->getId());
$this->assertInstanceOf(Automation::class, $updatedAutomation);
$this->assertSame(Automation::STATUS_ACTIVE, $updatedAutomation->getStatus());
$this->assertSame(AutomationRun::STATUS_CANCELLED, $this->getAutomationRun($run1->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_COMPLETE, $this->getAutomationRun($run2->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_FAILED, $this->getAutomationRun($run3->getId())->getStatus());
$this->assertSame(AutomationRun::STATUS_CANCELLED, $this->getAutomationRun($run4->getId())->getStatus());
$this->assertCount(3, $this->getActions());
$this->assertCount(3, $this->getActions(['status' => ActionScheduler_Store::STATUS_CANCELED]));
$this->assertCount(0, $this->getActions(['status' => ActionScheduler_Store::STATUS_PENDING]));
}
private function getAutomationRun(int $id): AutomationRun {
$runStorage = $this->diContainer->get(AutomationRunStorage::class);
$run = $runStorage->getAutomationRun($id);
$this->assertInstanceOf(AutomationRun::class, $run);
return $run;
}
private function scheduleAction(int $timestamp, array $args): int {
return as_schedule_single_action($timestamp, Hooks::AUTOMATION_STEP, [$args], 'mailpoet-automation');
}
private function getActions(array $args = []): array {
return array_values(
as_get_scheduled_actions(
array_merge(['hook' => Hooks::AUTOMATION_STEP, 'group' => 'mailpoet-automation'], $args)
)
);
}
public function _before(): void {
$this->cleanup();
}
public function _after(): void {
$this->cleanup();
}
private function cleanup() {
$this->diContainer->get(AutomationStorage::class)->truncate();
$this->diContainer->get(AutomationRunStorage::class)->truncate();
global $wpdb;
$wpdb->query($wpdb->prepare('TRUNCATE %i', $wpdb->prefix . 'actionscheduler_actions'));
$wpdb->query($wpdb->prepare('TRUNCATE %i', $wpdb->prefix . 'actionscheduler_claims'));
}
}