diff --git a/tests/acceptance/Segments/ManageSegmentsCest.php b/tests/acceptance/Segments/ManageSegmentsCest.php index 80105fddd1..674d3b53ed 100644 --- a/tests/acceptance/Segments/ManageSegmentsCest.php +++ b/tests/acceptance/Segments/ManageSegmentsCest.php @@ -582,23 +582,10 @@ class ManageSegmentsCest { $i->seeInField($totalSpentDaysElement, '20'); } - public function createAndEditDynamicSegmentWithMoreFilters(\AcceptanceTester $i) { - $wpEditorEmail = 'test-editor3' . rand(1, 100000) . '@example.com'; - $wpEditorEmail2 = 'test-editor4-' . rand(1, 100000) . '@example.com'; - $wpAuthorEmail = 'test-author2-' . rand(1, 100000) . '@example.com'; - - $userFactory = new User(); - $userFactory->createUser('Test Editor 3', 'editor', $wpEditorEmail); - $userFactory->createUser('Test Editor 4', 'editor', $wpEditorEmail2); - $userFactory->createUser('Test Author 2', 'author', $wpAuthorEmail); - - $i->activateWooCommerce(); + public function tryCreatingDynamicSegmentWithMoreFilters(\AcceptanceTester $i) { $filterRowOne = '[data-automation-id="filter-row-0"]'; - $filterRowTwo = '[data-automation-id="filter-row-1"]'; $actionSelectElement = '[data-automation-id="select-segment-action"]'; $roleSelectElement = '[data-automation-id="segment-wordpress-role"]'; - $conditionOrElement = '[data-automation-id="dynamic-segment-condition-type-or"]'; - $deleteElement = '[data-automation-id="delete-filter-row"]'; $i->wantTo('Create a new Dynamic Segment with 2 Filters'); $segmentTitle = 'Segment Two Filters'; @@ -611,48 +598,7 @@ class ManageSegmentsCest { $i->selectOptionInReactSelect('WordPress user role', "{$filterRowOne} {$actionSelectElement}"); $i->selectOptionInReactSelect('Admin', "{$filterRowOne} {$roleSelectElement}"); $i->click('Add a condition'); - $i->selectOptionInReactSelect('WordPress user role', "{$filterRowTwo} {$actionSelectElement}"); - $i->selectOptionInReactSelect('Editor', "{$filterRowTwo} {$roleSelectElement}"); - $i->click($conditionOrElement); - $i->waitForText('This segment has 3 subscribers.'); - $i->click('Save'); - $i->waitForElement('[data-automation-id="dynamic-segments-tab"]'); - $i->seeNoJSErrors(); - - $i->wantTo('Open edit form and check that all values were saved correctly'); - $i->waitForText($segmentTitle); - $i->clickItemRowActionByItemName($segmentTitle, 'Edit'); - $i->waitForElement($actionSelectElement); - $i->fillField(['name' => 'name'], $segmentTitle); - $i->fillField(['name' => 'description'], $segmentDesc); - $i->see('WordPress user role', "{$filterRowOne} {$actionSelectElement}"); - $i->waitForText('Admin', 10, "{$filterRowOne} {$roleSelectElement}"); - $i->see('Admin', "{$filterRowOne} {$roleSelectElement}"); - $i->see('WordPress user role', "{$filterRowTwo} {$actionSelectElement}"); - $i->see('Editor', "{$filterRowTwo} {$roleSelectElement}"); - $i->seeNoJSErrors(); - - $i->wantTo('Edit segment and save'); - $editedTitle = 'Segment Two Filters Edited'; - $editedDesc = 'Segment description Edited'; - $i->fillField(['name' => 'name'], $editedTitle); - $i->fillField(['name' => 'description'], $editedDesc); - $i->click("{$filterRowOne} {$deleteElement}"); - $i->selectOptionInReactSelect('clicked any email', "{$filterRowOne} {$actionSelectElement}"); - $i->dontSeeElement($filterRowTwo); - $i->dontSeeElement($conditionOrElement); - $i->waitForText('This segment has 0 subscribers.'); - $i->click('Save'); - $i->waitForElement('[data-automation-id="dynamic-segments-tab"]'); - $i->waitForText($segmentTitle); - $i->seeNoJSErrors(); - - $i->wantTo('Open edit form and check that all values were saved correctly'); - $i->clickItemRowActionByItemName($editedTitle, 'Edit'); - $i->waitForText('This segment has 0 subscribers.'); - $i->seeInField(['name' => 'name'], $editedTitle); - $i->seeInField(['name' => 'description'], $editedDesc); - $i->see('clicked any email', "{$filterRowOne} {$actionSelectElement}"); + $i->see('This is a Premium feature'); $i->seeNoJSErrors(); } } diff --git a/tests/integration/API/JSON/v1/DynamicSegmentsTest.php b/tests/integration/API/JSON/v1/DynamicSegmentsTest.php index 88d2c4c2cd..1199331746 100644 --- a/tests/integration/API/JSON/v1/DynamicSegmentsTest.php +++ b/tests/integration/API/JSON/v1/DynamicSegmentsTest.php @@ -94,30 +94,6 @@ class DynamicSegmentsTest extends \MailPoetTest { expect($response->errors[0]['message'])->equals('Please specify a name.'); } - public function testSaverSavesMultipleFilters() { - $response = $this->endpoint->save([ - 'name' => 'Test dynamic', - 'description' => 'description dynamic', - 'filters_connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, - 'filters' => [ - [ - 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => 'editor', - 'action' => UserRole::TYPE, - ], - [ - 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => 'administrator', - 'action' => UserRole::TYPE, - ], - ], - ]); - expect($response)->isInstanceOf('\MailPoet\API\JSON\SuccessResponse'); - expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); - expect($response->data['name'])->equals('Test dynamic'); - expect($response->data['filters'])->count(2); - } - public function testItCanTrashASegment() { $dynamicSegment = $this->createDynamicSegmentEntity('Trash test', 'description'); diff --git a/tests/integration/Segments/DynamicSegments/FilterHandlerTest.php b/tests/integration/Segments/DynamicSegments/FilterHandlerTest.php index 1949eb7a3a..f35e73e801 100644 --- a/tests/integration/Segments/DynamicSegments/FilterHandlerTest.php +++ b/tests/integration/Segments/DynamicSegments/FilterHandlerTest.php @@ -10,11 +10,8 @@ use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\SubscriberEntity; -use MailPoet\Segments\DynamicSegments\Filters\EmailAction; -use MailPoet\Segments\DynamicSegments\Filters\SubscriberSubscribedDate; use MailPoet\Segments\DynamicSegments\Filters\UserRole; use MailPoet\Subscribers\SubscribersRepository; -use MailPoet\WP\Functions; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\DBAL\Driver\Statement; @@ -70,92 +67,6 @@ class FilterHandlerTest extends \MailPoetTest { expect($subscriber2->getEmail())->equals('user-role-test3@example.com'); } - public function testItAppliesTwoFiltersWithoutSpecifyingConnection() { - $wp = $this->diContainer->get(Functions::class); - $segment = $this->getSegment('editor'); - $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, SubscriberSubscribedDate::TYPE, [ - 'operator' => SubscriberSubscribedDate::IN_THE_LAST, - 'value' => 30, - ]); - $dynamicSegmentFilter = new DynamicSegmentFilterEntity($segment, $filterData); - $this->entityManager->persist($dynamicSegmentFilter); - $segment->addDynamicFilter($dynamicSegmentFilter); - $this->entityManager->flush(); - $statement = $this->filterHandler->apply($this->getQueryBuilder(), $segment)->execute(); - assert($statement instanceof Statement); - $result = $statement->fetchAll(); - expect($result)->count(2); - } - - public function testItAppliesTwoFiltersWithOr() { - $segment = new SegmentEntity('Dynamic Segment', SegmentEntity::TYPE_DYNAMIC, 'description'); - $this->entityManager->persist($segment); - $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, UserRole::TYPE, [ - 'wordpressRole' => 'administrator', - 'connect' => 'or', - ]); - $dynamicSegmentFilter = new DynamicSegmentFilterEntity($segment, $filterData); - $this->entityManager->persist($dynamicSegmentFilter); - $segment->addDynamicFilter($dynamicSegmentFilter); - $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, UserRole::TYPE, [ - 'wordpressRole' => 'editor', - 'connect' => 'or', - ]); - $dynamicSegmentFilter = new DynamicSegmentFilterEntity($segment, $filterData); - $this->entityManager->persist($dynamicSegmentFilter); - $segment->addDynamicFilter($dynamicSegmentFilter); - $this->entityManager->flush(); - $statement = $this->filterHandler->apply($this->getQueryBuilder(), $segment)->execute(); - assert($statement instanceof Statement); - $result = $statement->fetchAll(); - expect($result)->count(3); - } - - public function testItAppliesTwoFiltersWithAnd() { - $segment = new SegmentEntity('Dynamic Segment', SegmentEntity::TYPE_DYNAMIC, 'description'); - $this->entityManager->persist($segment); - // filter user is an editor - $editorData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, UserRole::TYPE, [ - 'wordpressRole' => 'editor', - 'connect' => 'and', - ]); - $filterEditor = new DynamicSegmentFilterEntity($segment, $editorData); - $this->entityManager->persist($filterEditor); - $segment->addDynamicFilter($filterEditor); - // filter user opened an email - $newsletter = new NewsletterEntity(); - $task = new ScheduledTaskEntity(); - $this->entityManager->persist($task); - $queue = new SendingQueueEntity(); - $queue->setNewsletter($newsletter); - $queue->setTask($task); - $this->entityManager->persist($queue); - $newsletter->getQueues()->add($queue); - $newsletter->setSubject('newsletter 1'); - $newsletter->setStatus('sent'); - $newsletter->setType(NewsletterEntity::TYPE_STANDARD); - $this->entityManager->persist($newsletter); - $open = new StatisticsOpenEntity($newsletter, $queue, $this->subscriber1); - $this->entityManager->persist($open); - $open = new StatisticsOpenEntity($newsletter, $queue, $this->subscriber2); - $this->entityManager->persist($open); - $this->entityManager->flush(); - - $openedData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_EMAIL, EmailAction::ACTION_OPENED, [ - 'newsletter_id' => $newsletter->getId(), - 'connect' => 'and', - ]); - $filterOpened = new DynamicSegmentFilterEntity($segment, $openedData); - $this->entityManager->persist($filterOpened); - $segment->addDynamicFilter($filterOpened); - $this->entityManager->flush(); - - $statement = $this->filterHandler->apply($this->getQueryBuilder(), $segment)->execute(); - assert($statement instanceof Statement); - $result = $statement->fetchAll(); - expect($result)->count(1); - } - private function getSegment(string $role): SegmentEntity { $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, UserRole::TYPE, [ 'wordpressRole' => $role, diff --git a/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php b/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php index 41e5b7932b..48395bb826 100644 --- a/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php +++ b/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php @@ -46,50 +46,6 @@ class SegmentSaveControllerTest extends \MailPoetTest { ]); } - public function testItCanSaveASegmentWithTwoFilters() { - $segmentData = [ - 'name' => 'Test Segment', - 'description' => 'Description', - 'filters_connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, - 'filters' => [ - [ - 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => ['administrator'], - 'action' => UserRole::TYPE, - ], - [ - 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => ['editor'], - 'action' => UserRole::TYPE, - ], - ], - ]; - - $segment = $this->saveController->save($segmentData); - expect($segment->getName())->equals('Test Segment'); - expect($segment->getDescription())->equals('Description'); - expect($segment->getDynamicFilters()->count())->equals(2); - expect($segment->getType())->equals(SegmentEntity::TYPE_DYNAMIC); - $filter = $segment->getDynamicFilters()->first(); - assert($filter instanceof DynamicSegmentFilterEntity); - expect($filter->getFilterData()->getFilterType())->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); - expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); - expect($filter->getFilterData()->getData())->equals([ - 'wordpressRole' => ['administrator'], - 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, - 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, - ]); - $filter = $segment->getDynamicFilters()->next(); - assert($filter instanceof DynamicSegmentFilterEntity); - expect($filter->getFilterData()->getFilterType())->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); - expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); - expect($filter->getFilterData()->getData())->equals([ - 'wordpressRole' => ['editor'], - 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, - 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, - ]); - } - public function testItCanRemoveRedundantFilter() { $segment = $this->createSegment('Test Segment'); $this->addDynamicFilter($segment, ['editor']); diff --git a/tests/integration/Segments/SegmentDependencyValidatorTest.php b/tests/integration/Segments/SegmentDependencyValidatorTest.php index b45570eda0..96a9f80aa4 100644 --- a/tests/integration/Segments/SegmentDependencyValidatorTest.php +++ b/tests/integration/Segments/SegmentDependencyValidatorTest.php @@ -6,6 +6,7 @@ use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\SegmentEntity; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory; +use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoet\WP\Functions as WPFunctions; class SegmentDependencyValidatorTest extends \MailPoetTest { @@ -44,11 +45,19 @@ class SegmentDependencyValidatorTest extends \MailPoetTest { return $segment; } - private function createValidator(bool $isPluginActive): SegmentDependencyValidator { + private function createValidator( + bool $isPluginActive, + bool $hasValidPremiumKey = true, + bool $subscribersLimitReached = false + ): SegmentDependencyValidator { $wp = $this->make(WPFunctions::class, [ 'isPluginActive' => $isPluginActive, ]); - return new SegmentDependencyValidator($wp); + $subscribersFeature = $this->make(SubscribersFeature::class, [ + 'hasValidPremiumKey' => $hasValidPremiumKey, + 'check' => $subscribersLimitReached, + ]); + return new SegmentDependencyValidator($subscribersFeature, $wp); } private function cleanup(): void { diff --git a/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php b/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php index ab3d82ae63..b07370df56 100644 --- a/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php +++ b/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php @@ -13,6 +13,7 @@ use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCountry; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceNumberOfOrders; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceSubscription; +use MailPoet\WP\Functions as WPFunctions; class FilterDataMapperTest extends \MailPoetUnitTest { /** @var FilterDataMapper */ @@ -20,7 +21,10 @@ class FilterDataMapperTest extends \MailPoetUnitTest { public function _before() { parent::_before(); - $this->mapper = new FilterDataMapper(); + $wp = $this->makeEmpty(WPFunctions::class, [ + 'hasFilter' => false, + ]); + $this->mapper = new FilterDataMapper($wp); } public function testItChecksFiltersArePresent() {