diff --git a/lib/DynamicSegments/Persistence/Loading/SubscribersIds.php b/lib/DynamicSegments/Persistence/Loading/SubscribersIds.php index e43967d0ad..7b4e567f53 100644 --- a/lib/DynamicSegments/Persistence/Loading/SubscribersIds.php +++ b/lib/DynamicSegments/Persistence/Loading/SubscribersIds.php @@ -2,11 +2,23 @@ namespace MailPoet\DynamicSegments\Persistence\Loading; +use MailPoet\DynamicSegments\RequirementsChecker; use MailPoet\Models\DynamicSegment; use MailPoet\Models\Subscriber; +use MailPoet\WooCommerce\Helper as WooCommerceHelper; class SubscribersIds { + /** @var RequirementsChecker */ + private $requirements_checker; + + function __construct(RequirementsChecker $requirements_checker = null) { + if (!$requirements_checker) { + $requirements_checker = new RequirementsChecker(new WooCommerceHelper()); + } + $this->requirements_checker = $requirements_checker; + } + /** * Finds subscribers in a dynamic segment and returns their ids. * @@ -17,6 +29,9 @@ class SubscribersIds { */ function load(DynamicSegment $dynamic_segment, $limit_to_subscribers_ids = null) { $orm = Subscriber::selectExpr(Subscriber::$_table . '.id'); + if ($this->requirements_checker->shouldSkipSegment($dynamic_segment)) { + return []; + } foreach ($dynamic_segment->getFilters() as $filter) { $orm = $filter->toSql($orm); } diff --git a/tests/integration/DynamicSegments/Persistence/Loading/SubscribersIdsTest.php b/tests/integration/DynamicSegments/Persistence/Loading/SubscribersIdsTest.php index 572515d2d2..41b0276528 100644 --- a/tests/integration/DynamicSegments/Persistence/Loading/SubscribersIdsTest.php +++ b/tests/integration/DynamicSegments/Persistence/Loading/SubscribersIdsTest.php @@ -5,6 +5,7 @@ namespace MailPoet\DynamicSegments\Persistence\Loading; require_once(ABSPATH . 'wp-admin/includes/user.php'); use MailPoet\DynamicSegments\Filters\UserRole; +use MailPoet\DynamicSegments\RequirementsChecker; use MailPoet\Models\DynamicSegment; use MailPoet\Models\Subscriber; @@ -12,6 +13,9 @@ class SubscribersIdsTest extends \MailPoetTest { private $editors_wp_ids = []; + /** @var RequirementsChecker|\PHPUnit_Framework_MockObject_MockObject */ + private $requirement_checker; + function _before() { $this->cleanData(); $this->editors_wp_ids[] = wp_insert_user([ @@ -32,16 +36,21 @@ class SubscribersIdsTest extends \MailPoetTest { 'role' => 'editor', 'user_pass' => '12123154', ]); + $this->requirement_checker = $this + ->getMockBuilder(RequirementsChecker::class) + ->setMethods(['shouldSkipSegment']) + ->getMock(); } function testItConstructsSubscribersIdQueryForAnyDynamicSegment() { + $this->requirement_checker->method('shouldSkipSegment')->willReturn(false); $userRole = DynamicSegment::create(); $userRole->hydrate([ 'name' => 'segment', 'description' => 'description', ]); $userRole->setFilters([new UserRole('editor', 'and')]); - $loader = new SubscribersIds(); + $loader = new SubscribersIds($this->requirement_checker); $result = $loader->load($userRole); $wp_ids = [ Subscriber::findOne($result[0]->id)->wp_user_id, @@ -50,6 +59,19 @@ class SubscribersIdsTest extends \MailPoetTest { $this->assertEquals($wp_ids, $this->editors_wp_ids, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = true); } + function testItSkipsConstructingSubscribersIdQueryForAnyDynamicSegmentIfRequirementsNotMet() { + $this->requirement_checker->method('shouldSkipSegment')->willReturn(true); + $userRole = DynamicSegment::create(); + $userRole->hydrate([ + 'name' => 'segment', + 'description' => 'description', + ]); + $userRole->setFilters([new UserRole('editor', 'and')]); + $loader = new SubscribersIds($this->requirement_checker); + $result = $loader->load($userRole); + expect($result)->isEmpty(); + } + function _after() { $this->cleanData(); }