Files
piratepoet/mailpoet/tests/integration/Automation/Integrations/MailPoet/Fields/SubscriberAutomationFieldsFactoryTest.php
2024-03-11 10:31:15 +01:00

193 lines
9.0 KiB
PHP

<?php declare(strict_types = 1);
namespace integration\Automation\Integrations\MailPoet\Fields;
use DateTimeImmutable;
use DateTimeInterface;
use MailPoet\Automation\Engine\Data\Automation;
use MailPoet\Automation\Engine\Data\AutomationRun;
use MailPoet\Automation\Engine\Data\Subject;
use MailPoet\Automation\Engine\Storage\AutomationRunStorage;
use MailPoet\Automation\Engine\Storage\AutomationStorage;
use MailPoet\Automation\Integrations\MailPoet\Fields\SubscriberAutomationFieldsFactory;
use MailPoet\Automation\Integrations\MailPoet\Payloads\SubscriberPayload;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory;
use MailPoetTest;
class SubscriberAutomationFieldsFactoryTest extends MailPoetTest {
public function testItCreatesAutomationFields(): void {
$draft = $this->createAutomation('Draft', Automation::STATUS_DRAFT);
$active = $this->createAutomation('Active', Automation::STATUS_ACTIVE);
$deactivating = $this->createAutomation('Deactivating', Automation::STATUS_DEACTIVATING);
$this->createAutomation('Trash', Automation::STATUS_TRASH); // not included
$fields = $this->getFieldsMap();
// check definitions
$this->assertCount(3, $fields);
$expected = [
'mailpoet:subscriber:automations-entered' => 'Automations — entered',
'mailpoet:subscriber:automations-processing' => 'Automations — processing',
'mailpoet:subscriber:automations-exited' => 'Automations — exited',
];
foreach ($expected as $key => $name) {
$field = $fields[$key];
$this->assertSame($name, $field->getName());
$this->assertSame('enum_array', $field->getType());
$this->assertSame([
'options' => [
['id' => $deactivating->getId(), 'name' => "Deactivating (#{$deactivating->getId()})"],
['id' => $active->getId(), 'name' => "Active (#{$active->getId()})"],
['id' => $draft->getId(), 'name' => "Draft (#{$draft->getId()})"],
],
'params' => ['in_the_last'],
], $field->getArgs());
}
// check values
$subscriber = (new SubscriberFactory())->create();
$subject = new Subject(SubscriberSubject::KEY, ['subscriber_id' => $subscriber->getId()]);
$this->createAutomationRun($draft, AutomationRun::STATUS_COMPLETE, [$subject]);
$this->createAutomationRun($active, AutomationRun::STATUS_CANCELLED, [$subject]);
$this->createAutomationRun($active, AutomationRun::STATUS_RUNNING, [$subject]);
$this->createAutomationRun($active, AutomationRun::STATUS_COMPLETE, [$subject]);
$this->createAutomationRun($deactivating, AutomationRun::STATUS_RUNNING, [$subject]);
$payload = new SubscriberPayload($subscriber);
$entered = $fields['mailpoet:subscriber:automations-entered'];
$processing = $fields['mailpoet:subscriber:automations-processing'];
$exited = $fields['mailpoet:subscriber:automations-exited'];
$this->assertSame([$deactivating->getId(), $active->getId(), $draft->getId()], $entered->getValue($payload));
$this->assertSame([$deactivating->getId(), $active->getId()], $processing->getValue($payload));
$this->assertSame([$active->getId(), $draft->getId()], $exited->getValue($payload));
}
public function testAutomationFieldsWithInTheLastParameter(): void {
$draft1 = $this->createAutomation('Draft 1', Automation::STATUS_DRAFT);
$draft2 = $this->createAutomation('Draft 2', Automation::STATUS_DRAFT);
$active1 = $this->createAutomation('Active 1', Automation::STATUS_ACTIVE);
$active2 = $this->createAutomation('Active 2', Automation::STATUS_ACTIVE);
$active3 = $this->createAutomation('Active 3', Automation::STATUS_ACTIVE);
$deactivating1 = $this->createAutomation('Deactivating 1', Automation::STATUS_DEACTIVATING);
$deactivating2 = $this->createAutomation('Deactivating 2', Automation::STATUS_DEACTIVATING);
$this->createAutomation('Trash', Automation::STATUS_TRASH); // not included
$fields = $this->getFieldsMap();
$subscriber = (new SubscriberFactory())->create();
$subject = new Subject(SubscriberSubject::KEY, ['subscriber_id' => $subscriber->getId()]);
$this->createAutomationRun($draft1, AutomationRun::STATUS_COMPLETE, [$subject], new DateTimeImmutable('-1 month'));
$this->createAutomationRun($draft2, AutomationRun::STATUS_COMPLETE, [$subject], new DateTimeImmutable('-1 week'));
$this->createAutomationRun($active1, AutomationRun::STATUS_CANCELLED, [$subject], new DateTimeImmutable('-1 month'));
$this->createAutomationRun($active2, AutomationRun::STATUS_CANCELLED, [$subject], new DateTimeImmutable('-1 week'));
$this->createAutomationRun($active1, AutomationRun::STATUS_RUNNING, [$subject], new DateTimeImmutable('-1 month'));
$this->createAutomationRun($active3, AutomationRun::STATUS_RUNNING, [$subject], new DateTimeImmutable('-1 week'));
$this->createAutomationRun($active2, AutomationRun::STATUS_COMPLETE, [$subject], new DateTimeImmutable('-1 month'));
$this->createAutomationRun($active3, AutomationRun::STATUS_COMPLETE, [$subject], new DateTimeImmutable('-1 week'));
$this->createAutomationRun($deactivating1, AutomationRun::STATUS_RUNNING, [$subject], new DateTimeImmutable('-1 month'));
$this->createAutomationRun($deactivating2, AutomationRun::STATUS_RUNNING, [$subject], new DateTimeImmutable('-1 week'));
$payload = new SubscriberPayload($subscriber);
$entered = $fields['mailpoet:subscriber:automations-entered'];
$processing = $fields['mailpoet:subscriber:automations-processing'];
$exited = $fields['mailpoet:subscriber:automations-exited'];
// all time
$this->assertSame(
[$deactivating2->getId(), $deactivating1->getId(), $active3->getId(), $active2->getId(), $active1->getId(), $draft2->getId(), $draft1->getId()],
$entered->getValue($payload)
);
$this->assertSame(
[$deactivating2->getId(), $deactivating1->getId(), $active3->getId(), $active1->getId()],
$processing->getValue($payload)
);
$this->assertSame(
[$active3->getId(), $active2->getId(), $draft2->getId(), $draft1->getId()],
$exited->getValue($payload)
);
// 3 months
$this->assertSame(
[$deactivating2->getId(), $deactivating1->getId(), $active3->getId(), $active2->getId(), $active1->getId(), $draft2->getId(), $draft1->getId()],
$entered->getValue($payload, ['in_the_last_seconds' => 3 * MONTH_IN_SECONDS])
);
$this->assertSame(
[$deactivating2->getId(), $deactivating1->getId(), $active3->getId(), $active1->getId()],
$processing->getValue($payload, ['in_the_last_seconds' => 3 * MONTH_IN_SECONDS])
);
$this->assertSame(
[$active3->getId(), $active2->getId(), $draft2->getId(), $draft1->getId()],
$exited->getValue($payload, ['in_the_last_seconds' => 3 * MONTH_IN_SECONDS])
);
// 3 weeks
$this->assertSame(
[$deactivating2->getId(), $active3->getId(), $active2->getId(), $draft2->getId()],
$entered->getValue($payload, ['in_the_last_seconds' => 3 * WEEK_IN_SECONDS])
);
$this->assertSame(
[$deactivating2->getId(), $active3->getId()],
$processing->getValue($payload, ['in_the_last_seconds' => 3 * WEEK_IN_SECONDS])
);
$this->assertSame(
[$active3->getId(), $draft2->getId()],
$exited->getValue($payload, ['in_the_last_seconds' => 3 * WEEK_IN_SECONDS])
);
// 3 days
$this->assertSame([], $entered->getValue($payload, ['in_the_last_seconds' => 3 * DAY_IN_SECONDS]));
$this->assertSame([], $processing->getValue($payload, ['in_the_last_seconds' => 3 * DAY_IN_SECONDS]));
$this->assertSame([], $exited->getValue($payload, ['in_the_last_seconds' => 3 * DAY_IN_SECONDS]));
}
private function getFieldsMap(): array {
$factory = $this->diContainer->get(SubscriberAutomationFieldsFactory::class);
$fields = [];
foreach ($factory->getFields() as $field) {
$fields[$field->getKey()] = $field;
}
return $fields;
}
private function createAutomation(string $name, string $status): Automation {
$automation = $this->tester->createAutomation($name);
$this->assertInstanceOf(Automation::class, $automation);
$automation->setStatus($status);
$this->diContainer->get(AutomationStorage::class)->updateAutomation($automation);
return $automation;
}
private function createAutomationRun(
Automation $automation,
string $status,
array $subjects,
DateTimeInterface $createdAt = null
): AutomationRun {
$runStorage = $this->diContainer->get(AutomationRunStorage::class);
$run = $this->tester->createAutomationRun($automation, $subjects);
$this->assertInstanceOf(AutomationRun::class, $run);
global $wpdb;
$wpdb->update(
$wpdb->prefix . 'mailpoet_automation_runs',
array_merge(
['status' => $status],
...[$createdAt ? ['created_at' => $createdAt->format('Y-m-d H:i:s')] : []],
),
['id' => $run->getId()]
);
$run = $runStorage->getAutomationRun($run->getId());
$this->assertInstanceOf(AutomationRun::class, $run);
return $run;
}
}