Free up shortcodes constructor for DI

[MAILPOET-2993]
This commit is contained in:
Pavel Dohnal
2020-11-04 10:26:07 +01:00
committed by Veljko V
parent 7d538abad8
commit 6139e300c3
13 changed files with 297 additions and 193 deletions

View File

@ -46,7 +46,12 @@ class Newsletter {
/** @var Emoji */ /** @var Emoji */
private $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(); $settings = SettingsController::getInstance();
$this->trackingEnabled = (boolean)$settings->get('tracking.enabled'); $this->trackingEnabled = (boolean)$settings->get('tracking.enabled');
if ($wp === null) { if ($wp === null) {

View File

@ -2,11 +2,49 @@
namespace MailPoet\Cron\Workers\SendingQueue\Tasks; 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\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending;
class Shortcodes { class Shortcodes {
public static function process($content, $contentSource = null, $newsletter = null, $subscriber = null, $queue = null) { 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); return $shortcodes->replace($content, $contentSource);
} }
} }

View File

@ -308,6 +308,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::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\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\Statistics\NewsletterStatisticsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class)->setPublic(true);

View File

@ -2,6 +2,7 @@
namespace MailPoet\Newsletter\Links; namespace MailPoet\Newsletter\Links;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\NewsletterLink; use MailPoet\Models\NewsletterLink;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Shortcodes\Categories\Link; use MailPoet\Newsletter\Shortcodes\Categories\Link;
@ -29,7 +30,8 @@ class Links {
public static function extract($content) { public static function extract($content) {
$extractedLinks = []; $extractedLinks = [];
// extract link shortcodes // extract link shortcodes
$shortcodes = new Shortcodes(); /** @var Shortcodes $shortcodes */
$shortcodes = ContainerWrapper::getInstance()->get(Shortcodes::class);
$shortcodes = $shortcodes->extract( $shortcodes = $shortcodes->extract(
$content, $content,
$categories = [Link::CATEGORY_NAME] $categories = [Link::CATEGORY_NAME]
@ -97,7 +99,7 @@ class Links {
foreach ($matches[1] as $index => $match) { foreach ($matches[1] as $index => $match) {
$hash = null; $hash = null;
if (preg_match('/-/', $match)) { if (preg_match('/-/', $match)) {
list(, $hash) = explode('-', $match); [, $hash] = explode('-', $match);
} }
$linkTokens = new LinkTokens; $linkTokens = new LinkTokens;
$data = self::createUrlDataObject( $data = self::createUrlDataObject(

View File

@ -3,12 +3,13 @@
namespace MailPoet\Newsletter\Preview; namespace MailPoet\Newsletter\Preview;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Mailer\Mailer; use MailPoet\Mailer\Mailer;
use MailPoet\Mailer\MetaInfo; use MailPoet\Mailer\MetaInfo;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class SendPreviewController { class SendPreviewController {
@ -24,25 +25,29 @@ class SendPreviewController {
/** @var Renderer */ /** @var Renderer */
private $renderer; private $renderer;
/** @var Shortcodes */
private $shortcodes;
/** @var SubscribersRepository */
private $subscribersRepository;
public function __construct( public function __construct(
Mailer $mailer, Mailer $mailer,
MetaInfo $mailerMetaInfo, MetaInfo $mailerMetaInfo,
Renderer $renderer, Renderer $renderer,
WPFunctions $wp WPFunctions $wp,
SubscribersRepository $subscribersRepository,
Shortcodes $shortcodes
) { ) {
$this->mailer = $mailer; $this->mailer = $mailer;
$this->mailerMetaInfo = $mailerMetaInfo; $this->mailerMetaInfo = $mailerMetaInfo;
$this->wp = $wp; $this->wp = $wp;
$this->renderer = $renderer; $this->renderer = $renderer;
$this->shortcodes = $shortcodes;
$this->subscribersRepository = $subscribersRepository;
} }
public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) { 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); $renderedNewsletter = $this->renderer->renderAsPreview($newsletter);
$divider = '***MailPoet***'; $divider = '***MailPoet***';
$dataForShortcodes = array_merge( $dataForShortcodes = array_merge(
@ -52,19 +57,21 @@ class SendPreviewController {
$body = implode($divider, $dataForShortcodes); $body = implode($divider, $dataForShortcodes);
$subscriber = Subscriber::getCurrentWPUser() ?: false; $subscriber = Subscriber::getCurrentWPUser();
$shortcodes = new Shortcodes( if ($subscriber instanceof Subscriber) {
$newsletterModel, $subscriber = $this->subscribersRepository->findOneById($subscriber->id);
$subscriber, }
$queue = false, $this->shortcodes->setNewsletter($newsletter);
$wpUserPreview = true if ($subscriber instanceof SubscriberEntity) {
); $this->shortcodes->setSubscriber($subscriber);
}
$this->shortcodes->setWpUserPreview(true);
list( [
$renderedNewsletter['subject'], $renderedNewsletter['subject'],
$renderedNewsletter['body']['html'], $renderedNewsletter['body']['html'],
$renderedNewsletter['body']['text'] $renderedNewsletter['body']['text'],
) = explode($divider, $shortcodes->replace($body)); ] = explode($divider, $this->shortcodes->replace($body));
$renderedNewsletter['id'] = $newsletter->getId(); $renderedNewsletter['id'] = $newsletter->getId();
$extraParams = [ $extraParams = [

View File

@ -2,24 +2,42 @@
namespace MailPoet\Newsletter\Shortcodes; namespace MailPoet\Newsletter\Shortcodes;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class Shortcodes { class Shortcodes {
const SHORTCODE_CATEGORY_NAMESPACE = 'MailPoet\Newsletter\Shortcodes\Categories\\'; const SHORTCODE_CATEGORY_NAMESPACE = 'MailPoet\Newsletter\Shortcodes\Categories\\';
public $newsletter;
public $subscriber;
public $queue;
public $wpUserPreview;
public function __construct( /** @var NewsletterEntity|null */
$newsletter = false, private $newsletter;
$subscriber = false,
$queue = false, /** @var SubscriberEntity|null */
$wpUserPreview = false private $subscriber;
) {
/** @var SendingQueueEntity|null */
private $queue;
/** @var bool */
private $wpUserPreview = false;
public function setNewsletter(NewsletterEntity $newsletter): void {
$this->newsletter = $newsletter; $this->newsletter = $newsletter;
}
public function setSubscriber(SubscriberEntity $subscriber = null): void {
$this->subscriber = $subscriber; $this->subscriber = $subscriber;
}
public function setQueue(SendingQueueEntity $queue): void {
$this->queue = $queue; $this->queue = $queue;
}
/**
* @param bool $wpUserPreview
*/
public function setWpUserPreview(bool $wpUserPreview): void {
$this->wpUserPreview = $wpUserPreview; $this->wpUserPreview = $wpUserPreview;
} }
@ -48,10 +66,9 @@ class Shortcodes {
} }
public function process($shortcodes, $content = false) { public function process($shortcodes, $content = false) {
$_this = $this; $processedShortcodes = [];
$processedShortcodes = array_map( foreach ($shortcodes as $shortcode) {
function($shortcode) use ($content, $_this) { $shortcodeDetails = $this->match($shortcode);
$shortcodeDetails = $_this->match($shortcode);
$shortcodeDetails['shortcode'] = $shortcode; $shortcodeDetails['shortcode'] = $shortcode;
$shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ? $shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ?
$shortcodeDetails['category'] : $shortcodeDetails['category'] :
@ -71,25 +88,25 @@ class Shortcodes {
$customShortcode = WPFunctions::get()->applyFilters( $customShortcode = WPFunctions::get()->applyFilters(
'mailpoet_newsletter_shortcode', 'mailpoet_newsletter_shortcode',
$shortcode, $shortcode,
$_this->newsletter, $this->newsletter,
$_this->subscriber, $this->subscriber,
$_this->queue, $this->queue,
$content, $content,
$_this->wpUserPreview $this->wpUserPreview
); );
return ($customShortcode === $shortcode) ? $processedShortcodes[] = ($customShortcode === $shortcode) ?
false : false :
$customShortcode; $customShortcode;
} }
return $shortcodeClass::process( $processedShortcodes[] = $shortcodeClass::process(
$shortcodeDetails, $shortcodeDetails,
$_this->newsletter, $this->newsletter,
$_this->subscriber, $this->subscriber,
$_this->queue, $this->queue,
$content, $content,
$_this->wpUserPreview $this->wpUserPreview
); );
}, $shortcodes); }
return $processedShortcodes; return $processedShortcodes;
} }

View File

@ -2,13 +2,21 @@
namespace MailPoet\Newsletter\ViewInBrowser; 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\Newsletter;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending;
use MailPoet\WP\Emoji; use MailPoet\WP\Emoji;
class ViewInBrowserRenderer { class ViewInBrowserRenderer {
@ -21,14 +29,19 @@ class ViewInBrowserRenderer {
/** @var Renderer */ /** @var Renderer */
private $renderer; private $renderer;
/** @var Shortcodes */
private $shortcodes;
public function __construct( public function __construct(
Emoji $emoji, Emoji $emoji,
SettingsController $settings, SettingsController $settings,
Shortcodes $shortcodes,
Renderer $renderer Renderer $renderer
) { ) {
$this->emoji = $emoji; $this->emoji = $emoji;
$this->isTrackingEnabled = $settings->get('tracking.enabled'); $this->isTrackingEnabled = $settings->get('tracking.enabled');
$this->renderer = $renderer; $this->renderer = $renderer;
$this->shortcodes = $shortcodes;
} }
public function render( public function render(
@ -61,13 +74,13 @@ class ViewInBrowserRenderer {
$newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html'); $newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html');
} }
} }
$shortcodes = new Shortcodes( $this->prepareShortcodes(
$newsletter, $newsletter,
$subscriber ?: false, $subscriber ?: false,
$queue ?: false, $queue ?: false,
$wpUserPreview $wpUserPreview
); );
$renderedNewsletter = $shortcodes->replace($newsletterBody); $renderedNewsletter = $this->shortcodes->replace($newsletterBody);
if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) { if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) {
$renderedNewsletter = Links::replaceSubscriberData( $renderedNewsletter = Links::replaceSubscriberData(
$subscriber->id, $subscriber->id,
@ -77,4 +90,36 @@ class ViewInBrowserRenderer {
} }
return $renderedNewsletter; 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);
}
}
} }

View File

@ -27,9 +27,17 @@ class Clicks {
/** @var Cookies */ /** @var Cookies */
private $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->settingsController = $settingsController;
$this->cookies = $cookies; $this->cookies = $cookies;
$this->shortcodes = $shortcodes;
} }
/** /**
@ -115,8 +123,11 @@ class Clicks {
$wpUserPreview $wpUserPreview
); );
} else { } else {
$shortcodes = new Shortcodes($newsletter, $subscriber, $queue, $wpUserPreview); $this->shortcodes->setQueue($queue);
$url = $shortcodes->replace($url); $this->shortcodes->setNewsletter($newsletter);
$this->shortcodes->setSubscriber($subscriber);
$this->shortcodes->setWpUserPreview($wpUserPreview);
$url = $this->shortcodes->replace($url);
} }
return $url; return $url;
} }

View File

@ -9,7 +9,9 @@ use MailPoet\Mailer\Mailer;
use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\MetaInfo; use MailPoet\Mailer\MetaInfo;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Newsletter\Url; use MailPoet\Newsletter\Url;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Subscription\SubscriptionUrlFactory;
use MailPoet\Util\Security; use MailPoet\Util\Security;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -68,7 +70,9 @@ class SendPreviewControllerTest extends \MailPoetTest {
$mailer, $mailer,
new MetaInfo(), new MetaInfo(),
$this->diContainer->get(Renderer::class), $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'); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
} }
@ -95,7 +99,9 @@ class SendPreviewControllerTest extends \MailPoetTest {
$mailer, $mailer,
new MetaInfo(), new MetaInfo(),
$this->diContainer->get(Renderer::class), $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'); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
} }

View File

@ -3,11 +3,13 @@
namespace MailPoet\Test\Newsletter; namespace MailPoet\Test\Newsletter;
use MailPoet\Config\Populator; 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\Newsletter;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberCustomField;
use MailPoet\Newsletter\Shortcodes\Categories\Date; use MailPoet\Newsletter\Shortcodes\Categories\Date;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\Url as NewsletterUrl;
@ -15,17 +17,16 @@ use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Subscription\SubscriptionUrlFactory;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM;
require_once(ABSPATH . 'wp-admin/includes/user.php'); require_once(ABSPATH . 'wp-admin/includes/user.php');
class ShortcodesTest extends \MailPoetTest { class ShortcodesTest extends \MailPoetTest {
public $newsletterId; private $wPPost;
public $wPPost; private $wPUser;
public $wPUser; /** @var NewsletterEntity */
public $renderedNewsletter; private $newsletter;
public $newsletter; /** @var SubscriberEntity */
public $subscriber; private $subscriber;
/** @var Shortcodes */ /** @var Shortcodes */
private $shortcodesObject; private $shortcodesObject;
/** @var SettingsController */ /** @var SettingsController */
@ -42,10 +43,9 @@ class ShortcodesTest extends \MailPoetTest {
$this->wPPost = $this->_createWPPost(); $this->wPPost = $this->_createWPPost();
$this->subscriber = $this->_createSubscriber(); $this->subscriber = $this->_createSubscriber();
$this->newsletter = $this->_createNewsletter(); $this->newsletter = $this->_createNewsletter();
$this->shortcodesObject = new Shortcodes( $this->shortcodesObject = $this->diContainer->get(Shortcodes::class);
$this->newsletter, $this->shortcodesObject->setNewsletter($this->newsletter);
$this->subscriber $this->shortcodesObject->setSubscriber($this->subscriber);
);
$this->settings->set('tracking.enabled', false); $this->settings->set('tracking.enabled', false);
$this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens); $this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens);
} }
@ -123,7 +123,7 @@ class ShortcodesTest extends \MailPoetTest {
'<a href="#">not post</a>'; '<a href="#">not post</a>';
$result = $result =
$shortcodesObject->process(['[newsletter:subject]'], $content); $shortcodesObject->process(['[newsletter:subject]'], $content);
expect($result[0])->equals($this->newsletter->subject); expect($result[0])->equals($this->newsletter->getSubject());
$result = $result =
$shortcodesObject->process(['[newsletter:total]'], $content); $shortcodesObject->process(['[newsletter:total]'], $content);
expect($result[0])->equals(2); expect($result[0])->equals(2);
@ -136,65 +136,42 @@ class ShortcodesTest extends \MailPoetTest {
public function itCanProcessPostNotificationNewsletterNumberShortcode() { public function itCanProcessPostNotificationNewsletterNumberShortcode() {
// create first post notification // create first post notification
$postNotificationHistory = $this->_createNewsletter( $postNotificationHistory = $this->_createNewsletter(
$parentId = $this->newsletterId, $parentId = $this->newsletter,
$type = Newsletter::TYPE_NOTIFICATION_HISTORY $type = Newsletter::TYPE_NOTIFICATION_HISTORY
); );
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $this->shortcodesObject->setNewsletter($postNotificationHistory);
$postNotificationHistory, $result = $this->shortcodesObject->process(['[newsletter:number]']);
$this->subscriber
);
$result = $shortcodesObject->process(['[newsletter:number]']);
expect($result['0'])->equals(1); expect($result['0'])->equals(1);
// create another post notification // create another post notification
$postNotificationHistory = $this->_createNewsletter( $postNotificationHistory = $this->_createNewsletter(
$parentId = $this->newsletterId, $parentId = $this->newsletter,
$type = Newsletter::TYPE_NOTIFICATION_HISTORY $type = Newsletter::TYPE_NOTIFICATION_HISTORY
); );
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $this->shortcodesObject->setNewsletter($postNotificationHistory);
$postNotificationHistory, $result = $this->shortcodesObject->process(['[newsletter:number]']);
$this->subscriber
);
$result = $shortcodesObject->process(['[newsletter:number]']);
expect($result['0'])->equals(2); expect($result['0'])->equals(2);
} }
public function testSubscriberShortcodesRequireSubscriberObjectOrFalseValue() { public function testSubscriberShortcodesRequireSubscriberObjectOrFalseValue() {
// when subscriber is empty, default value is returned // when subscriber is empty, default value is returned
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $this->shortcodesObject->setSubscriber(null);
$this->newsletter, $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
$subscriber = false
);
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
expect($result[0])->equals('test'); expect($result[0])->equals('test');
// when subscriber is an object, proper value is returned // when subscriber is an object, proper value is returned
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $this->shortcodesObject->setSubscriber($this->subscriber);
$this->newsletter, $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
$this->subscriber expect($result[0])->equals($this->subscriber->getFirstName());
);
$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]');
} }
public function testSubscriberFirstAndLastNameShortcodesReturnDefaultValueWhenDataIsEmpty() { public function testSubscriberFirstAndLastNameShortcodesReturnDefaultValueWhenDataIsEmpty() {
// when subscriber exists but first or last names are empty, default value is returned // when subscriber exists but first or last names are empty, default value is returned
$subscriber = $this->subscriber; $subscriber = $this->subscriber;
$subscriber->firstName = ''; $subscriber->setFirstName('');
$subscriber->lastName = ''; $subscriber->setLastName('');
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
$this->newsletter,
$subscriber
);
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
expect($result[0])->equals('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'); expect($result[0])->equals('test');
} }
@ -202,10 +179,10 @@ class ShortcodesTest extends \MailPoetTest {
$shortcodesObject = $this->shortcodesObject; $shortcodesObject = $this->shortcodesObject;
$result = $result =
$shortcodesObject->process(['[subscriber:firstname]']); $shortcodesObject->process(['[subscriber:firstname]']);
expect($result[0])->equals($this->subscriber->first_name); expect($result[0])->equals($this->subscriber->getFirstName());
$result = $result =
$shortcodesObject->process(['[subscriber:lastname]']); $shortcodesObject->process(['[subscriber:lastname]']);
expect($result[0])->equals($this->subscriber->last_name); expect($result[0])->equals($this->subscriber->getLastName());
$result = $result =
$shortcodesObject->process(['[subscriber:displayname]']); $shortcodesObject->process(['[subscriber:displayname]']);
expect($result[0])->equals($this->wPUser->user_login); expect($result[0])->equals($this->wPUser->user_login);
@ -215,13 +192,11 @@ class ShortcodesTest extends \MailPoetTest {
$result = $result =
$shortcodesObject->process(['[subscriber:count]']); $shortcodesObject->process(['[subscriber:count]']);
expect($result[0])->equals($subscriberCount); expect($result[0])->equals($subscriberCount);
$this->subscriber->status = 'unsubscribed'; $this->subscriber->setStatus('unsubscribed');
$this->subscriber->save();
$result = $result =
$shortcodesObject->process(['[subscriber:count]']); $shortcodesObject->process(['[subscriber:count]']);
expect($result[0])->equals($subscriberCount - 1); expect($result[0])->equals($subscriberCount - 1);
$this->subscriber->status = 'bounced'; $this->subscriber->setStatus('bounced');
$this->subscriber->save();
$result = $result =
$shortcodesObject->process(['[subscriber:count]']); $shortcodesObject->process(['[subscriber:count]']);
expect($result[0])->equals($subscriberCount - 1); expect($result[0])->equals($subscriberCount - 1);
@ -230,23 +205,22 @@ class ShortcodesTest extends \MailPoetTest {
public function testItCanProcessSubscriberCustomFieldShortcodes() { public function testItCanProcessSubscriberCustomFieldShortcodes() {
$shortcodesObject = $this->shortcodesObject; $shortcodesObject = $this->shortcodesObject;
$subscriber = $this->subscriber; $subscriber = $this->subscriber;
$customField = CustomField::create(); $customField = new CustomFieldEntity();
$customField->name = 'custom_field_name'; $customField->setName('custom_field_name');
$customField->type = 'text'; $customField->setType('text');
$customField->save(); $this->entityManager->persist($customField);
$this->entityManager->flush();
$result = $shortcodesObject->process( $result = $shortcodesObject->process(
['[subscriber:cf_' . $customField->id . ']'] ['[subscriber:cf_' . $customField->getId() . ']']
); );
expect($result[0])->false(); expect($result[0])->false();
$subscriberCustomField = SubscriberCustomField::create(); $subscriberCustomField = new SubscriberCustomFieldEntity($subscriber, $customField, 'custom_field_value');
$subscriberCustomField->subscriberId = $subscriber->id; $this->entityManager->persist($subscriberCustomField);
$subscriberCustomField->customFieldId = (int)$customField->id; $this->entityManager->flush();
$subscriberCustomField->value = 'custom_field_value';
$subscriberCustomField->save();
$result = $shortcodesObject->process( $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() { public function testItCanProcessLinkShortcodes() {
@ -288,7 +262,7 @@ class ShortcodesTest extends \MailPoetTest {
'[link:newsletter_view_in_browser_url]', '[link:newsletter_view_in_browser_url]',
]; ];
// tracking function only works during sending, so queue object must not be false // tracking function only works during sending, so queue object must not be false
$shortcodesObject->queue = true; $shortcodesObject->setQueue($this->_createQueue());
$result = $shortcodesObject->process($initialShortcodes); $result = $shortcodesObject->process($initialShortcodes);
foreach ($result as $index => $transformedShortcode) { foreach ($result as $index => $transformedShortcode) {
// 1. result must not contain a link // 1. result must not contain a link
@ -303,7 +277,7 @@ class ShortcodesTest extends \MailPoetTest {
public function testItReturnsDefaultLinksWhenPreviewIsEnabled() { public function testItReturnsDefaultLinksWhenPreviewIsEnabled() {
$shortcodesObject = $this->shortcodesObject; $shortcodesObject = $this->shortcodesObject;
$shortcodesObject->wpUserPreview = true; $shortcodesObject->setWpUserPreview(true);
$shortcodes = [ $shortcodes = [
'[link:subscription_unsubscribe_url]', '[link:subscription_unsubscribe_url]',
'[link:subscription_instant_unsubscribe_url]', '[link:subscription_instant_unsubscribe_url]',
@ -336,7 +310,7 @@ class ShortcodesTest extends \MailPoetTest {
expect($result[0])->equals('success'); expect($result[0])->equals('success');
$this->settings->set('tracking.enabled', true); $this->settings->set('tracking.enabled', true);
// tracking function only works during sending, so queue object must not be false // tracking function only works during sending, so queue object must not be false
$shortcodesObject->queue = true; $shortcodesObject->setQueue($this->_createQueue());
$result = $shortcodesObject->process([$shortcode]); $result = $shortcodesObject->process([$shortcode]);
expect($result[0])->equals($shortcode); expect($result[0])->equals($shortcode);
} }
@ -351,54 +325,45 @@ class ShortcodesTest extends \MailPoetTest {
} }
public function _createWPUser() { 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'); $wPUser = get_user_by('login', 'phoenix_test_user');
return $wPUser; return $wPUser;
} }
public function _createSubscriber() { public function _createSubscriber(): SubscriberEntity {
$subscriber = Subscriber::create(); $subscriber = new SubscriberEntity();
$subscriber->hydrate( $subscriber->setFirstName('Donald');
[ $subscriber->setLastName('Trump');
'first_name' => 'Donald', $subscriber->setEmail('mister@trump.com');
'last_name' => 'Trump', $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
'email' => 'mister@trump.com', $subscriber->setWpUserId($this->wPUser->ID);
'status' => Subscriber::STATUS_SUBSCRIBED, return $subscriber;
'WP_user_id' => $this->wPUser->ID,
]
);
$subscriber->save();
return Subscriber::findOne($subscriber->id);
} }
public function _createNewsletter($parentId = null, $type = Newsletter::TYPE_NOTIFICATION) { public function _createNewsletter(NewsletterEntity $parent = null, $type = Newsletter::TYPE_NOTIFICATION): NewsletterEntity {
$newsletter = Newsletter::create(); $newsletter = new NewsletterEntity();
$newsletter->hydrate( $newsletter->setSubject('some subject');
[ $newsletter->setType($type);
'subject' => 'some subject', $newsletter->setStatus(NewsletterEntity::STATUS_SENT);
'type' => $type, if ($parent) {
'status' => Newsletter::STATUS_SENT, $newsletter->setParent($parent);
'parent_id' => $parentId, }
] return $newsletter;
);
$newsletter->save();
return Newsletter::findOne($newsletter->id);
} }
public function _createQueue() { /** @return SendingQueueEntity */
$queue = SendingQueue::create(); public function _createQueue(): SendingQueueEntity {
$queue->newsletterId = $this->newsletter['id']; $queue = new SendingQueueEntity();
$queue->status = 'completed'; $queue->setNewsletter($this->newsletter);
$queue->save(); return $queue;
return SendingQueue::findOne($queue->id);
} }
public function _after() { public function _after() {
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); $this->truncateEntity(NewsletterEntity::class);
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); $this->truncateEntity(SubscriberEntity::class);
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); $this->truncateEntity(SendingQueueEntity::class);
ORM::raw_execute('TRUNCATE ' . CustomField::$_table); $this->truncateEntity(CustomFieldEntity::class);
ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table); $this->truncateEntity(SubscriberCustomFieldEntity::class);
wp_delete_post($this->wPPost, true); wp_delete_post($this->wPPost, true);
wp_delete_user($this->wPUser->ID); wp_delete_user($this->wPUser->ID);
} }

View File

@ -10,6 +10,7 @@ use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Router\Router; use MailPoet\Router\Router;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
@ -153,6 +154,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
$viewInBrowser = new ViewInBrowserRenderer( $viewInBrowser = new ViewInBrowserRenderer(
$emoji, $emoji,
$this->diContainer->get(SettingsController::class), $this->diContainer->get(SettingsController::class),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Renderer::class) $this->diContainer->get(Renderer::class)
); );
$renderedBody = $viewInBrowser->render( $renderedBody = $viewInBrowser->render(

View File

@ -66,7 +66,9 @@ class TrackTest extends \MailPoetTest {
'link_hash' => $link->getHash(), 'link_hash' => $link->getHash(),
'preview' => false, '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]); $queue->updateProcessedSubscribers([$subscriberModel->id]);
// instantiate class // instantiate class
$this->track = $this->diContainer->get(Track::class); $this->track = $this->diContainer->get(Track::class);

View File

@ -15,6 +15,7 @@ use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsClicks; use MailPoet\Models\StatisticsClicks;
use MailPoet\Models\StatisticsOpens; use MailPoet\Models\StatisticsOpens;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\Clicks; use MailPoet\Statistics\Track\Clicks;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
@ -75,13 +76,15 @@ class ClicksTest extends \MailPoetTest {
'link' => $link, 'link' => $link,
'preview' => false, '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]); $queue->updateProcessedSubscribers([$subscriberModel->id]);
// instantiate class // instantiate class
$this->settingsController = Stub::makeEmpty(SettingsController::class, [ $this->settingsController = Stub::makeEmpty(SettingsController::class, [
'get' => false, 'get' => false,
], $this); ], $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() { public function testItAbortsWhenTrackDataIsEmptyOrMissingLink() {