Refactor SubscribersFinder to be always injected by container

[MAILPOET-3077]
This commit is contained in:
Rostislav Wolny
2020-09-23 13:53:36 +02:00
committed by Veljko V
parent b91687cbc1
commit 694d1fae10
8 changed files with 111 additions and 42 deletions

View File

@ -22,8 +22,15 @@ class SendingQueue extends APIEndpoint {
/** @var SubscribersFeature */ /** @var SubscribersFeature */
private $subscribersFeature; private $subscribersFeature;
public function __construct(SubscribersFeature $subscribersFeature) { /** @var SubscribersFinder */
private $subscribersFinder;
public function __construct(
SubscribersFeature $subscribersFeature,
SubscribersFinder $subscribersFinder
) {
$this->subscribersFeature = $subscribersFeature; $this->subscribersFeature = $subscribersFeature;
$this->subscribersFinder = $subscribersFinder;
} }
public function add($data = []) { public function add($data = []) {
@ -90,8 +97,7 @@ class SendingQueue extends APIEndpoint {
$queue->scheduledAt = Scheduler::formatDatetimeString($newsletter->scheduledAt); $queue->scheduledAt = Scheduler::formatDatetimeString($newsletter->scheduledAt);
} else { } else {
$segments = $newsletter->segments()->findMany(); $segments = $newsletter->segments()->findMany();
$finder = new SubscribersFinder(); $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($queue->task(), $segments);
$subscribersCount = $finder->addSubscribersToTaskFromSegments($queue->task(), $segments);
if (!$subscribersCount) { if (!$subscribersCount) {
return $this->errorResponse([ return $this->errorResponse([
APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'), APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'),

View File

@ -50,17 +50,22 @@ class SendingQueue {
/** @var CronHelper */ /** @var CronHelper */
private $cronHelper; private $cronHelper;
/** @var SubscribersFinder */
private $subscribersFinder;
public function __construct( public function __construct(
SendingErrorHandler $errorHandler, SendingErrorHandler $errorHandler,
StatsNotificationsScheduler $statsNotificationsScheduler, StatsNotificationsScheduler $statsNotificationsScheduler,
LoggerFactory $loggerFactory, LoggerFactory $loggerFactory,
NewslettersRepository $newslettersRepository, NewslettersRepository $newslettersRepository,
CronHelper $cronHelper, CronHelper $cronHelper,
SubscribersFinder $subscriberFinder,
$mailerTask = false, $mailerTask = false,
$newsletterTask = false $newsletterTask = false
) { ) {
$this->errorHandler = $errorHandler; $this->errorHandler = $errorHandler;
$this->statsNotificationsScheduler = $statsNotificationsScheduler; $this->statsNotificationsScheduler = $statsNotificationsScheduler;
$this->subscribersFinder = $subscriberFinder;
$this->mailerTask = ($mailerTask) ? $mailerTask : new MailerTask(); $this->mailerTask = ($mailerTask) ? $mailerTask : new MailerTask();
$this->newsletterTask = ($newsletterTask) ? $newsletterTask : new NewsletterTask(); $this->newsletterTask = ($newsletterTask) ? $newsletterTask : new NewsletterTask();
$this->mailerMetaInfo = new MetaInfo; $this->mailerMetaInfo = new MetaInfo;
@ -116,8 +121,7 @@ class SendingQueue {
); );
if (!empty($newsletterSegmentsIds[0])) { if (!empty($newsletterSegmentsIds[0])) {
// Check that subscribers are in segments // Check that subscribers are in segments
$finder = new SubscribersFinder(); $foundSubscribersIds = $this->subscribersFinder->findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds);
$foundSubscribersIds = $finder->findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds);
$foundSubscribers = SubscriberModel::whereIn('id', $subscribersToProcessIds) $foundSubscribers = SubscriberModel::whereIn('id', $subscribersToProcessIds)
->whereNull('deleted_at') ->whereNull('deleted_at')
->findMany(); ->findMany();

View File

@ -180,7 +180,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Form\Util\FieldNameObfuscator::class)->setPublic(true); $container->autowire(\MailPoet\Form\Util\FieldNameObfuscator::class)->setPublic(true);
$container->autowire(\MailPoet\Form\AssetsController::class)->setPublic(true); $container->autowire(\MailPoet\Form\AssetsController::class)->setPublic(true);
$container->autowire(\MailPoet\Form\DisplayFormInWPContent::class); $container->autowire(\MailPoet\Form\DisplayFormInWPContent::class);
$container->autowire(\MailPoet\Form\FormsRepository::class); $container->autowire(\MailPoet\Form\FormsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Form\Renderer::class)->setPublic(true); $container->autowire(\MailPoet\Form\Renderer::class)->setPublic(true);
$container->autowire(\MailPoet\Form\BlocksRenderer::class); $container->autowire(\MailPoet\Form\BlocksRenderer::class);
$container->autowire(\MailPoet\Form\BlockStylesRenderer::class); $container->autowire(\MailPoet\Form\BlockStylesRenderer::class);
@ -252,7 +252,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Subscribers\Statistics\SubscriberStatisticsRepository::class); $container->autowire(\MailPoet\Subscribers\Statistics\SubscriberStatisticsRepository::class);
// Segments // Segments
$container->autowire(\MailPoet\Segments\WooCommerce::class)->setPublic(true); $container->autowire(\MailPoet\Segments\WooCommerce::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\SubscribersFinder::class); $container->autowire(\MailPoet\Segments\SubscribersFinder::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\SegmentsRepository::class); $container->autowire(\MailPoet\Segments\SegmentsRepository::class);
$container->autowire(\MailPoet\Segments\SegmentSubscribersRepository::class)->setPublic(true); $container->autowire(\MailPoet\Segments\SegmentSubscribersRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\DynamicSegments\FilterHandler::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\FilterHandler::class)->setPublic(true);
@ -304,7 +304,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Text::class); $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Text::class);
$container->autowire(\MailPoet\Newsletter\Renderer\Columns\Renderer::class); $container->autowire(\MailPoet\Newsletter\Renderer\Columns\Renderer::class);
$container->autowire(\MailPoet\Newsletter\Renderer\Preprocessor::class); $container->autowire(\MailPoet\Newsletter\Renderer\Preprocessor::class);
$container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class); $container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class); $container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class);
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class); $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class);
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);

View File

@ -2,7 +2,6 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\InvalidStateException; use MailPoet\InvalidStateException;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
@ -17,11 +16,8 @@ class SubscribersFinder {
private $segmentSubscriberRepository; private $segmentSubscriberRepository;
public function __construct( public function __construct(
SegmentSubscribersRepository $segmentSubscriberRepository = null SegmentSubscribersRepository $segmentSubscriberRepository
) { ) {
if ($segmentSubscriberRepository === null) {
$segmentSubscriberRepository = ContainerWrapper::getInstance()->get(SegmentSubscribersRepository::class);
}
$this->segmentSubscriberRepository = $segmentSubscriberRepository; $this->segmentSubscriberRepository = $segmentSubscriberRepository;
} }

View File

@ -6,15 +6,14 @@ use Codeception\Util\Fixtures;
use Codeception\Util\Stub; use Codeception\Util\Stub;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI; use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue as SendingQueueModel; use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Settings\SettingsRepository; use MailPoet\Settings\SettingsRepository;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending; use MailPoet\Tasks\Sending;
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
@ -52,7 +51,7 @@ class SendingQueueTest extends \MailPoetTest {
$newletterOptions $newletterOptions
); );
$sendingQueue = new SendingQueueAPI(new SubscribersFeature(ContainerWrapper::getInstance()->get(SettingsController::class), ContainerWrapper::getInstance()->get(SubscribersRepository::class))); $sendingQueue = $this->diContainer->get(SendingQueueAPI::class);
$result = $sendingQueue->add(['newsletter_id' => $newsletter->id]); $result = $sendingQueue->add(['newsletter_id' => $newsletter->id]);
$scheduledTask = ScheduledTask::findOne($result->data['task_id']); $scheduledTask = ScheduledTask::findOne($result->data['task_id']);
expect($scheduledTask->status)->equals(ScheduledTask::STATUS_SCHEDULED); expect($scheduledTask->status)->equals(ScheduledTask::STATUS_SCHEDULED);
@ -61,9 +60,12 @@ class SendingQueueTest extends \MailPoetTest {
} }
public function testItReturnsErrorIfSubscribersLimitReached() { public function testItReturnsErrorIfSubscribersLimitReached() {
$sendingQueue = new SendingQueueAPI(Stub::make(SubscribersFeature::class, [ $sendingQueue = new SendingQueueAPI(
'check' => true, Stub::make(SubscribersFeature::class, [
])); 'check' => true,
]),
$this->diContainer->get(SubscribersFinder::class)
);
$res = $sendingQueue->add(['newsletter_id' => $this->newsletter->id]); $res = $sendingQueue->add(['newsletter_id' => $this->newsletter->id]);
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN); expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
$res = $sendingQueue->resume(['newsletter_id' => $this->newsletter->id]); $res = $sendingQueue->resume(['newsletter_id' => $this->newsletter->id]);
@ -83,7 +85,7 @@ class SendingQueueTest extends \MailPoetTest {
Newsletter::TYPE_STANDARD, Newsletter::TYPE_STANDARD,
$newletterOptions $newletterOptions
); );
$sendingQueue = new SendingQueueAPI(new SubscribersFeature(ContainerWrapper::getInstance()->get(SettingsController::class), ContainerWrapper::getInstance()->get(SubscribersRepository::class))); $sendingQueue = $this->diContainer->get(SendingQueueAPI::class);
// add scheduled task // add scheduled task
$result = $sendingQueue->add(['newsletter_id' => $newsletter->id]); $result = $sendingQueue->add(['newsletter_id' => $newsletter->id]);

View File

@ -6,7 +6,6 @@ use Codeception\Stub;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronHelper;
use MailPoet\Cron\Workers\Scheduler; use MailPoet\Cron\Workers\Scheduler;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Logging\LoggerFactory; use MailPoet\Logging\LoggerFactory;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOption;
@ -31,10 +30,14 @@ class SchedulerTest extends \MailPoetTest {
/** @var LoggerFactory */ /** @var LoggerFactory */
private $loggerFactory; private $loggerFactory;
/** @var SubscribersFinder */
private $subscribersFinder;
public function _before() { public function _before() {
parent::_before(); parent::_before();
$this->loggerFactory = LoggerFactory::getInstance(); $this->loggerFactory = LoggerFactory::getInstance();
$this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); $this->cronHelper = $this->diContainer->get(CronHelper::class);
$this->subscribersFinder = $this->diContainer->get(SubscribersFinder::class);
} }
public function testItThrowsExceptionWhenExecutionLimitIsReached() { public function testItThrowsExceptionWhenExecutionLimitIsReached() {
@ -414,7 +417,7 @@ class SchedulerTest extends \MailPoetTest {
$newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION)
->findOne($newsletter->id); ->findOne($newsletter->id);
$queue = $this->_createQueue($newsletter->id); $queue = $this->_createQueue($newsletter->id);
$scheduler = new Scheduler(new SubscribersFinder(), $this->loggerFactory, $this->cronHelper); $scheduler = new Scheduler($this->subscribersFinder, $this->loggerFactory, $this->cronHelper);
// return true // return true
expect($scheduler->processScheduledStandardNewsletter($newsletter, $queue))->true(); expect($scheduler->processScheduledStandardNewsletter($newsletter, $queue))->true();
@ -453,7 +456,7 @@ class SchedulerTest extends \MailPoetTest {
$newsletterSegment = $this->_createNewsletterSegment($newsletter->id, $segment->id); $newsletterSegment = $this->_createNewsletterSegment($newsletter->id, $segment->id);
// delete or reschedule queue when there are no subscribers in segments // delete or reschedule queue when there are no subscribers in segments
$scheduler = $this->construct(Scheduler::class, [new SubscribersFinder(), $this->loggerFactory, $this->cronHelper], [ $scheduler = $this->construct(Scheduler::class, [$this->subscribersFinder, $this->loggerFactory, $this->cronHelper], [
'deleteQueueOrUpdateNextRunDate' => Expected::exactly(1, function() { 'deleteQueueOrUpdateNextRunDate' => Expected::exactly(1, function() {
return false; return false;
}), }),
@ -476,7 +479,7 @@ class SchedulerTest extends \MailPoetTest {
); );
$newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION)
->findOne($newsletter->id); ->findOne($newsletter->id);
$scheduler = new Scheduler(new SubscribersFinder(), $this->loggerFactory, $this->cronHelper); $scheduler = new Scheduler($this->subscribersFinder, $this->loggerFactory, $this->cronHelper);
// return true // return true
expect($scheduler->processPostNotificationNewsletter($newsletter, $queue))->true(); expect($scheduler->processPostNotificationNewsletter($newsletter, $queue))->true();
@ -701,7 +704,7 @@ class SchedulerTest extends \MailPoetTest {
expect($task->newsletterId)->equals($newsletter->id); expect($task->newsletterId)->equals($newsletter->id);
// task should have its status set to null (i.e., sending) // task should have its status set to null (i.e., sending)
$scheduler = new Scheduler(new SubscribersFinder(), $this->loggerFactory, $this->cronHelper); $scheduler = new Scheduler($this->subscribersFinder, $this->loggerFactory, $this->cronHelper);
$scheduler->process(); $scheduler->process();
$task = SendingTask::getByNewsletterId($newsletter->id); $task = SendingTask::getByNewsletterId($newsletter->id);
expect($task->status)->null(); expect($task->status)->null();

View File

@ -34,6 +34,7 @@ use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Referrals\ReferralDetector; use MailPoet\Referrals\ReferralDetector;
use MailPoet\Router\Endpoints\Track; use MailPoet\Router\Endpoints\Track;
use MailPoet\Router\Router; use MailPoet\Router\Router;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Settings\SettingsRepository; use MailPoet\Settings\SettingsRepository;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
@ -65,6 +66,8 @@ class SendingQueueTest extends \MailPoetTest {
private $loggerFactory; private $loggerFactory;
/** @var NewslettersRepository */ /** @var NewslettersRepository */
private $newslettersRepository; private $newslettersRepository;
/** @var SubscribersFinder */
private $subscribersFinder;
public function _before() { public function _before() {
parent::_before(); parent::_before();
@ -116,16 +119,18 @@ class SendingQueueTest extends \MailPoetTest {
$this->newsletterLink->url = '[link:subscription_instant_unsubscribe_url]'; $this->newsletterLink->url = '[link:subscription_instant_unsubscribe_url]';
$this->newsletterLink->hash = 'abcde'; $this->newsletterLink->hash = 'abcde';
$this->newsletterLink->save(); $this->newsletterLink->save();
$this->subscribersFinder = $this->diContainer->get(SubscribersFinder::class);
$this->sendingErrorHandler = new SendingErrorHandler(); $this->sendingErrorHandler = new SendingErrorHandler();
$this->statsNotificationsWorker = Stub::makeEmpty(StatsNotificationsScheduler::class); $this->statsNotificationsWorker = Stub::makeEmpty(StatsNotificationsScheduler::class);
$this->loggerFactory = LoggerFactory::getInstance(); $this->loggerFactory = LoggerFactory::getInstance();
$this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); $this->cronHelper = $this->diContainer->get(CronHelper::class);
$this->sendingQueueWorker = new SendingQueueWorker( $this->sendingQueueWorker = new SendingQueueWorker(
$this->sendingErrorHandler, $this->sendingErrorHandler,
$this->statsNotificationsWorker, $this->statsNotificationsWorker,
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper $this->cronHelper,
$this->subscribersFinder
); );
$this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); $this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
} }
@ -163,7 +168,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->statsNotificationsWorker, $this->statsNotificationsWorker,
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper $this->cronHelper,
$this->subscribersFinder
), ),
[ [
'processQueue' => Expected::never(), 'processQueue' => Expected::never(),
@ -171,7 +177,14 @@ class SendingQueueTest extends \MailPoetTest {
throw new \Exception(); throw new \Exception();
}), }),
], $this); ], $this);
$sendingQueueWorker->__construct($this->sendingErrorHandler, $this->statsNotificationsWorker, $this->loggerFactory, Stub::makeEmpty(NewslettersRepository::class), $this->cronHelper); $sendingQueueWorker->__construct(
$this->sendingErrorHandler,
$this->statsNotificationsWorker,
$this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper,
$this->subscribersFinder
);
try { try {
$sendingQueueWorker->process(); $sendingQueueWorker->process();
self::fail('Execution limits function was not called.'); self::fail('Execution limits function was not called.');
@ -182,7 +195,14 @@ class SendingQueueTest extends \MailPoetTest {
public function testItEnforcesExecutionLimitsAfterSendingWhenQueueStatusIsNotSetToComplete() { public function testItEnforcesExecutionLimitsAfterSendingWhenQueueStatusIsNotSetToComplete() {
$sendingQueueWorker = Stub::make( $sendingQueueWorker = Stub::make(
new SendingQueueWorker($this->sendingErrorHandler, $this->statsNotificationsWorker, $this->loggerFactory, Stub::makeEmpty(NewslettersRepository::class), $this->cronHelper), new SendingQueueWorker(
$this->sendingErrorHandler,
$this->statsNotificationsWorker,
$this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper,
$this->subscribersFinder
),
[ [
'enforceSendingAndExecutionLimits' => Expected::exactly(1), 'enforceSendingAndExecutionLimits' => Expected::exactly(1),
], $this); ], $this);
@ -192,6 +212,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -220,7 +241,14 @@ class SendingQueueTest extends \MailPoetTest {
$queue = $this->queue; $queue = $this->queue;
$queue->status = SendingQueue::STATUS_COMPLETED; $queue->status = SendingQueue::STATUS_COMPLETED;
$sendingQueueWorker = Stub::make( $sendingQueueWorker = Stub::make(
new SendingQueueWorker($this->sendingErrorHandler, $this->statsNotificationsWorker, $this->loggerFactory, Stub::makeEmpty(NewslettersRepository::class), $this->cronHelper), new SendingQueueWorker(
$this->sendingErrorHandler,
$this->statsNotificationsWorker,
$this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper,
$this->subscribersFinder
),
[ [
'enforceSendingAndExecutionLimits' => Expected::never(), 'enforceSendingAndExecutionLimits' => Expected::never(),
], $this); ], $this);
@ -230,6 +258,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -253,7 +282,14 @@ class SendingQueueTest extends \MailPoetTest {
public function testItEnforcesExecutionLimitsAfterQueueProcessing() { public function testItEnforcesExecutionLimitsAfterQueueProcessing() {
$sendingQueueWorker = Stub::make( $sendingQueueWorker = Stub::make(
new SendingQueueWorker($this->sendingErrorHandler, $this->statsNotificationsWorker, $this->loggerFactory, Stub::makeEmpty(NewslettersRepository::class), $this->cronHelper), new SendingQueueWorker(
$this->sendingErrorHandler,
$this->statsNotificationsWorker,
$this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper,
$this->subscribersFinder
),
[ [
'processQueue' => function() { 'processQueue' => function() {
// this function returns a queue object // this function returns a queue object
@ -261,7 +297,14 @@ class SendingQueueTest extends \MailPoetTest {
}, },
'enforceSendingAndExecutionLimits' => Expected::exactly(2), 'enforceSendingAndExecutionLimits' => Expected::exactly(2),
], $this); ], $this);
$sendingQueueWorker->__construct($this->sendingErrorHandler, $this->statsNotificationsWorker, $this->loggerFactory, Stub::makeEmpty(NewslettersRepository::class), $this->cronHelper); $sendingQueueWorker->__construct(
$this->sendingErrorHandler,
$this->statsNotificationsWorker,
$this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper,
$this->subscribersFinder
);
$sendingQueueWorker->process(); $sendingQueueWorker->process();
} }
@ -288,6 +331,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -318,6 +362,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -346,6 +391,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -395,6 +441,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -447,6 +494,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -506,6 +554,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::makeEmpty(new MailerTask(), [], $this) Stub::makeEmpty(new MailerTask(), [], $this)
); );
$sendingQueueWorker->process(); $sendingQueueWorker->process();
@ -524,6 +573,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -578,6 +628,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -760,7 +811,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->statsNotificationsWorker, $this->statsNotificationsWorker,
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper $this->cronHelper,
$this->subscribersFinder
)); ));
$sendingQueueWorker->__construct( $sendingQueueWorker->__construct(
$this->sendingErrorHandler, $this->sendingErrorHandler,
@ -768,6 +820,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -805,6 +858,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
Stub::make( Stub::make(
new MailerTask(), new MailerTask(),
[ [
@ -833,7 +887,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->statsNotificationsWorker, $this->statsNotificationsWorker,
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class), Stub::makeEmpty(NewslettersRepository::class),
$this->cronHelper $this->cronHelper,
$this->subscribersFinder
); );
expect($sendingQueueWorker->batchSize)->equals($customBatchSizeValue); expect($sendingQueueWorker->batchSize)->equals($customBatchSizeValue);
$wp->removeFilter('mailpoet_cron_worker_sending_queue_batch_size', $filter); $wp->removeFilter('mailpoet_cron_worker_sending_queue_batch_size', $filter);
@ -852,6 +907,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
$this->make(new MailerTask(), [ $this->make(new MailerTask(), [
'send' => $this->mailerTaskDummyResponse, 'send' => $this->mailerTaskDummyResponse,
]) ])
@ -877,6 +933,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->loggerFactory, $this->loggerFactory,
Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]),
$this->cronHelper, $this->cronHelper,
$this->subscribersFinder,
$this->make(new MailerTask(), [ $this->make(new MailerTask(), [
'send' => $this->mailerTaskDummyResponse, 'send' => $this->mailerTaskDummyResponse,
]) ])

View File

@ -25,6 +25,9 @@ class SubscribersFinderTest extends \MailPoetTest {
public $segment2; public $segment2;
public $segment1; public $segment1;
/** @var SubscribersFinder */
private $subscribersFinder;
public function _before() { public function _before() {
parent::_before(); parent::_before();
ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
@ -63,12 +66,12 @@ class SubscribersFinderTest extends \MailPoetTest {
SubscriberSegment::resubscribeToAllSegments($this->subscriber2); SubscriberSegment::resubscribeToAllSegments($this->subscriber2);
SubscriberSegment::resubscribeToAllSegments($this->subscriber3); SubscriberSegment::resubscribeToAllSegments($this->subscriber3);
$this->sending = SendingTask::create(); $this->sending = SendingTask::create();
$this->subscribersFinder = $this->diContainer->get(SubscribersFinder::class);
} }
public function testFindSubscribersInSegmentInSegmentDefaultSegment() { public function testFindSubscribersInSegmentInSegmentDefaultSegment() {
$finder = new SubscribersFinder();
$deletedSegmentId = 1000; // non-existent segment $deletedSegmentId = 1000; // non-existent segment
$subscribers = $finder->findSubscribersInSegments([$this->subscriber2->id], [$this->segment1->id, $deletedSegmentId]); $subscribers = $this->subscribersFinder->findSubscribersInSegments([$this->subscriber2->id], [$this->segment1->id, $deletedSegmentId]);
expect($subscribers)->count(1); expect($subscribers)->count(1);
expect($subscribers[$this->subscriber2->id])->equals($this->subscriber2->id); expect($subscribers[$this->subscriber2->id])->equals($this->subscriber2->id);
} }
@ -101,8 +104,7 @@ class SubscribersFinderTest extends \MailPoetTest {
} }
public function testItAddsSubscribersToTaskFromStaticSegments() { public function testItAddsSubscribersToTaskFromStaticSegments() {
$finder = new SubscribersFinder(); $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
[ [
$this->getDummySegment($this->segment1->id, Segment::TYPE_DEFAULT), $this->getDummySegment($this->segment1->id, Segment::TYPE_DEFAULT),
@ -114,8 +116,7 @@ class SubscribersFinderTest extends \MailPoetTest {
} }
public function testItDoesNotAddSubscribersToTaskFromNoSegment() { public function testItDoesNotAddSubscribersToTaskFromNoSegment() {
$finder = new SubscribersFinder(); $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
[ [
$this->getDummySegment($this->segment1->id, 'UNKNOWN SEGMENT'), $this->getDummySegment($this->segment1->id, 'UNKNOWN SEGMENT'),