Refactor mailpoet_get_subscribers_in_segment_finders hook to direct calls

[MAILPOET-3077]
This commit is contained in:
Rostislav Wolny
2020-09-14 14:00:52 +02:00
committed by Veljko V
parent 331e40a137
commit dd7390ec73
4 changed files with 31 additions and 61 deletions

View File

@@ -132,8 +132,12 @@ class ContainerConfigurator implements IContainerConfigurator {
// Dynamic segments
$container->autowire(\MailPoet\DynamicSegments\DynamicSegmentHooks::class);
$container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\AddToNewslettersSegments::class);
$container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder::class)->setPublic(true);
$container->autowire(\MailPoet\DynamicSegments\Mappers\DBMapper::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\Loader::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SubscribersIds::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader::class);
// Cron
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);

View File

@@ -3,14 +3,12 @@
namespace MailPoet\DynamicSegments;
use MailPoet\DynamicSegments\FreePluginConnectors\AddToSubscribersFilters;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersBulkActionHandler;
use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersListingsHandlerFactory;
use MailPoet\DynamicSegments\Mappers\DBMapper;
use MailPoet\DynamicSegments\Persistence\Loading\Loader;
use MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader;
use MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount;
use MailPoet\DynamicSegments\Persistence\Loading\SubscribersIds;
use MailPoet\WP\Functions as WPFunctions;
class DynamicSegmentHooks {
@@ -22,11 +20,6 @@ class DynamicSegmentHooks {
}
public function init() {
$this->wp->addAction(
'mailpoet_get_subscribers_in_segment_finders',
[$this, 'getSubscribersInSegmentsFinders']
);
$this->wp->addAction(
'mailpoet_get_subscribers_listings_in_segment_handlers',
[$this, 'getSubscribersListingsInSegmentsHandlers']
@@ -48,11 +41,6 @@ class DynamicSegmentHooks {
);
}
public function getSubscribersInSegmentsFinders(array $finders) {
$finders[] = new SendingNewslettersSubscribersFinder(new SingleSegmentLoader(new DBMapper()), new SubscribersIds());
return $finders;
}
public function getSubscribersListingsInSegmentsHandlers(array $handlers) {
$handlers[] = new SubscribersListingsHandlerFactory();
return $handlers;

View File

@@ -2,25 +2,28 @@
namespace MailPoet\Segments;
use MailPoet\DI\ContainerWrapper;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM;
use function MailPoetVendor\array_column;
class SubscribersFinder {
/** @var WPFunctions */
private $wp;
/** @var SendingNewslettersSubscribersFinder */
private $dynamicSegmentSubscriberFinder;
public function __construct(WPFunctions $wp = null) {
if (!$wp) {
$wp = new WPFunctions;
public function __construct(
SendingNewslettersSubscribersFinder $dynamicSegmentSubscriberFinder = null
) {
if ($dynamicSegmentSubscriberFinder === null) {
$dynamicSegmentSubscriberFinder = ContainerWrapper::getInstance()->get(SendingNewslettersSubscribersFinder::class);
}
$this->wp = $wp;
$this->dynamicSegmentSubscriberFinder = $dynamicSegmentSubscriberFinder;
}
public function findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds) {
@@ -40,13 +43,10 @@ class SubscribersFinder {
$subscribers = Subscriber::findSubscribersInSegments($subscribersToProcessIds, [$segment->id])->findMany();
return Subscriber::extractSubscribersIds($subscribers);
}
$finders = $this->wp->applyFilters('mailpoet_get_subscribers_in_segment_finders', []);
foreach ($finders as $finder) {
$subscribers = $finder->findSubscribersInSegment($segment, $subscribersToProcessIds);
$subscribers = $this->dynamicSegmentSubscriberFinder->findSubscribersInSegment($segment, $subscribersToProcessIds);
if ($subscribers) {
return Subscriber::extractSubscribersIds($subscribers);
}
}
return [];
}
@@ -108,14 +108,11 @@ class SubscribersFinder {
}
private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, Segment $segment) {
$finders = $this->wp->applyFilters('mailpoet_get_subscribers_in_segment_finders', []);
$count = 0;
foreach ($finders as $finder) {
$subscribers = $finder->getSubscriberIdsInSegment($segment);
$subscribers = $this->dynamicSegmentSubscriberFinder->getSubscriberIdsInSegment($segment);
if ($subscribers) {
$count += $this->addSubscribersToTaskByIds($task, $subscribers);
}
}
return $count;
}

View File

@@ -5,13 +5,13 @@ namespace MailPoet\Segments;
require_once('FinderMock.php');
use Codeception\Util\Stub;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM;
use PHPUnit\Framework\MockObject\MockObject;
@@ -72,38 +72,28 @@ class SubscribersFinderTest extends \MailPoetTest {
}
public function testFindSubscribersInSegmentUsingFinder() {
/** @var MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['findSubscribersInSegment']);
/** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['findSubscribersInSegment']);
$mock
->expects($this->once())
->method('findSubscribersInSegment')
->will($this->returnValue([$this->subscriber3]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$finder = new SubscribersFinder($mock);
$subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id]);
expect($subscribers)->count(1);
expect($subscribers)->contains($this->subscriber3->id);
}
public function testFindSubscribersInSegmentUsingFinderMakesResultUnique() {
/** @var MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['findSubscribersInSegment']);
/** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['findSubscribersInSegment']);
$mock
->expects($this->exactly(2))
->method('findSubscribersInSegment')
->will($this->returnValue([$this->subscriber3]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$finder = new SubscribersFinder($mock);
$subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id, $this->segment3->id]);
expect($subscribers)->count(1);
}
@@ -133,19 +123,14 @@ class SubscribersFinderTest extends \MailPoetTest {
}
public function testItAddsSubscribersToTaskFromDynamicSegments() {
/** @var MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['getSubscriberIdsInSegment']);
/** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['getSubscriberIdsInSegment']);
$mock
->expects($this->once())
->method('getSubscriberIdsInSegment')
->will($this->returnValue([['id' => $this->subscriber1->id]]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$finder = new SubscribersFinder($mock);
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
[
@@ -160,15 +145,11 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder();
/** @var MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['getSubscriberIdsInSegment']);
$mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['getSubscriberIdsInSegment']);
$mock
->expects($this->once())
->method('getSubscriberIdsInSegment')
->will($this->returnValue([['id' => $this->subscriber2->id]]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),