diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php index b31f01ed61..7c7221d265 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -10,6 +10,7 @@ use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterTask; use MailPoet\Cron\Workers\StatsNotifications\Scheduler as StatsNotificationsScheduler; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\ScheduledTaskEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Logging\LoggerFactory; use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MailerLog; @@ -22,6 +23,7 @@ use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SubscribersFinder; +use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Subscribers\BatchIterator; use MailPoet\WP\Functions as WPFunctions; @@ -68,6 +70,9 @@ class SendingQueue { /** @var ScheduledTasksRepository */ private $scheduledTasksRepository; + + /** @var SubscribersRepository */ + private $subscribersRepository; public function __construct( SendingErrorHandler $errorHandler, @@ -82,6 +87,7 @@ class SendingQueue { Links $links, ScheduledTasksRepository $scheduledTasksRepository, MailerTask $mailerTask, + SubscribersRepository $subscribersRepository, $newsletterTask = false ) { $this->errorHandler = $errorHandler; @@ -98,6 +104,7 @@ class SendingQueue { $this->cronHelper = $cronHelper; $this->links = $links; $this->scheduledTasksRepository = $scheduledTasksRepository; + $this->subscribersRepository = $subscribersRepository; } public function process($timer = false) { @@ -273,7 +280,12 @@ class SendingQueue { $preparedSubscribersIds[] = $subscriber->id; // create personalized instant unsubsribe link $unsubscribeUrls[] = $this->links->getUnsubscribeUrl($queue, $subscriber->id); - $metas[] = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletter, $subscriber); + + $subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id); + if ($subscriberEntity instanceof SubscriberEntity) { + $metas[] = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletter, $subscriberEntity); + } + // keep track of values for statistics purposes $statistics[] = [ 'newsletter_id' => $newsletter->id, diff --git a/mailpoet/lib/Mailer/MetaInfo.php b/mailpoet/lib/Mailer/MetaInfo.php index d57e73e985..22e27dafde 100644 --- a/mailpoet/lib/Mailer/MetaInfo.php +++ b/mailpoet/lib/Mailer/MetaInfo.php @@ -4,7 +4,6 @@ namespace MailPoet\Mailer; use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; -use MailPoet\Models\Subscriber; class MetaInfo { public function getSendingTestMetaInfo() { @@ -35,7 +34,7 @@ class MetaInfo { return $this->makeMetaInfo('new_subscriber_notification', 'unknown', 'administrator'); } - public function getNewsletterMetaInfo($newsletter, Subscriber $subscriber) { + public function getNewsletterMetaInfo($newsletter, SubscriberEntity $subscriber) { $type = $newsletter->type ?? 'unknown'; switch ($newsletter->type) { case Newsletter::TYPE_AUTOMATIC: @@ -54,7 +53,7 @@ class MetaInfo { $type = 'post_notification'; break; } - return $this->makeMetaInfo($type, $subscriber->status, $subscriber->source); + return $this->makeMetaInfo($type, $subscriber->getStatus(), $subscriber->getSource()); } private function makeMetaInfo($emailType, $subscriberStatus, $subscriberSource) { diff --git a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 3b7cc04656..f62a2486e7 100644 --- a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -55,6 +55,7 @@ use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Tasks\Sending as SendingTask; +use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; @@ -94,6 +95,8 @@ class SendingQueueTest extends \MailPoetTest { private $tasksLinks; /** @var ScheduledTasksRepository */ private $scheduledTasksRepository; + /** @var SubscribersRepository */ + private $subscribersRepository; public function _before() { parent::_before(); @@ -151,6 +154,7 @@ class SendingQueueTest extends \MailPoetTest { $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->tasksLinks = $this->diContainer->get(TasksLinks::class); $this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class); + $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->sendingQueueWorker = $this->getSendingQueueWorker($this->makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()])); } @@ -205,7 +209,8 @@ class SendingQueueTest extends \MailPoetTest { $this->wp, $this->tasksLinks, $this->scheduledTasksRepository, - $this->diContainer->get(MailerTask::class) + $this->diContainer->get(MailerTask::class), + $this->subscribersRepository ); try { $sendingQueueWorker->process(); @@ -238,7 +243,8 @@ class SendingQueueTest extends \MailPoetTest { [ 'sendBulk' => $this->mailerTaskDummyResponse, ] - ) + ), + $this->subscribersRepository ); $sendingQueueWorker->sendNewsletters( $this->queue, @@ -282,7 +288,8 @@ class SendingQueueTest extends \MailPoetTest { [ 'sendBulk' => $this->mailerTaskDummyResponse, ] - ) + ), + $this->subscribersRepository ); $sendingQueueWorker->sendNewsletters( $queue, @@ -320,7 +327,8 @@ class SendingQueueTest extends \MailPoetTest { $this->wp, $this->tasksLinks, $this->scheduledTasksRepository, - $this->diContainer->get(MailerTask::class) + $this->diContainer->get(MailerTask::class), + $this->subscribersRepository ); $sendingQueueWorker->process(); } @@ -438,34 +446,35 @@ class SendingQueueTest extends \MailPoetTest { } public function testItSendCorrectDataToSubscribersOneByOne() { - /** - * @var Subscriber[] $subscribers - */ - $subscribers = [ - Subscriber::create(), - Subscriber::create(), - ]; - $subscribers[0]->set('id', '1'); - $subscribers[1]->set('id', '2'); - $subscribers[0]->set('status', 'status-1'); - $subscribers[1]->set('status', 'status-2'); - $subscribers[0]->set('source', 'source-1'); - $subscribers[1]->set('source', 'source-2'); - $subscribers[0]->set('email', '1@localhost.com'); - $subscribers[1]->set('email', '2@localhost.com'); $subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class); - /** - * @var SubscriberEntity $entity - */ - $entity = $subscribersRepository->findOneById(1); - $entity->setEmail('1@localhost.com'); - $subscribersRepository->persist($entity); - $entity = $subscribersRepository->findOneById(2); - $entity->setEmail('2@localhost.com'); - $subscribersRepository->persist($entity); - $subscriberIds = array_map(function(Subscriber $item): int { return (int)$item->id(); - }, $subscribers); + $subscriber1 = $subscribersRepository->findOneById(1); + $subscriber1->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber1->setSource('form'); + $subscriber1->setEmail('1@localhost.com'); + $subscribersRepository->persist($subscriber1); + + + $subscriber2 = $subscribersRepository->findOneById(2); + $subscriber2->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber2->setSource('form'); + $subscriber2->setEmail('2@localhost.com'); + $subscribersRepository->persist($subscriber2); + + $subscribersRepository->flush(); + + $subscribers = [ + $subscriber1, + $subscriber2, + ]; + + $subscriberIds = array_map( + function(SubscriberEntity $item): int { + return (int)$item->getId(); + }, + $subscribers + ); + $queue = SendingTask::create(); $queue->newsletterRenderedBody = ['html' => '
Hello [subscriber:email]
', 'text' => 'Hello [subscriber:email]']; $queue->newsletterRenderedSubject = 'News for [subscriber:email]'; @@ -495,8 +504,8 @@ class SendingQueueTest extends \MailPoetTest { expect($newsletter['body']['html'])->equals('Hello ' . $subscriberEmail . '
'); expect($newsletter['body']['text'])->equals('Hello ' . $subscriberEmail); expect($extraParams['meta']['email_type'])->equals('newsletter'); - expect($extraParams['meta']['subscriber_status'])->equals('status-' . $subscriberId); - expect($extraParams['meta']['subscriber_source'])->equals('source-' . $subscriberId); + expect($extraParams['meta']['subscriber_status'])->equals(SubscriberEntity::STATUS_SUBSCRIBED); + expect($extraParams['meta']['subscriber_source'])->equals('form'); expect($extraParams['unsubscribe_url'])->equals($unsubscribeUrl); return $this->mailerTaskDummyResponse; @@ -505,7 +514,12 @@ class SendingQueueTest extends \MailPoetTest { ) ); - $sendingQueueWorker->processQueue($queue, $newsletter, $subscribers, $timer); + $subscribersModels = [ + Subscriber::findOne($subscriber1->getId()), + Subscriber::findOne($subscriber2->getId()) + ]; + + $sendingQueueWorker->processQueue($queue, $newsletter, $subscribersModels, $timer); } public function testItCanProcessSubscribersInBulk() { @@ -642,7 +656,8 @@ class SendingQueueTest extends \MailPoetTest { [ 'sendBulk' => Stub::consecutive(['response' => false, 'error' => $mailerError], $this->mailerTaskDummyResponse), ] - ) + ), + $this->subscribersRepository ); $sendingQueueWorker->sendNewsletters( @@ -1044,7 +1059,8 @@ class SendingQueueTest extends \MailPoetTest { [ 'sendBulk' => $this->mailerTaskDummyResponse, ] - ) + ), + $this->subscribersRepository ); try { $sendingQueueWorker->sendNewsletters( @@ -1268,7 +1284,8 @@ class SendingQueueTest extends \MailPoetTest { $this->wp, $this->tasksLinks, $this->scheduledTasksRepository, - $mailerMock ?? $this->diContainer->get(MailerTask::class) + $mailerMock ?? $this->diContainer->get(MailerTask::class), + $this->subscribersRepository ); } } diff --git a/mailpoet/tests/integration/Mailer/MetaInfoTest.php b/mailpoet/tests/integration/Mailer/MetaInfoTest.php index af0ca38d65..5d8d2cc358 100644 --- a/mailpoet/tests/integration/Mailer/MetaInfoTest.php +++ b/mailpoet/tests/integration/Mailer/MetaInfoTest.php @@ -5,16 +5,22 @@ namespace MailPoet\Test\Mailer; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Mailer\MetaInfo; -use MailPoet\Models\Subscriber; use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory; class MetaInfoTest extends \MailPoetTest { /** @var MetaInfo */ private $meta; + /** @var SubscriberEntity */ + private $subscriber; + public function _before() { parent::_before(); $this->meta = new MetaInfo; + $this->subscriber = (new SubscriberFactory()) + ->withStatus(SubscriberEntity::STATUS_SUBSCRIBED) + ->withSource('form') + ->create(); } public function testItGetsMetaInfoForSendingTest() { @@ -60,8 +66,11 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForConfirmationEmails() { - $subscriberFactory = new SubscriberFactory(); - $subscriber = $subscriberFactory->withStatus('unconfirmed')->withSource('form')->create(); + $subscriber = (new SubscriberFactory()) + ->withStatus(SubscriberEntity::STATUS_UNCONFIRMED) + ->withSource('form') + ->withEmail('test@metainfo.com') + ->create(); expect($this->meta->getConfirmationMetaInfo($subscriber))->equals([ 'email_type' => 'confirmation', @@ -79,14 +88,14 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForStandardNewsletter() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); + $subscriber = (new SubscriberFactory()) + ->withStatus(SubscriberEntity::STATUS_SUBSCRIBED) + ->withSource('form') + ->create(); $newsletter = (object)[ 'type' => NewsletterEntity::TYPE_STANDARD, ]; + expect($this->meta->getNewsletterMetaInfo($newsletter, $subscriber))->equals([ 'email_type' => 'newsletter', 'subscriber_status' => 'subscribed', @@ -95,15 +104,10 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForWelcomeEmail() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter = (object)[ 'type' => NewsletterEntity::TYPE_WELCOME, ]; - expect($this->meta->getNewsletterMetaInfo($newsletter, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter, $this->subscriber))->equals([ 'email_type' => 'welcome', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -111,23 +115,18 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForPostNotification() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter1 = (object)[ 'type' => NewsletterEntity::TYPE_NOTIFICATION, ]; $newsletter2 = (object)[ 'type' => NewsletterEntity::TYPE_NOTIFICATION_HISTORY, ]; - expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter1, $this->subscriber))->equals([ 'email_type' => 'post_notification', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', ]); - expect($this->meta->getNewsletterMetaInfo($newsletter2, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter2, $this->subscriber))->equals([ 'email_type' => 'post_notification', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -135,11 +134,6 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForAutomaticEmails() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter1 = (object)[ 'type' => NewsletterEntity::TYPE_AUTOMATIC, 'options' => [ @@ -154,12 +148,12 @@ class MetaInfoTest extends \MailPoetTest { 'event' => 'woocommerce_purchased_in_category', ], ]; - expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter1, $this->subscriber))->equals([ 'email_type' => 'automatic_woocommerce_woocommerce_first_purchase', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', ]); - expect($this->meta->getNewsletterMetaInfo($newsletter2, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter2, $this->subscriber))->equals([ 'email_type' => 'automatic_woocommerce_woocommerce_purchased_in_category', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -167,23 +161,18 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForReEngagement() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter1 = (object)[ - 'type' => Newsletter::TYPE_RE_ENGAGEMENT, + 'type' => NewsletterEntity::TYPE_RE_ENGAGEMENT, ]; $newsletter2 = (object)[ - 'type' => Newsletter::TYPE_RE_ENGAGEMENT, + 'type' => NewsletterEntity::TYPE_RE_ENGAGEMENT, ]; - expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter1, $this->subscriber))->equals([ 'email_type' => 're_engagement', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', ]); - expect($this->meta->getNewsletterMetaInfo($newsletter2, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter2, $this->subscriber))->equals([ 'email_type' => 're_engagement', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -191,16 +180,11 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForRandomType() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter1 = (object)[ 'type' => "random", ]; - expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter1, $this->subscriber))->equals([ 'email_type' => 'random', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -208,15 +192,10 @@ class MetaInfoTest extends \MailPoetTest { } public function testItGetsMetaInfoForUnknownType() { - $subscriber = Subscriber::create(); - $subscriber->hydrate([ - 'status' => 'subscribed', - 'source' => 'form', - ]); $newsletter1 = (object)[ 'type' => null ]; - expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([ + expect($this->meta->getNewsletterMetaInfo($newsletter1, $this->subscriber))->equals([ 'email_type' => 'unknown', 'subscriber_status' => 'subscribed', 'subscriber_source' => 'form', @@ -224,6 +203,6 @@ class MetaInfoTest extends \MailPoetTest { } public function _after() { - Subscriber::deleteMany(); + $this->truncateEntity(SubscriberEntity::class); } }