Files
piratepoet/mailpoet/tests/integration/REST/Automation/Automations/AutomationsGetTest.php
John Oleksowicz f90e869402 Clean up after automations too
MAILPOET-5145
2023-04-07 12:11:12 -05:00

183 lines
5.7 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\REST\Automation\Automations;
require_once __DIR__ . '/../AutomationTest.php';
use MailPoet\Automation\Engine\Data\Automation;
use MailPoet\Automation\Engine\Data\Step;
use MailPoet\Automation\Engine\Storage\AutomationStorage;
use MailPoet\REST\Automation\AutomationTest;
class AutomationsGetTest extends AutomationTest {
private const ENDPOINT_PATH = '/mailpoet/v1/automations';
/** @var AutomationStorage */
private $automationStorage;
/** @var int[] */
private $userIds = [];
public function _before() {
parent::_before();
$this->automationStorage = $this->diContainer->get(AutomationStorage::class);
$userId = wp_insert_user([
'display_name' => 'test',
'roles' => ['editor'],
'email' => 'test@mailpoet.com',
'user_pass' => 'abc',
'user_login' => 'automations-get-endpoint-test',
]);
$this->assertIsNumeric($userId);
$this->userIds[] = $userId;
}
public function testEditorIsAllowed(): void {
wp_set_current_user($this->editorUserId);
$data = $this->get(self::ENDPOINT_PATH);
$this->assertCount(0, $data['data']);
}
public function testGuestNotAllowed(): void {
wp_set_current_user(0);
$data = $this->get(self::ENDPOINT_PATH);
$this->assertSame([
'code' => 'rest_forbidden',
'message' => 'Sorry, you are not allowed to do that.',
'data' => ['status' => 401],
], $data);
}
public function testRequest(): void {
$data = $this->get(self::ENDPOINT_PATH);
$this->assertSame(['data' => []], $data);
}
public function testGetAll() {
$automation1Data = [
'name' => 'Test 1',
'status' => Automation::STATUS_DRAFT,
'author' => 1,
];
$automation2Data = [
'name' => 'Test 2',
'status' => Automation::STATUS_ACTIVE,
'author' => (int)current($this->userIds),
];
$expectedAutomation1Data = $automation1Data;
$expectedAutomation2Data = $automation2Data;
$expectedAutomation1Data['id'] = $this->createNewAutomation($automation1Data);
$expectedAutomation2Data['id'] = $this->createNewAutomation($automation2Data);
$expectedAutomation1Data['author'] = [
'id' => $automation1Data['author'],
'name' => (new \WP_User($automation1Data['author']))->display_name,
];
$expectedAutomation2Data['author'] = [
'id' => $automation2Data['author'],
'name' => (new \WP_User($automation2Data['author']))->display_name,
];
$result = $this->get(self::ENDPOINT_PATH, []);
$this->assertIsArray($result['data']);
$this->assertCount(2, $result['data']);
$this->assertAutomationRestData($expectedAutomation1Data, $result['data'][1]);
$this->assertAutomationRestData($expectedAutomation2Data, $result['data'][0]);
}
public function testStatusFilterWorks() {
foreach (Automation::STATUS_ALL as $status) {
$automation = [
'name' => $status,
'status' => $status,
];
$this->createNewAutomation($automation);
}
foreach (Automation::STATUS_ALL as $status) {
$result = $this->get(self::ENDPOINT_PATH, ['query' => ['status' => $status]]);
$this->assertCount(1, $result['data']);
$this->assertEquals($status, $result['data'][0]['name']);
$this->assertEquals($status, $result['data'][0]['status']);
}
}
/**
* This small helper method can quickly assert strings or integers from
* the REST API.
*/
private function assertAutomationRestData($expectation, $data) {
// We do not expect steps.
$this->assertFalse(isset($data['steps']));
unset($expectation['steps']);
foreach ($expectation as $key => $expectedValue) {
$this->assertEquals($expectedValue, $data[$key], "Failed asserting that the property $key is equal.");
}
// Check activated_at behavior
if ($data['activated_at'] === null) {
$this->assertEquals(Automation::STATUS_DRAFT, $data['status']);
} else {
$activatedAt = null;
try {
$activatedAt = new \DateTimeImmutable($data['activated_at']);
} finally {
$this->assertInstanceOf(\DateTimeImmutable::class, $activatedAt);
}
}
// Check the date time fields are convertible.
$updatedAt = null;
$createdAt = null;
try {
$updatedAt = new \DateTimeImmutable($data['updated_at']);
$createdAt = new \DateTimeImmutable($data['created_at']);
} finally {
$this->assertInstanceOf(\DateTimeImmutable::class, $updatedAt);
$this->assertInstanceOf(\DateTimeImmutable::class, $createdAt);
}
}
private function createNewAutomation(array $data = []): int {
$rootStep = ['id' => 'root','type' => Step::TYPE_ROOT,'key' => 'core:root'];
$data['name'] = $data['name'] ?? 'Test';
$data['steps'] = $data['steps'] ?? [$rootStep];
$data['author'] = $data['author'] ?? wp_get_current_user()->ID;
$automation = new Automation(
$data['name'],
array_map([$this,'createStep'], $data['steps']),
new \WP_User((int)$data['author'])
);
$automation->setStatus($data['status'] ?? Automation::STATUS_ACTIVE);
return $this->automationStorage->createAutomation($automation);
}
private function createStep(array $data = []): Step {
$data['id'] = $data['id'] ?? uniqid();
$data['type'] = $data['type'] ?? Step::TYPE_ACTION;
$data['key'] = $data['key'] ?? 'key';
$data['args'] = $data['args'] ?? [];
$data['nextSteps'] = $data['nextSteps'] ?? [];
return new Step(
$data['id'],
$data['type'],
$data['key'],
$data['args'],
$data['nextSteps']
);
}
public function _after() {
parent::_after();
foreach ($this->userIds as $userId) {
is_multisite() ? wpmu_delete_user($userId) : wp_delete_user($userId);
}
}
}