Make the segment work with ALL condition

[MAILPOET-3955]
This commit is contained in:
Pavel Dohnal
2021-12-02 12:24:06 +01:00
committed by Veljko V
parent d541edc865
commit c5d994dbf0
2 changed files with 29 additions and 4 deletions

View File

@@ -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);

View File

@@ -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);
}