Files
piratepoet/mailpoet/tests/integration/Automation/Integrations/MailPoet/Actions/SendWelcomeEmailActionTest.php
John Oleksowicz 2cce9bf7ad An idea for splitting validation and running
[MAILPOET-4191]
2022-04-18 09:10:23 +02:00

233 lines
10 KiB
PHP

<?php
namespace MailPoet\Test\Automation\Integrations\MailPoet\Actions;
use MailPoet\Automation\Engine\Workflows\ActionValidationResult;
use MailPoet\Automation\Engine\Workflows\Step;
use MailPoet\Automation\Engine\Workflows\Workflow;
use MailPoet\Automation\Engine\Workflows\WorkflowRun;
use MailPoet\Automation\Integrations\MailPoet\Actions\SendWelcomeEmailAction;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Exception;
use MailPoet\Models\Subscriber as SubscriberModel;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Test\DataFactories\Newsletter;
use MailPoet\Test\DataFactories\Segment;
use MailPoet\Test\DataFactories\Subscriber;
class SendWelcomeEmailActionTest extends \MailPoetTest {
/** @var ScheduledTasksRepository */
private $scheduledTasksRepository;
public function _before() {
parent::_before();
$this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
}
// public function testSendingTaskQueuedForHappyPath() {
// $segment = (new Segment())->create();
// $subscriber = (new Subscriber())
// ->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
// ->withSegments([$segment])
// ->create();
//
// $run = new WorkflowRun(1, 'some-trigger', [
// 'mailpoet:subscriber' => $this->getSubscriberSubject($subscriber),
// 'mailpoet:segment' => $this->getSegmentSubject($segment),
// ]);
//
// $welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
// $step = new Step('step-id', Step::TYPE_ACTION, 'step-key', null, ['welcomeEmailId' => $welcomeEmail->getId()]);
// $workflow = new Workflow('some-workflow', [$step]);
//
// /** @var SendWelcomeEmailAction $action */
// $action = $this->diContainer->get(SendWelcomeEmailAction::class);
// $action->run($workflow, $run, $step);
// $scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
// expect($scheduled)->count(1);
// }
//
// public function testNoSendingTaskQueuedForGloballyUnconfirmedSubscriber() {
// $segment = (new Segment())->create();
// $subscriber = (new Subscriber())
// ->withStatus(SubscriberEntity::STATUS_UNCONFIRMED)
// ->withSegments([$segment])
// ->create();
//
// $run = new WorkflowRun(1, 'some-trigger', [
// 'mailpoet:subscriber' => $this->getSubscriberSubject($subscriber),
// 'mailpoet:segment' => $this->getSegmentSubject($segment),
// ]);
//
// $welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
// $step = new Step('step-id', Step::TYPE_ACTION, 'step-key', null, ['welcomeEmailId' => $welcomeEmail->getId()]);
// $workflow = new Workflow('some-workflow', [$step]);
//
// /** @var SendWelcomeEmailAction $action */
// $action = $this->diContainer->get(SendWelcomeEmailAction::class);
//
// try {
// $action->run($workflow, $run, $step);
// } catch (Exception $e) {
// // We don't care about the exception, just the outcome
// }
//
// $scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
// expect($scheduled)->count(0);
// }
//
// public function testNoSendingTaskQueuedIfSubscriberNoLongerSubscribedToSegment() {
// $segment = (new Segment())->create();
// $subscriber = (new Subscriber())
// ->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
// ->withSegments([$segment])
// ->create();
//
// $run = new WorkflowRun(1, 'some-trigger', [
// 'mailpoet:subscriber' => $this->getSubscriberSubject($subscriber),
// 'mailpoet:segment' => $this->getSegmentSubject($segment),
// ]);
//
// $welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
// $step = new Step('step-id', Step::TYPE_ACTION, 'step-key', null, ['welcomeEmailId' => $welcomeEmail->getId()]);
// $workflow = new Workflow('some-workflow', [$step]);
//
// /** @var SendWelcomeEmailAction $action */
// $action = $this->diContainer->get(SendWelcomeEmailAction::class);
//
// $subscriberModel = SubscriberModel::findOne($subscriber->getId());
// SubscriberSegment::unsubscribeFromSegments($subscriberModel, [$segment->getId()]);
//
// try {
// $action->run($workflow, $run, $step);
// } catch (Exception $e) {
// // We don't care about the exception, just the outcome
// }
//
// $scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
// expect($scheduled)->count(0);
// }
//
// public function testItDoesNotScheduleAnythingIfSubscriberHasBeenDeleted() {
// $segment = (new Segment())->create();
// $subscriber = (new Subscriber())
// ->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
// ->withSegments([$segment])
// ->create();
//
// $run = new WorkflowRun(1, 'some-trigger', [
// 'mailpoet:subscriber' => $this->getSubscriberSubject($subscriber),
// 'mailpoet:segment' => $this->getSegmentSubject($segment),
// ]);
//
// $welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
// $step = new Step('step-id', Step::TYPE_ACTION, 'step-key', null, ['welcomeEmailId' => $welcomeEmail->getId()]);
// $workflow = new Workflow('some-workflow', [$step]);
//
// /** @var SendWelcomeEmailAction $action */
// $action = $this->diContainer->get(SendWelcomeEmailAction::class);
//
// ContainerWrapper::getInstance()->get(SubscribersRepository::class)->bulkDelete([$subscriber->getId()]);
//
// try {
// $action->run($workflow, $run, $step);
// } catch (Exception $e) {
// // We don't care about the exception, just the outcome
// }
//
// $scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
// expect($scheduled)->count(0);
// }
public function testItDoesNotScheduleAnythingIfSegmentHasBeenDeleted() {
$segment = (new Segment())->create();
$subscriber = (new Subscriber())
->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
->withSegments([$segment])
->create();
$run = new WorkflowRun(1, 'some-trigger', [
'mailpoet:subscriber' => $this->getSubscriberSubject($subscriber),
'mailpoet:segment' => $this->getSegmentSubject($segment),
]);
$welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
$step = new Step('step-id', Step::TYPE_ACTION, 'step-key', null, ['welcomeEmailId' => $welcomeEmail->getId()]);
$workflow = new Workflow('some-workflow', [$step]);
/** @var SendWelcomeEmailAction $action */
$action = $this->diContainer->get(SendWelcomeEmailAction::class);
ContainerWrapper::getInstance()->get(SegmentsRepository::class)->bulkDelete([$segment->getId()]);
$result = $action->validate($workflow, $run, $step);
expect($result->getErrors())->count(1);
expect($result->getErrors()[0]->getMessage())->equals("Subscriber ID '1' is not subscribed to segment ID '1'.");
}
public function testHappyPath() {
$segment = (new Segment())->create();
$subscriber = (new Subscriber())
->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
->withSegments([$segment])
->create();
$welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
$result = new ActionValidationResult();
$result->setValidatedParam('welcomeEmail', $welcomeEmail);
$result->setValidatedParam('subscriberId', $subscriber->getId());
$action = $this->diContainer->get(SendWelcomeEmailAction::class);
$scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
expect($scheduled)->count(0);
$action->run($result);
$scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
expect($scheduled)->count(1);
}
public function testItDoesNotScheduleAgain() {
$segment = (new Segment())->create();
$subscriber = (new Subscriber())
->withStatus(SubscriberEntity::STATUS_SUBSCRIBED)
->withSegments([$segment])
->create();
$welcomeEmail = (new Newsletter())->withWelcomeTypeForSegment($segment->getId())->create();
$result = new ActionValidationResult();
$result->setValidatedParam('welcomeEmail', $welcomeEmail);
$result->setValidatedParam('subscriberId', $subscriber->getId());
$action = $this->diContainer->get(SendWelcomeEmailAction::class);
$scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
expect($scheduled)->count(0);
$action->run($result);
$scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
expect($scheduled)->count(1);
try {
$action->run($result);
} catch (Exception $exception) {
// We don't care about the exception, just the outcome
}
$scheduled = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($welcomeEmail, (int)$subscriber->getId());
expect($scheduled)->count(1);
}
private function getSubscriberSubject(SubscriberEntity $subscriber): SubscriberSubject {
$subscriberSubject = $this->diContainer->get(SubscriberSubject::class);
$subscriberSubject->load(['subscriber_id' => $subscriber->getId()]);
return $subscriberSubject;
}
private function getSegmentSubject(SegmentEntity $segment): SegmentSubject {
/** @var SegmentSubject $segmentSubject */
$segmentSubject = $this->diContainer->get(SegmentSubject::class);
$segmentSubject->load(['segment_id' => $segment->getId()]);
return $segmentSubject;
}
}