diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 6ac380f888..3a6d7d7e3f 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -46,7 +46,12 @@ class Newsletter { /** @var Emoji */ private $emoji; - public function __construct(WPFunctions $wp = null, PostsTask $postsTask = null, GATracking $gaTracking = null, Emoji $emoji = null) { + public function __construct( + WPFunctions $wp = null, + PostsTask $postsTask = null, + GATracking $gaTracking = null, + Emoji $emoji = null + ) { $settings = SettingsController::getInstance(); $this->trackingEnabled = (boolean)$settings->get('tracking.enabled'); if ($wp === null) { diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Shortcodes.php b/lib/Cron/Workers/SendingQueue/Tasks/Shortcodes.php index 621c8c913d..9345ca27bc 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Shortcodes.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Shortcodes.php @@ -2,11 +2,49 @@ namespace MailPoet\Cron\Workers\SendingQueue\Tasks; +use MailPoet\DI\ContainerWrapper; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; +use MailPoet\Entities\SubscriberEntity; +use MailPoet\Models\SendingQueue; +use MailPoet\Models\Subscriber; +use MailPoet\Newsletter\NewslettersRepository; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes; +use MailPoet\Subscribers\SubscribersRepository; +use MailPoet\Tasks\Sending; class Shortcodes { public static function process($content, $contentSource = null, $newsletter = null, $subscriber = null, $queue = null) { - $shortcodes = new NewsletterShortcodes($newsletter, $subscriber, $queue); + /** @var NewsletterShortcodes $shortcodes */ + $shortcodes = ContainerWrapper::getInstance()->get(NewsletterShortcodes::class); + /** @var SendingQueuesRepository $sendingQueueRepository */ + $sendingQueueRepository = ContainerWrapper::getInstance()->get(SendingQueuesRepository::class); + /** @var NewslettersRepository $newsletterRepository */ + $newsletterRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); + /** @var NewslettersRepository $newsletterRepository */ + $subscribersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); + /** @var SubscribersRepository $subscribersRepository */ + $subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class); + + if ($queue instanceof Sending || $queue instanceof SendingQueue) { + $queue = $sendingQueueRepository->findOneById($queue->id); + } + if ($queue instanceof SendingQueueEntity) { + $shortcodes->setQueue($queue); + } + if ($newsletter instanceof \MailPoet\Models\Newsletter) { + $newsletter = $newsletterRepository->findOneById($newsletter->id); + } + if ($newsletter instanceof NewsletterEntity) { + $shortcodes->setNewsletter($newsletter); + } + if ($subscriber instanceof Subscriber) { + $subscriber = $subscribersRepository->findOneById($subscriber->id); + } + if ($subscriber instanceof SubscriberEntity) { + $shortcodes->setSubscriber($subscriber); + } return $shortcodes->replace($content, $contentSource); } } diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index a35eada77b..6e18221ce5 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -308,6 +308,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Shortcodes\ShortcodesHelper::class)->setPublic(true); + $container->autowire(\MailPoet\Newsletter\Shortcodes\Shortcodes::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class)->setPublic(true); diff --git a/lib/Newsletter/Links/Links.php b/lib/Newsletter/Links/Links.php index 939536c8cf..003033bb71 100644 --- a/lib/Newsletter/Links/Links.php +++ b/lib/Newsletter/Links/Links.php @@ -2,6 +2,7 @@ namespace MailPoet\Newsletter\Links; +use MailPoet\DI\ContainerWrapper; use MailPoet\Models\NewsletterLink; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Shortcodes\Categories\Link; @@ -29,7 +30,8 @@ class Links { public static function extract($content) { $extractedLinks = []; // extract link shortcodes - $shortcodes = new Shortcodes(); + /** @var Shortcodes $shortcodes */ + $shortcodes = ContainerWrapper::getInstance()->get(Shortcodes::class); $shortcodes = $shortcodes->extract( $content, $categories = [Link::CATEGORY_NAME] @@ -97,7 +99,7 @@ class Links { foreach ($matches[1] as $index => $match) { $hash = null; if (preg_match('/-/', $match)) { - list(, $hash) = explode('-', $match); + [, $hash] = explode('-', $match); } $linkTokens = new LinkTokens; $data = self::createUrlDataObject( diff --git a/lib/Newsletter/Preview/SendPreviewController.php b/lib/Newsletter/Preview/SendPreviewController.php index 883846aad0..66c1f481e8 100644 --- a/lib/Newsletter/Preview/SendPreviewController.php +++ b/lib/Newsletter/Preview/SendPreviewController.php @@ -3,12 +3,13 @@ namespace MailPoet\Newsletter\Preview; use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Mailer\Mailer; use MailPoet\Mailer\MetaInfo; -use MailPoet\Models\Newsletter; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Shortcodes\Shortcodes; +use MailPoet\Subscribers\SubscribersRepository; use MailPoet\WP\Functions as WPFunctions; class SendPreviewController { @@ -24,25 +25,29 @@ class SendPreviewController { /** @var Renderer */ private $renderer; + /** @var Shortcodes */ + private $shortcodes; + + /** @var SubscribersRepository */ + private $subscribersRepository; + public function __construct( Mailer $mailer, MetaInfo $mailerMetaInfo, Renderer $renderer, - WPFunctions $wp + WPFunctions $wp, + SubscribersRepository $subscribersRepository, + Shortcodes $shortcodes ) { $this->mailer = $mailer; $this->mailerMetaInfo = $mailerMetaInfo; $this->wp = $wp; $this->renderer = $renderer; + $this->shortcodes = $shortcodes; + $this->subscribersRepository = $subscribersRepository; } public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) { - // Renderer and Shortcodes need old Newsletter model, until they're rewritten to use Doctrine - $newsletterModel = Newsletter::findOne($newsletter->getId()); - if (!$newsletterModel) { - throw new SendPreviewException("Newsletter with ID '{$newsletter->getId()}' not found"); - } - $renderedNewsletter = $this->renderer->renderAsPreview($newsletter); $divider = '***MailPoet***'; $dataForShortcodes = array_merge( @@ -52,19 +57,21 @@ class SendPreviewController { $body = implode($divider, $dataForShortcodes); - $subscriber = Subscriber::getCurrentWPUser() ?: false; - $shortcodes = new Shortcodes( - $newsletterModel, - $subscriber, - $queue = false, - $wpUserPreview = true - ); + $subscriber = Subscriber::getCurrentWPUser(); + if ($subscriber instanceof Subscriber) { + $subscriber = $this->subscribersRepository->findOneById($subscriber->id); + } + $this->shortcodes->setNewsletter($newsletter); + if ($subscriber instanceof SubscriberEntity) { + $this->shortcodes->setSubscriber($subscriber); + } + $this->shortcodes->setWpUserPreview(true); - list( + [ $renderedNewsletter['subject'], $renderedNewsletter['body']['html'], - $renderedNewsletter['body']['text'] - ) = explode($divider, $shortcodes->replace($body)); + $renderedNewsletter['body']['text'], + ] = explode($divider, $this->shortcodes->replace($body)); $renderedNewsletter['id'] = $newsletter->getId(); $extraParams = [ diff --git a/lib/Newsletter/Shortcodes/Shortcodes.php b/lib/Newsletter/Shortcodes/Shortcodes.php index 8fbdaf7b0e..9f4d13981a 100644 --- a/lib/Newsletter/Shortcodes/Shortcodes.php +++ b/lib/Newsletter/Shortcodes/Shortcodes.php @@ -2,24 +2,42 @@ namespace MailPoet\Newsletter\Shortcodes; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\WP\Functions as WPFunctions; class Shortcodes { const SHORTCODE_CATEGORY_NAMESPACE = 'MailPoet\Newsletter\Shortcodes\Categories\\'; - public $newsletter; - public $subscriber; - public $queue; - public $wpUserPreview; - public function __construct( - $newsletter = false, - $subscriber = false, - $queue = false, - $wpUserPreview = false - ) { + /** @var NewsletterEntity|null */ + private $newsletter; + + /** @var SubscriberEntity|null */ + private $subscriber; + + /** @var SendingQueueEntity|null */ + private $queue; + + /** @var bool */ + private $wpUserPreview = false; + + public function setNewsletter(NewsletterEntity $newsletter): void { $this->newsletter = $newsletter; + } + + public function setSubscriber(SubscriberEntity $subscriber = null): void { $this->subscriber = $subscriber; + } + + public function setQueue(SendingQueueEntity $queue): void { $this->queue = $queue; + } + + /** + * @param bool $wpUserPreview + */ + public function setWpUserPreview(bool $wpUserPreview): void { $this->wpUserPreview = $wpUserPreview; } @@ -48,48 +66,47 @@ class Shortcodes { } public function process($shortcodes, $content = false) { - $_this = $this; - $processedShortcodes = array_map( - function($shortcode) use ($content, $_this) { - $shortcodeDetails = $_this->match($shortcode); - $shortcodeDetails['shortcode'] = $shortcode; - $shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ? - $shortcodeDetails['category'] : - false; - $shortcodeDetails['action'] = !empty($shortcodeDetails['action']) ? - $shortcodeDetails['action'] : - false; - $shortcodeDetails['action_argument'] = !empty($shortcodeDetails['argument']) ? - $shortcodeDetails['argument'] : - false; - $shortcodeDetails['action_argument_value'] = !empty($shortcodeDetails['argument_value']) ? - $shortcodeDetails['argument_value'] : - false; - $shortcodeClass = - Shortcodes::SHORTCODE_CATEGORY_NAMESPACE . ucfirst($shortcodeDetails['category']); - if (!class_exists($shortcodeClass)) { - $customShortcode = WPFunctions::get()->applyFilters( - 'mailpoet_newsletter_shortcode', - $shortcode, - $_this->newsletter, - $_this->subscriber, - $_this->queue, - $content, - $_this->wpUserPreview - ); - return ($customShortcode === $shortcode) ? - false : - $customShortcode; - } - return $shortcodeClass::process( - $shortcodeDetails, - $_this->newsletter, - $_this->subscriber, - $_this->queue, + $processedShortcodes = []; + foreach ($shortcodes as $shortcode) { + $shortcodeDetails = $this->match($shortcode); + $shortcodeDetails['shortcode'] = $shortcode; + $shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ? + $shortcodeDetails['category'] : + false; + $shortcodeDetails['action'] = !empty($shortcodeDetails['action']) ? + $shortcodeDetails['action'] : + false; + $shortcodeDetails['action_argument'] = !empty($shortcodeDetails['argument']) ? + $shortcodeDetails['argument'] : + false; + $shortcodeDetails['action_argument_value'] = !empty($shortcodeDetails['argument_value']) ? + $shortcodeDetails['argument_value'] : + false; + $shortcodeClass = + Shortcodes::SHORTCODE_CATEGORY_NAMESPACE . ucfirst($shortcodeDetails['category']); + if (!class_exists($shortcodeClass)) { + $customShortcode = WPFunctions::get()->applyFilters( + 'mailpoet_newsletter_shortcode', + $shortcode, + $this->newsletter, + $this->subscriber, + $this->queue, $content, - $_this->wpUserPreview + $this->wpUserPreview ); - }, $shortcodes); + $processedShortcodes[] = ($customShortcode === $shortcode) ? + false : + $customShortcode; + } + $processedShortcodes[] = $shortcodeClass::process( + $shortcodeDetails, + $this->newsletter, + $this->subscriber, + $this->queue, + $content, + $this->wpUserPreview + ); + } return $processedShortcodes; } diff --git a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php index e7b3d25518..376203a1ed 100644 --- a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php +++ b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php @@ -2,13 +2,21 @@ namespace MailPoet\Newsletter\ViewInBrowser; +use MailPoet\DI\ContainerWrapper; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Links\Links; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\Renderer; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Settings\SettingsController; +use MailPoet\Subscribers\SubscribersRepository; +use MailPoet\Tasks\Sending; use MailPoet\WP\Emoji; class ViewInBrowserRenderer { @@ -21,14 +29,19 @@ class ViewInBrowserRenderer { /** @var Renderer */ private $renderer; + /** @var Shortcodes */ + private $shortcodes; + public function __construct( Emoji $emoji, SettingsController $settings, + Shortcodes $shortcodes, Renderer $renderer ) { $this->emoji = $emoji; $this->isTrackingEnabled = $settings->get('tracking.enabled'); $this->renderer = $renderer; + $this->shortcodes = $shortcodes; } public function render( @@ -61,13 +74,13 @@ class ViewInBrowserRenderer { $newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html'); } } - $shortcodes = new Shortcodes( + $this->prepareShortcodes( $newsletter, $subscriber ?: false, $queue ?: false, $wpUserPreview ); - $renderedNewsletter = $shortcodes->replace($newsletterBody); + $renderedNewsletter = $this->shortcodes->replace($newsletterBody); if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) { $renderedNewsletter = Links::replaceSubscriberData( $subscriber->id, @@ -77,4 +90,36 @@ class ViewInBrowserRenderer { } return $renderedNewsletter; } + + /** this is here to prepare entities for the shortcodes library, when this whole file uses doctrine, this can be deleted */ + private function prepareShortcodes($newsletter, $subscriber, $queue, $wpUserPreview) { + /** @var SendingQueuesRepository $sendingQueueRepository */ + $sendingQueueRepository = ContainerWrapper::getInstance()->get(SendingQueuesRepository::class); + /** @var NewslettersRepository $newsletterRepository */ + $newsletterRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); + /** @var NewslettersRepository $newsletterRepository */ + $subscribersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); + /** @var SubscribersRepository $subscribersRepository */ + $subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class); + + if ($queue instanceof Sending || $queue instanceof SendingQueue) { + $queue = $sendingQueueRepository->findOneById($queue->id); + } + if ($queue instanceof SendingQueueEntity) { + $this->shortcodes->setQueue($queue); + } + if ($newsletter instanceof Newsletter) { + $newsletter = $newsletterRepository->findOneById($newsletter->id); + } + if ($newsletter instanceof NewsletterEntity) { + $this->shortcodes->setNewsletter($newsletter); + } + if ($subscriber instanceof Subscriber) { + $subscriber = $subscribersRepository->findOneById($subscriber->id); + } + $this->shortcodes->setWpUserPreview($wpUserPreview); + if ($subscriber instanceof SubscriberEntity) { + $this->shortcodes->setSubscriber($subscriber); + } + } } diff --git a/lib/Statistics/Track/Clicks.php b/lib/Statistics/Track/Clicks.php index eac6c9d280..d1c59529df 100644 --- a/lib/Statistics/Track/Clicks.php +++ b/lib/Statistics/Track/Clicks.php @@ -27,9 +27,17 @@ class Clicks { /** @var Cookies */ private $cookies; - public function __construct(SettingsController $settingsController, Cookies $cookies) { + /** @var Shortcodes */ + private $shortcodes; + + public function __construct( + SettingsController $settingsController, + Cookies $cookies, + Shortcodes $shortcodes + ) { $this->settingsController = $settingsController; $this->cookies = $cookies; + $this->shortcodes = $shortcodes; } /** @@ -115,8 +123,11 @@ class Clicks { $wpUserPreview ); } else { - $shortcodes = new Shortcodes($newsletter, $subscriber, $queue, $wpUserPreview); - $url = $shortcodes->replace($url); + $this->shortcodes->setQueue($queue); + $this->shortcodes->setNewsletter($newsletter); + $this->shortcodes->setSubscriber($subscriber); + $this->shortcodes->setWpUserPreview($wpUserPreview); + $url = $this->shortcodes->replace($url); } return $url; } diff --git a/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php b/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php index 1750534e66..b585130f7b 100644 --- a/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php +++ b/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php @@ -9,7 +9,9 @@ use MailPoet\Mailer\Mailer; use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MetaInfo; use MailPoet\Newsletter\Renderer\Renderer; +use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Url; +use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Util\Security; use MailPoet\WP\Functions as WPFunctions; @@ -68,7 +70,9 @@ class SendPreviewControllerTest extends \MailPoetTest { $mailer, new MetaInfo(), $this->diContainer->get(Renderer::class), - new WPFunctions() + new WPFunctions(), + $this->diContainer->get(Shortcodes::class), + $this->diContainer->get(SubscribersRepository::class) ); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com'); } @@ -95,7 +99,9 @@ class SendPreviewControllerTest extends \MailPoetTest { $mailer, new MetaInfo(), $this->diContainer->get(Renderer::class), - new WPFunctions() + new WPFunctions(), + $this->diContainer->get(Shortcodes::class), + $this->diContainer->get(SubscribersRepository::class) ); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com'); } diff --git a/tests/integration/Newsletter/ShortcodesTest.php b/tests/integration/Newsletter/ShortcodesTest.php index eee1771584..2c3fb8ee47 100644 --- a/tests/integration/Newsletter/ShortcodesTest.php +++ b/tests/integration/Newsletter/ShortcodesTest.php @@ -3,11 +3,13 @@ namespace MailPoet\Test\Newsletter; use MailPoet\Config\Populator; -use MailPoet\Models\CustomField; +use MailPoet\Entities\CustomFieldEntity; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; +use MailPoet\Entities\SubscriberCustomFieldEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; -use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; -use MailPoet\Models\SubscriberCustomField; use MailPoet\Newsletter\Shortcodes\Categories\Date; use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Url as NewsletterUrl; @@ -15,17 +17,16 @@ use MailPoet\Settings\SettingsController; use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\WP\Functions as WPFunctions; -use MailPoetVendor\Idiorm\ORM; require_once(ABSPATH . 'wp-admin/includes/user.php'); class ShortcodesTest extends \MailPoetTest { - public $newsletterId; - public $wPPost; - public $wPUser; - public $renderedNewsletter; - public $newsletter; - public $subscriber; + private $wPPost; + private $wPUser; + /** @var NewsletterEntity */ + private $newsletter; + /** @var SubscriberEntity */ + private $subscriber; /** @var Shortcodes */ private $shortcodesObject; /** @var SettingsController */ @@ -42,10 +43,9 @@ class ShortcodesTest extends \MailPoetTest { $this->wPPost = $this->_createWPPost(); $this->subscriber = $this->_createSubscriber(); $this->newsletter = $this->_createNewsletter(); - $this->shortcodesObject = new Shortcodes( - $this->newsletter, - $this->subscriber - ); + $this->shortcodesObject = $this->diContainer->get(Shortcodes::class); + $this->shortcodesObject->setNewsletter($this->newsletter); + $this->shortcodesObject->setSubscriber($this->subscriber); $this->settings->set('tracking.enabled', false); $this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens); } @@ -123,7 +123,7 @@ class ShortcodesTest extends \MailPoetTest { 'not post'; $result = $shortcodesObject->process(['[newsletter:subject]'], $content); - expect($result[0])->equals($this->newsletter->subject); + expect($result[0])->equals($this->newsletter->getSubject()); $result = $shortcodesObject->process(['[newsletter:total]'], $content); expect($result[0])->equals(2); @@ -136,65 +136,42 @@ class ShortcodesTest extends \MailPoetTest { public function itCanProcessPostNotificationNewsletterNumberShortcode() { // create first post notification $postNotificationHistory = $this->_createNewsletter( - $parentId = $this->newsletterId, + $parentId = $this->newsletter, $type = Newsletter::TYPE_NOTIFICATION_HISTORY ); - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $postNotificationHistory, - $this->subscriber - ); - $result = $shortcodesObject->process(['[newsletter:number]']); + $this->shortcodesObject->setNewsletter($postNotificationHistory); + $result = $this->shortcodesObject->process(['[newsletter:number]']); expect($result['0'])->equals(1); // create another post notification $postNotificationHistory = $this->_createNewsletter( - $parentId = $this->newsletterId, + $parentId = $this->newsletter, $type = Newsletter::TYPE_NOTIFICATION_HISTORY ); - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $postNotificationHistory, - $this->subscriber - ); - $result = $shortcodesObject->process(['[newsletter:number]']); + $this->shortcodesObject->setNewsletter($postNotificationHistory); + $result = $this->shortcodesObject->process(['[newsletter:number]']); expect($result['0'])->equals(2); } public function testSubscriberShortcodesRequireSubscriberObjectOrFalseValue() { // when subscriber is empty, default value is returned - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $this->newsletter, - $subscriber = false - ); - $result = $shortcodesObject->process(['[subscriber:firstname | default:test]']); + $this->shortcodesObject->setSubscriber(null); + $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']); expect($result[0])->equals('test'); // when subscriber is an object, proper value is returned - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $this->newsletter, - $this->subscriber - ); - $result = $shortcodesObject->process(['[subscriber:firstname | default:test]']); - expect($result[0])->equals($this->subscriber->first_name); - // when subscriber is not empty and not an object, shortcode is returned - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $this->newsletter, - $subscriber = [] - ); - $result = $shortcodesObject->process(['[subscriber:firstname | default:test]']); - expect($result[0])->equals('[subscriber:firstname | default:test]'); + $this->shortcodesObject->setSubscriber($this->subscriber); + $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']); + expect($result[0])->equals($this->subscriber->getFirstName()); } public function testSubscriberFirstAndLastNameShortcodesReturnDefaultValueWhenDataIsEmpty() { // when subscriber exists but first or last names are empty, default value is returned $subscriber = $this->subscriber; - $subscriber->firstName = ''; - $subscriber->lastName = ''; - $shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( - $this->newsletter, - $subscriber - ); - $result = $shortcodesObject->process(['[subscriber:firstname | default:test]']); + $subscriber->setFirstName(''); + $subscriber->setLastName(''); + $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']); expect($result[0])->equals('test'); - $result = $shortcodesObject->process(['[subscriber:lastname | default:test]']); + $result = $this->shortcodesObject->process(['[subscriber:lastname | default:test]']); expect($result[0])->equals('test'); } @@ -202,10 +179,10 @@ class ShortcodesTest extends \MailPoetTest { $shortcodesObject = $this->shortcodesObject; $result = $shortcodesObject->process(['[subscriber:firstname]']); - expect($result[0])->equals($this->subscriber->first_name); + expect($result[0])->equals($this->subscriber->getFirstName()); $result = $shortcodesObject->process(['[subscriber:lastname]']); - expect($result[0])->equals($this->subscriber->last_name); + expect($result[0])->equals($this->subscriber->getLastName()); $result = $shortcodesObject->process(['[subscriber:displayname]']); expect($result[0])->equals($this->wPUser->user_login); @@ -215,13 +192,11 @@ class ShortcodesTest extends \MailPoetTest { $result = $shortcodesObject->process(['[subscriber:count]']); expect($result[0])->equals($subscriberCount); - $this->subscriber->status = 'unsubscribed'; - $this->subscriber->save(); + $this->subscriber->setStatus('unsubscribed'); $result = $shortcodesObject->process(['[subscriber:count]']); expect($result[0])->equals($subscriberCount - 1); - $this->subscriber->status = 'bounced'; - $this->subscriber->save(); + $this->subscriber->setStatus('bounced'); $result = $shortcodesObject->process(['[subscriber:count]']); expect($result[0])->equals($subscriberCount - 1); @@ -230,23 +205,22 @@ class ShortcodesTest extends \MailPoetTest { public function testItCanProcessSubscriberCustomFieldShortcodes() { $shortcodesObject = $this->shortcodesObject; $subscriber = $this->subscriber; - $customField = CustomField::create(); - $customField->name = 'custom_field_name'; - $customField->type = 'text'; - $customField->save(); + $customField = new CustomFieldEntity(); + $customField->setName('custom_field_name'); + $customField->setType('text'); + $this->entityManager->persist($customField); + $this->entityManager->flush(); $result = $shortcodesObject->process( - ['[subscriber:cf_' . $customField->id . ']'] + ['[subscriber:cf_' . $customField->getId() . ']'] ); expect($result[0])->false(); - $subscriberCustomField = SubscriberCustomField::create(); - $subscriberCustomField->subscriberId = $subscriber->id; - $subscriberCustomField->customFieldId = (int)$customField->id; - $subscriberCustomField->value = 'custom_field_value'; - $subscriberCustomField->save(); + $subscriberCustomField = new SubscriberCustomFieldEntity($subscriber, $customField, 'custom_field_value'); + $this->entityManager->persist($subscriberCustomField); + $this->entityManager->flush(); $result = $shortcodesObject->process( - ['[subscriber:cf_' . $customField->id . ']'] + ['[subscriber:cf_' . $customField->getId() . ']'] ); - expect($result[0])->equals($subscriberCustomField->value); + expect($result[0])->equals($subscriberCustomField->getValue()); } public function testItCanProcessLinkShortcodes() { @@ -288,7 +262,7 @@ class ShortcodesTest extends \MailPoetTest { '[link:newsletter_view_in_browser_url]', ]; // tracking function only works during sending, so queue object must not be false - $shortcodesObject->queue = true; + $shortcodesObject->setQueue($this->_createQueue()); $result = $shortcodesObject->process($initialShortcodes); foreach ($result as $index => $transformedShortcode) { // 1. result must not contain a link @@ -303,7 +277,7 @@ class ShortcodesTest extends \MailPoetTest { public function testItReturnsDefaultLinksWhenPreviewIsEnabled() { $shortcodesObject = $this->shortcodesObject; - $shortcodesObject->wpUserPreview = true; + $shortcodesObject->setWpUserPreview(true); $shortcodes = [ '[link:subscription_unsubscribe_url]', '[link:subscription_instant_unsubscribe_url]', @@ -336,7 +310,7 @@ class ShortcodesTest extends \MailPoetTest { expect($result[0])->equals('success'); $this->settings->set('tracking.enabled', true); // tracking function only works during sending, so queue object must not be false - $shortcodesObject->queue = true; + $shortcodesObject->setQueue($this->_createQueue()); $result = $shortcodesObject->process([$shortcode]); expect($result[0])->equals($shortcode); } @@ -351,54 +325,45 @@ class ShortcodesTest extends \MailPoetTest { } public function _createWPUser() { - $wPUser = wp_create_user('phoenix_test_user', 'pass', 'phoenix@test.com'); + wp_create_user('phoenix_test_user', 'pass', 'phoenix@test.com'); $wPUser = get_user_by('login', 'phoenix_test_user'); return $wPUser; } - public function _createSubscriber() { - $subscriber = Subscriber::create(); - $subscriber->hydrate( - [ - 'first_name' => 'Donald', - 'last_name' => 'Trump', - 'email' => 'mister@trump.com', - 'status' => Subscriber::STATUS_SUBSCRIBED, - 'WP_user_id' => $this->wPUser->ID, - ] - ); - $subscriber->save(); - return Subscriber::findOne($subscriber->id); + public function _createSubscriber(): SubscriberEntity { + $subscriber = new SubscriberEntity(); + $subscriber->setFirstName('Donald'); + $subscriber->setLastName('Trump'); + $subscriber->setEmail('mister@trump.com'); + $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber->setWpUserId($this->wPUser->ID); + return $subscriber; } - public function _createNewsletter($parentId = null, $type = Newsletter::TYPE_NOTIFICATION) { - $newsletter = Newsletter::create(); - $newsletter->hydrate( - [ - 'subject' => 'some subject', - 'type' => $type, - 'status' => Newsletter::STATUS_SENT, - 'parent_id' => $parentId, - ] - ); - $newsletter->save(); - return Newsletter::findOne($newsletter->id); + public function _createNewsletter(NewsletterEntity $parent = null, $type = Newsletter::TYPE_NOTIFICATION): NewsletterEntity { + $newsletter = new NewsletterEntity(); + $newsletter->setSubject('some subject'); + $newsletter->setType($type); + $newsletter->setStatus(NewsletterEntity::STATUS_SENT); + if ($parent) { + $newsletter->setParent($parent); + } + return $newsletter; } - public function _createQueue() { - $queue = SendingQueue::create(); - $queue->newsletterId = $this->newsletter['id']; - $queue->status = 'completed'; - $queue->save(); - return SendingQueue::findOne($queue->id); + /** @return SendingQueueEntity */ + public function _createQueue(): SendingQueueEntity { + $queue = new SendingQueueEntity(); + $queue->setNewsletter($this->newsletter); + return $queue; } public function _after() { - ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); - ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); - ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); - ORM::raw_execute('TRUNCATE ' . CustomField::$_table); - ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table); + $this->truncateEntity(NewsletterEntity::class); + $this->truncateEntity(SubscriberEntity::class); + $this->truncateEntity(SendingQueueEntity::class); + $this->truncateEntity(CustomFieldEntity::class); + $this->truncateEntity(SubscriberCustomFieldEntity::class); wp_delete_post($this->wPPost, true); wp_delete_user($this->wPUser->ID); } diff --git a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php index d634a45f23..88c3157fe4 100644 --- a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php +++ b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php @@ -10,6 +10,7 @@ use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Renderer\Renderer; +use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Router\Router; use MailPoet\Settings\SettingsController; use MailPoet\Tasks\Sending as SendingTask; @@ -153,6 +154,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest { $viewInBrowser = new ViewInBrowserRenderer( $emoji, $this->diContainer->get(SettingsController::class), + $this->diContainer->get(Shortcodes::class), $this->diContainer->get(Renderer::class) ); $renderedBody = $viewInBrowser->render( diff --git a/tests/integration/Router/Endpoints/TrackTest.php b/tests/integration/Router/Endpoints/TrackTest.php index 9563c5d26e..a95caf4d18 100644 --- a/tests/integration/Router/Endpoints/TrackTest.php +++ b/tests/integration/Router/Endpoints/TrackTest.php @@ -66,7 +66,9 @@ class TrackTest extends \MailPoetTest { 'link_hash' => $link->getHash(), 'preview' => false, ]; - $queue = SendingTask::createFromQueue(SendingQueue::findOne($queue->getId())); + $queue = SendingQueue::findOne($queue->getId()); + assert($queue instanceof SendingQueue); + $queue = SendingTask::createFromQueue($queue); $queue->updateProcessedSubscribers([$subscriberModel->id]); // instantiate class $this->track = $this->diContainer->get(Track::class); diff --git a/tests/integration/Statistics/Track/ClicksTest.php b/tests/integration/Statistics/Track/ClicksTest.php index 86c85d1a2a..f1f9d23b46 100644 --- a/tests/integration/Statistics/Track/ClicksTest.php +++ b/tests/integration/Statistics/Track/ClicksTest.php @@ -15,6 +15,7 @@ use MailPoet\Models\SendingQueue; use MailPoet\Models\StatisticsClicks; use MailPoet\Models\StatisticsOpens; use MailPoet\Models\Subscriber; +use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Settings\SettingsController; use MailPoet\Statistics\Track\Clicks; use MailPoet\Subscribers\LinkTokens; @@ -75,13 +76,15 @@ class ClicksTest extends \MailPoetTest { 'link' => $link, 'preview' => false, ]; - $queue = SendingTask::createFromQueue(SendingQueue::findOne($queue->getId())); + $queue = SendingQueue::findOne($queue->getId()); + assert($queue instanceof SendingQueue); + $queue = SendingTask::createFromQueue($queue); $queue->updateProcessedSubscribers([$subscriberModel->id]); // instantiate class $this->settingsController = Stub::makeEmpty(SettingsController::class, [ 'get' => false, ], $this); - $this->clicks = new Clicks($this->settingsController, new Cookies()); + $this->clicks = new Clicks($this->settingsController, new Cookies(), $this->diContainer->get(Shortcodes::class)); } public function testItAbortsWhenTrackDataIsEmptyOrMissingLink() {