From c5d994dbf0eb02ee924af09b69b06881f515e3b5 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 2 Dec 2021 12:24:06 +0100 Subject: [PATCH] Make the segment work with ALL condition [MAILPOET-3955] --- .../DynamicSegments/Filters/UserRole.php | 3 +- .../DynamicSegments/Filters/UserRoleTest.php | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/Segments/DynamicSegments/Filters/UserRole.php b/lib/Segments/DynamicSegments/Filters/UserRole.php index b982143abc..60b69fe9eb 100644 --- a/lib/Segments/DynamicSegments/Filters/UserRole.php +++ b/lib/Segments/DynamicSegments/Filters/UserRole.php @@ -50,7 +50,6 @@ class UserRole implements Filter { return $qb; } - /** * @param string[] $roles * @param string $operator @@ -66,7 +65,7 @@ class UserRole implements Filter { $sqlParts[] = '(wpusermeta.meta_value LIKE :role' . $key . $parameterSuffix . ')'; } } - if ($operator === DynamicSegmentFilterData::OPERATOR_NONE) { + if (($operator === DynamicSegmentFilterData::OPERATOR_NONE) || ($operator === DynamicSegmentFilterData::OPERATOR_ALL)) { return join(' AND ', $sqlParts); } return join(' OR ', $sqlParts); diff --git a/tests/integration/Segments/DynamicSegments/Filters/UserRoleTest.php b/tests/integration/Segments/DynamicSegments/Filters/UserRoleTest.php index 942e7a39a3..4c1b28d89a 100644 --- a/tests/integration/Segments/DynamicSegments/Filters/UserRoleTest.php +++ b/tests/integration/Segments/DynamicSegments/Filters/UserRoleTest.php @@ -12,6 +12,7 @@ class UserRoleTest extends \MailPoetTest { private $userRole; public function _before() { + global $wpdb; $this->userRole = $this->diContainer->get(UserRole::class); $this->cleanup(); // Insert WP users and subscribers are created automatically @@ -19,6 +20,14 @@ class UserRoleTest extends \MailPoetTest { $this->tester->createWordPressUser('user-role-test2@example.com', 'administrator'); $this->tester->createWordPressUser('user-role-test3@example.com', 'editor'); $this->tester->createWordPressUser('user-role-test4@example.com', 'author'); + $userId = $this->tester->createWordPressUser('user-role-test5@example.com', 'subscriber'); + // some plugins allow setting 2 different roles for a single user, lets emulate that behaviour: + $this->connection->executeStatement( + 'UPDATE ' . $wpdb->usermeta + . " SET meta_value='" . serialize(['subscriber' => true, 'merchant' => true]) . "'" + . " WHERE meta_key='{$wpdb->prefix}capabilities' AND user_id = " . $userId + ); + $this->tester->createWordPressUser('user-role-test6@example.com', 'subscriber'); } public function testItAppliesFilter() { @@ -51,7 +60,7 @@ class UserRoleTest extends \MailPoetTest { } public function testItAppliesFilterNone() { - $segmentFilter = $this->getSegmentFilter(['administrator', 'author'], DynamicSegmentFilterData::OPERATOR_NONE); + $segmentFilter = $this->getSegmentFilter(['administrator', 'author', 'subscriber'], DynamicSegmentFilterData::OPERATOR_NONE); $queryBuilder = $this->userRole->apply($this->getQueryBuilder(), $segmentFilter); $result = $queryBuilder->execute()->fetchAll(); expect(count($result))->equals(2); @@ -63,6 +72,16 @@ class UserRoleTest extends \MailPoetTest { expect($subscriber2->getEmail())->equals('user-role-test3@example.com'); } + public function testItAppliesFilterAll() { + $segmentFilter = $this->getSegmentFilter(['subscriber', 'merchant'], DynamicSegmentFilterData::OPERATOR_ALL); + $queryBuilder = $this->userRole->apply($this->getQueryBuilder(), $segmentFilter); + $result = $queryBuilder->execute()->fetchAll(); + expect(count($result))->equals(1); + $subscriber1 = $this->entityManager->find(SubscriberEntity::class, $result[0]['id']); + $this->assertInstanceOf(SubscriberEntity::class, $subscriber1); + expect($subscriber1->getEmail())->equals('user-role-test5@example.com'); + } + public function testItDoesntGetSubString() { $segmentFilter = $this->getSegmentFilter('edit'); $queryBuilder = $this->userRole->apply($this->getQueryBuilder(), $segmentFilter); @@ -112,7 +131,14 @@ class UserRoleTest extends \MailPoetTest { } private function cleanWpUsers() { - $emails = ['user-role-test1@example.com', 'user-role-test2@example.com', 'user-role-test3@example.com', 'user-role-test4@example.com']; + $emails = [ + 'user-role-test1@example.com', + 'user-role-test2@example.com', + 'user-role-test3@example.com', + 'user-role-test4@example.com', + 'user-role-test5@example.com', + 'user-role-test6@example.com', + ]; foreach ($emails as $email) { $this->tester->deleteWordPressUser($email); }