Refactor segment test data factories to work with Doctrine

[MAILPOET-3177]
This commit is contained in:
Rostislav Wolny
2021-03-04 15:23:37 +01:00
committed by Veljko V
parent 9fdebdb4d7
commit f5df2601ef
14 changed files with 83 additions and 55 deletions

View File

@ -2,14 +2,22 @@
namespace MailPoet\Test\DataFactories;
use MailPoet\DynamicSegments\Mappers\FormDataMapper;
use MailPoet\DynamicSegments\Persistence\Saver;
use MailPoet\Models\DynamicSegment as DynamicSegmentModel;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Segments\DynamicSegments\SegmentSaveController;
class DynamicSegment extends Segment {
private $filterData = [];
/** @var SegmentSaveController */
protected $saveController;
public function __construct() {
parent::__construct();
$this->saveController = ContainerWrapper::getInstance()->get(SegmentSaveController::class);
}
public function withUserRoleFilter($role) {
$this->filterData['segmentType'] = 'userRole';
$this->filterData['wordpressRole'] = $role;
@ -30,21 +38,15 @@ class DynamicSegment extends Segment {
return $this;
}
/** @return DynamicSegmentModel */
public function create() {
$segment = DynamicSegmentModel::createOrUpdate($this->data);
if (!empty($this->filterData['segmentType'])) {
$segment = $this->createFilter($segment, $this->filterData);
public function create(): SegmentEntity {
if (empty($this->filterData['segmentType'])) {
$this->withUserRoleFilter('editor');
}
$segment = $this->saveController->save(array_merge($this->data, $this->filterData));
if (($this->data['deleted_at'] ?? null) instanceof \DateTimeInterface) {
$segment->setDeletedAt($this->data['deleted_at']);
$this->entityManager->flush();
}
return $segment;
}
private function createFilter(DynamicSegmentModel $segment, array $filterData) {
$data = array_merge($segment->asArray(), $filterData);
$mapper = new FormDataMapper();
$saver = new Saver();
$dynamicSegment = $mapper->mapDataToDB($data);
$saver->save($dynamicSegment);
return $dynamicSegment;
}
}

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\DataFactories;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Models\Form as FormModel;
use MailPoetVendor\Carbon\Carbon;
@ -92,13 +93,13 @@ class Form {
}
/**
* @param \MailPoet\Models\Segment[] $segments
* @param SegmentEntity[] $segments
* @return $this
*/
public function withSegments(array $segments) {
$ids = [];
foreach ($segments as $segment) {
$ids[] = $segment->id();
$ids[] = $segment->getId();
}
$this->data['settings']['segments'] = $ids;
return $this;

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\DataFactories;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Models\NewsletterSegment;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
@ -241,12 +242,12 @@ class Newsletter {
}
/**
* @param \MailPoet\Models\Segment[] $segments
* @param SegmentEntity[] $segments
* @return Newsletter
*/
public function withSegments(array $segments) {
foreach ($segments as $segment) {
$this->segments[] = $segment->id();
$this->segments[] = $segment->getId();
}
return $this;
}

View File

@ -2,13 +2,26 @@
namespace MailPoet\Test\DataFactories;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Segments\SegmentSaveController;
use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\ORM\EntityManager;
class Segment {
/** @var array */
protected $data;
/** @var EntityManager */
protected $entityManager;
/** @var SegmentSaveController */
protected $saveController;
public function __construct() {
$this->entityManager = ContainerWrapper::getInstance()->get(EntityManager::class);
$this->saveController = ContainerWrapper::getInstance()->get(SegmentSaveController::class);
$this->data = [
'name' => 'List ' . bin2hex(random_bytes(7)), // phpcs:ignore
];
@ -40,8 +53,12 @@ class Segment {
return $this;
}
/** @return \MailPoet\Models\Segment */
public function create() {
return \MailPoet\Models\Segment::createOrUpdate($this->data);
public function create(): SegmentEntity {
$segment = $this->saveController->save($this->data);
if (($this->data['deleted_at'] ?? null) instanceof \DateTimeInterface) {
$segment->setDeletedAt($this->data['deleted_at']);
$this->entityManager->flush();
}
return $segment;
}
}

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\DataFactories;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Models\SubscriberSegment;
class Subscriber {
@ -9,7 +10,7 @@ class Subscriber {
/** @var array */
private $data;
/** @var \MailPoet\Models\Segment[] */
/** @var SegmentEntity[] */
private $segments;
public function __construct() {
@ -66,7 +67,7 @@ class Subscriber {
}
/**
* @param \MailPoet\Models\Segment[] $segments
* @param SegmentEntity[] $segments
* @return $this
*/
public function withSegments(array $segments) {
@ -83,7 +84,7 @@ class Subscriber {
foreach ($this->segments as $segment) {
SubscriberSegment::createOrUpdate([
'subscriber_id' => $subscriber->id(),
'segment_id' => $segment->id(),
'segment_id' => $segment->getId(),
]);
}
return $subscriber;

View File

@ -40,7 +40,8 @@ class WooCommercePastRevenues {
// Create list
$segmentFactory = new Segment();
$subscribersList = $segmentFactory->withName('WC revenues load test')->create();
$subscribersListEntity = $segmentFactory->withName('WC revenues load test')->create();
$subscribersList = \MailPoet\Models\Segment::findOne($subscribersListEntity->getId());
// Create subscribers
$subscribersIds = [];

View File

@ -2,7 +2,9 @@
namespace MailPoet\Test\Acceptance;
use MailPoet\Models\Segment as SegmentModel;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Test\DataFactories\Newsletter;
use MailPoet\Test\DataFactories\Segment;
use MailPoet\Test\DataFactories\User;
@ -187,8 +189,8 @@ class ManageListsCest {
$listName = 'WordPress Users';
$subject = 'Blocking Post Notification';
$segment = SegmentModel::findOne(1);
assert($segment instanceof SegmentModel);
$segment = ContainerWrapper::getInstance()->get(SegmentsRepository::class)->findOneById(1);
assert($segment instanceof SegmentEntity);
$newsletterFactory = new Newsletter();
$newsletterFactory

View File

@ -39,11 +39,11 @@ class ManageSegmentsCest {
$i->amOnMailpoetPage('Lists');
$i->waitForElement('[data-automation-id="dynamic-segments-tab"]');
$i->click('[data-automation-id="dynamic-segments-tab"]');
$listingAutomationSelector = '[data-automation-id="listing_item_' . $segment->id . '"]';
$listingAutomationSelector = '[data-automation-id="listing_item_' . $segment->getId() . '"]';
$i->waitForText($segmentTitle, 10, $listingAutomationSelector);
$i->clickItemRowActionByItemName($segmentTitle, 'View Subscribers');
$i->seeInCurrentUrl('mailpoet-subscribers#');
$i->seeInCurrentUrl('segment=' . $segment->id);
$i->seeInCurrentUrl('segment=' . $segment->getId());
$i->waitForText($wpEditorEmail, 20);
$i->see($segmentTitle, ['css' => 'select[name=segment]']);
$i->dontSee($wpAdminEmail);
@ -143,7 +143,7 @@ class ManageSegmentsCest {
$i->wantTo('Empty trash from other (2) segments');
$i->click('[data-automation-id="empty_trash"]');
$i->waitForText('2 segments were permanently deleted.');
$listingAutomationSelector = '[data-automation-id="listing_item_' . $segment->id . '"]';
$listingAutomationSelector = '[data-automation-id="listing_item_' . $segment->getId() . '"]';
$i->dontSeeElement($listingAutomationSelector);
$i->seeInCurrentURL(urlencode('group[all]'));
$i->seeNoJSErrors();

View File

@ -33,8 +33,8 @@ class ReceiveWelcomeEmailCest {
$welcomeNewsletterName = 'Welcome Email Test';
$confirmationEmailName = 'Confirm your subscription';
$newsletterFactory = new Newsletter();
$newsletter = $newsletterFactory->withSubject($welcomeNewsletterName)
->withWelcomeTypeForSegment($subscribersList->id())
$newsletterFactory->withSubject($welcomeNewsletterName)
->withWelcomeTypeForSegment($subscribersList->getId())
->withActiveStatus()
->withSegments([$subscribersList])
->create();

View File

@ -11,7 +11,7 @@ class SettingsArchivePageCest {
$segmentFactory = new Segment();
$segment = $segmentFactory->withName('Empty Send')->create();
$pageTitle = 'EmptyNewsletterArchive';
$pageContent = "[mailpoet_archive segments=\"$segment->id\"]";
$pageContent = "[mailpoet_archive segments=\"{$segment->getId()}\"]";
$postUrl = $i->createPost($pageTitle, $pageContent);
$i->login();
$i->amOnUrl($postUrl);
@ -26,7 +26,7 @@ class SettingsArchivePageCest {
$newsletterFactory = new Newsletter();
$newsletterFactory->withSubject('SentNewsletter')->withSentStatus()->withSendingQueue()->withSegments([$segment2])->create();
$pageTitle2 = 'SentNewsletterArchive';
$pageContent2 = "[mailpoet_archive segments=\"$segment2->id\"]";
$pageContent2 = "[mailpoet_archive segments=\"{$segment2->getId()}\"]";
$postUrl = $i->createPost($pageTitle2, $pageContent2);
$i->login();
$i->amOnUrl($postUrl);
@ -43,7 +43,7 @@ class SettingsArchivePageCest {
$newsletterFactory->withSubject('DraftNewsletter')->withDraftStatus()->withScheduledQueue()->withSegments([$segment3])->create();
$newsletterFactory->withSubject('ScheduledNewsletter')->withScheduledStatus()->withScheduledQueue()->withSegments([$segment3])->create();
$pageTitle3 = 'SentNewsletterArchive';
$pageContent3 = "[mailpoet_archive segments=\"$segment3->id\"]";
$pageContent3 = "[mailpoet_archive segments=\"{$segment3->getId()}\"]";
$postUrl = $i->createPost($pageTitle3, $pageContent3);
$i->login();
$i->amOnUrl($postUrl);

View File

@ -22,7 +22,7 @@ class SubscriberCountShortcodeCest {
$subscriberFactory->withSegments([$segment])->create();
$pageTitle = 'Subscribers Shortcode Page';
$pageText = 'Your subscriber count is';
$pageContent = "$pageText [mailpoet_subscribers_count segments=\"$segment->id\"]";
$pageContent = "$pageText [mailpoet_subscribers_count segments=\"{$segment->getId()}\"]";
$i->cli(['post', 'create', '--post_type=page', '--post_status=publish', "--post_title=$pageTitle", "--post_content=$pageContent"]);
$i->login();
$i->amOnPage('/wp-admin/edit.php?post_type=page');

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\Acceptance;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Test\DataFactories\Segment;
use MailPoet\Test\DataFactories\Subscriber;
@ -11,7 +12,7 @@ class SubscriberManagementCest {
const INACTIVE_SUBSCRIBERS_COUNT = 4;
const INACTIVE_LIST_NAME = 'Inactivity';
/** @var \MailPoet\Models\Segment */
/** @var SegmentEntity */
private $segment;
public function _before() {
@ -69,7 +70,7 @@ class SubscriberManagementCest {
$i->fillField(['name' => 'email'], 'newglobaluser99@fakemail.fake');
$i->fillField(['name' => 'first_name'], 'New');
$i->fillField(['name' => 'last_name'], 'GlobalUser');
$i->selectOptionInSelect2($this->segment->get('name'));
$i->selectOptionInSelect2($this->segment->getName());
$i->click('[data-automation-id="subscriber_edit_form"] [type="submit"]');
$i->amOnMailPoetPage ('Subscribers');
$i->searchFor('newglobaluser99@fakemail.fake');

View File

@ -2,7 +2,7 @@
namespace MailPoet\Test\Acceptance;
use MailPoet\Models\DynamicSegment as SegmentModel;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Test\DataFactories\DynamicSegment;
use MailPoet\Test\DataFactories\Settings;
use MailPoet\Test\DataFactories\WooCommerceProduct;
@ -23,10 +23,10 @@ class WooCommerceDynamicSegmentsCest {
/** @var int */
private $productCategoryId;
/** @var SegmentModel */
/** @var SegmentEntity */
private $categorySegment;
/** @var SegmentModel */
/** @var SegmentEntity */
private $productSegment;
public function _before(\AcceptanceTester $i) {
@ -62,7 +62,7 @@ class WooCommerceDynamicSegmentsCest {
$i->amOnMailpoetPage('Lists');
$i->click('[data-automation-id="dynamic-segments-tab"]');
$i->waitForText(self::CATEGORY_SEGMENT);
$categorySegmentRow = "[data-automation-id='listing_item_{$this->categorySegment->id}']";
$categorySegmentRow = "[data-automation-id='listing_item_{$this->categorySegment->getId()}']";
$i->see('1', $categorySegmentRow . " [data-colname='Number of subscribers']");
$i->clickItemRowActionByItemName(self::CATEGORY_SEGMENT, 'View Subscribers');
$i->waitForText($customerEmail);
@ -71,7 +71,7 @@ class WooCommerceDynamicSegmentsCest {
$i->amOnMailpoetPage('Lists');
$i->click('[data-automation-id="dynamic-segments-tab"]');
$i->waitForText(self::PRODUCT_SEGMENT);
$productSegmentRow = "[data-automation-id='listing_item_{$this->productSegment->id}']";
$productSegmentRow = "[data-automation-id='listing_item_{$this->productSegment->getId()}']";
$i->see('1', $productSegmentRow . " [data-colname='Number of subscribers']");
$i->clickItemRowActionByItemName(self::PRODUCT_SEGMENT, 'View Subscribers');
$i->waitForText($customerEmail);
@ -88,7 +88,7 @@ class WooCommerceDynamicSegmentsCest {
$i->amOnMailpoetPage('Lists');
$i->click('[data-automation-id="dynamic-segments-tab"]');
$i->waitForText(self::CATEGORY_SEGMENT);
$categorySegmentRow = "[data-automation-id='listing_item_{$this->categorySegment->id}']";
$categorySegmentRow = "[data-automation-id='listing_item_{$this->categorySegment->getId()}']";
$i->see('1', $categorySegmentRow . " [data-colname='Number of subscribers']");
$i->clickItemRowActionByItemName(self::CATEGORY_SEGMENT, 'View Subscribers');
$i->waitForText($customerEmail);
@ -97,7 +97,7 @@ class WooCommerceDynamicSegmentsCest {
$i->amOnMailpoetPage('Lists');
$i->click('[data-automation-id="dynamic-segments-tab"]');
$i->waitForText(self::PRODUCT_SEGMENT);
$productSegmentRow = "[data-automation-id='listing_item_{$this->productSegment->id}']";
$productSegmentRow = "[data-automation-id='listing_item_{$this->productSegment->getId()}']";
$i->see('0', $productSegmentRow . " [data-colname='Number of subscribers']");
}
}

View File

@ -9,6 +9,7 @@ use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder;
use MailPoet\API\JSON\v1\Subscribers;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\CustomFieldEntity;
use MailPoet\Entities\DynamicSegmentFilterEntity;
use MailPoet\Entities\FormEntity;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterOptionEntity;
@ -331,21 +332,21 @@ class SubscribersTest extends \MailPoetTest {
expect($response->data[0]['email'])->equals($this->subscriber2->getEmail());
}
public function testItCanLoadDymanicSegments() {
public function testItCanLoadDynamicSegments() {
$dynamicSegmentFactory = new DynamicSegment();
$dynamicSegment = $dynamicSegmentFactory
->withName('Dynamic')
->withUserRoleFilter('editor')
->create();
$dynamicSegment->save();
$wpUserEmail = 'wpuserEditor@example.com';
$this->tester->deleteWordPressUser($wpUserEmail);
$this->tester->createWordPressUser($wpUserEmail, 'editor');
$response = $this->endpoint->listing([
'filter' => [
'segment' => $dynamicSegment->id,
'segment' => $dynamicSegment->getId(),
],
]);
expect($response->meta['filters']['segment'])->contains(['value' => $dynamicSegment->id, 'label' => 'Dynamic (1)']);
expect($response->meta['filters']['segment'])->contains(['value' => $dynamicSegment->getId(), 'label' => 'Dynamic (1)']);
$this->tester->deleteWordPressUser($wpUserEmail);
}
@ -911,6 +912,7 @@ class SubscribersTest extends \MailPoetTest {
$this->truncateEntity(NewsletterOptionEntity::class);
$this->truncateEntity(NewsletterOptionFieldEntity::class);
$this->truncateEntity(SegmentEntity::class);
$this->truncateEntity(DynamicSegmentFilterEntity::class);
$this->truncateEntity(SendingQueueEntity::class);
$this->truncateEntity(SubscriberEntity::class);
$this->truncateEntity(SubscriberSegmentEntity::class);