diff --git a/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php b/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php index 8145ec30e5..573ed06dd5 100644 --- a/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php +++ b/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php @@ -51,6 +51,10 @@ class DynamicSegmentsResponseBuilder { $filter['id'] = $dynamicFilter->getId(); $filter['segmentType'] = $dynamicFilter->getFilterData()->getFilterType(); // We need to add filterType with key segmentType due to BC $filter['action'] = $dynamicFilter->getFilterData()->getAction(); + if (isset($filter['wordpressRole']) && !is_array($filter['wordpressRole'])) { + // new filters are always array, they support multiple values, the old didn't convert old filters to new format + $filter['wordpressRole'] = [$filter['wordpressRole']]; + } $filters[] = $filter; } $data['filters'] = $filters; diff --git a/lib/Segments/DynamicSegments/Filters/UserRole.php b/lib/Segments/DynamicSegments/Filters/UserRole.php index 60b69fe9eb..0d0e32193a 100644 --- a/lib/Segments/DynamicSegments/Filters/UserRole.php +++ b/lib/Segments/DynamicSegments/Filters/UserRole.php @@ -39,7 +39,7 @@ class UserRole implements Filter { } $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); - $parameterSuffix = (string)$filter->getId() ?? Security::generateRandomString(); + $parameterSuffix = ((string)$filter->getId()) . Security::generateRandomString(); $condition = $this->createCondition($role, $operator, $parameterSuffix); $qb = $queryBuilder->join($subscribersTable, $wpdb->users, 'wpusers', "$subscribersTable.wp_user_id = wpusers.id") ->join('wpusers', $wpdb->usermeta, 'wpusermeta', 'wpusers.id = wpusermeta.user_id') diff --git a/tests/acceptance/Segments/ManageSegmentsCest.php b/tests/acceptance/Segments/ManageSegmentsCest.php index 3e6686d268..612bf5a0ca 100644 --- a/tests/acceptance/Segments/ManageSegmentsCest.php +++ b/tests/acceptance/Segments/ManageSegmentsCest.php @@ -619,6 +619,7 @@ class ManageSegmentsCest { $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}"); diff --git a/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php b/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php index 46725fe40b..62f54304b8 100644 --- a/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php +++ b/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php @@ -37,7 +37,7 @@ class DynamicSegmentsResponseBuilderTest extends \MailPoetTest { expect($response['filters'])->array(); expect($response['filters'])->count(1); expect($response['filters'][0]['segmentType'])->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); - expect($response['filters'][0]['wordpressRole'])->equals('editor'); + expect($response['filters'][0]['wordpressRole'])->equals(['editor']); expect($response['filters'][0]['action'])->equals(UserRole::TYPE); } @@ -64,11 +64,11 @@ class DynamicSegmentsResponseBuilderTest extends \MailPoetTest { expect($response['filters'])->array(); expect($response['filters'])->count(2); expect($response['filters'][0]['segmentType'])->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); - expect($response['filters'][0]['wordpressRole'])->equals('editor'); + expect($response['filters'][0]['wordpressRole'])->equals(['editor']); expect($response['filters'][0]['action'])->equals(UserRole::TYPE); expect($response['filters'][0]['connect'])->equals(DynamicSegmentFilterData::CONNECT_TYPE_AND); expect($response['filters'][1]['segmentType'])->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); - expect($response['filters'][1]['wordpressRole'])->equals('administrator'); + expect($response['filters'][1]['wordpressRole'])->equals(['administrator']); expect($response['filters'][1]['action'])->equals(UserRole::TYPE); expect($response['filters'][1]['connect'])->equals(DynamicSegmentFilterData::CONNECT_TYPE_AND); } diff --git a/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php b/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php index ea2bbae5a4..8473e0c2d9 100644 --- a/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php +++ b/tests/integration/Segments/DynamicSegments/SegmentSaveControllerTest.php @@ -40,6 +40,7 @@ class SegmentSaveControllerTest extends \MailPoetTest { expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); expect($filter->getFilterData()->getData())->equals([ 'wordpressRole' => 'editor', + 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_AND, ]); } @@ -52,12 +53,12 @@ class SegmentSaveControllerTest extends \MailPoetTest { 'filters' => [ [ 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => 'administrator', + 'wordpressRole' => ['administrator'], 'action' => UserRole::TYPE, ], [ 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => 'editor', + 'wordpressRole' => ['editor'], 'action' => UserRole::TYPE, ], ], @@ -73,7 +74,8 @@ class SegmentSaveControllerTest extends \MailPoetTest { expect($filter->getFilterData()->getFilterType())->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); expect($filter->getFilterData()->getData())->equals([ - 'wordpressRole' => 'administrator', + 'wordpressRole' => ['administrator'], + 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, ]); $filter = $segment->getDynamicFilters()->next(); @@ -81,15 +83,16 @@ class SegmentSaveControllerTest extends \MailPoetTest { expect($filter->getFilterData()->getFilterType())->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); expect($filter->getFilterData()->getData())->equals([ - 'wordpressRole' => 'editor', + 'wordpressRole' => ['editor'], + 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, ]); } public function testItCanRemoveRedundantFilter() { $segment = $this->createSegment('Test Segment'); - $this->addDynamicFilter($segment, 'editor'); - $this->addDynamicFilter($segment, 'administrator'); + $this->addDynamicFilter($segment, ['editor']); + $this->addDynamicFilter($segment, ['administrator']); $segmentData = [ 'id' => $segment->getId(), 'name' => 'Test Segment Edited', @@ -97,8 +100,9 @@ class SegmentSaveControllerTest extends \MailPoetTest { 'filters_connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, 'filters' => [[ 'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE, - 'wordpressRole' => 'subscriber', + 'wordpressRole' => ['subscriber'], 'action' => UserRole::TYPE, + 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, ]], ]; @@ -113,7 +117,8 @@ class SegmentSaveControllerTest extends \MailPoetTest { expect($filter->getFilterData()->getFilterType())->equals(DynamicSegmentFilterData::TYPE_USER_ROLE); expect($filter->getFilterData()->getAction())->equals(UserRole::TYPE); expect($filter->getFilterData()->getData())->equals([ - 'wordpressRole' => 'subscriber', + 'wordpressRole' => ['subscriber'], + 'operator' => DynamicSegmentFilterData::OPERATOR_ANY, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_OR, ]); } @@ -158,7 +163,7 @@ class SegmentSaveControllerTest extends \MailPoetTest { return $segment; } - private function addDynamicFilter(SegmentEntity $segment, string $wordpressRole): DynamicSegmentFilterEntity { + private function addDynamicFilter(SegmentEntity $segment, array $wordpressRole): DynamicSegmentFilterEntity { $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, UserRole::TYPE, [ 'wordpressRole' => $wordpressRole, 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_AND,