From 9d9efccd983da40ad9990ebd39e7b97f9631f8e5 Mon Sep 17 00:00:00 2001 From: Brezo Cordero <8002881+brezocordero@users.noreply.github.com> Date: Wed, 18 Aug 2021 13:10:41 -0500 Subject: [PATCH] Refactor ViewInBrowser to Doctrine Use NewsletterEntity and NewslettersRepository instead of MailPoet\Models\Newsletter. [MAILPOET-3673] --- .../ViewInBrowser/ViewInBrowserController.php | 20 ++-- .../ViewInBrowser/ViewInBrowserRenderer.php | 7 +- .../ViewInBrowserControllerTest.php | 96 +++++++++++++++---- .../ViewInBrowserRendererTest.php | 27 ++++-- 4 files changed, 111 insertions(+), 39 deletions(-) diff --git a/lib/Newsletter/ViewInBrowser/ViewInBrowserController.php b/lib/Newsletter/ViewInBrowser/ViewInBrowserController.php index 2ffce4418c..4feff9b3e6 100644 --- a/lib/Newsletter/ViewInBrowser/ViewInBrowserController.php +++ b/lib/Newsletter/ViewInBrowser/ViewInBrowserController.php @@ -2,8 +2,9 @@ namespace MailPoet\Newsletter\ViewInBrowser; +use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Models\Newsletter; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Subscribers\LinkTokens; @@ -25,9 +26,13 @@ class ViewInBrowserController { /** @var SendingQueuesRepository */ private $sendingQueuesRepository; + /** @var NewslettersRepository */ + private $newslettersRepository; + public function __construct( LinkTokens $linkTokens, NewsletterUrl $newsletterUrl, + NewslettersRepository $newslettersRepository, ViewInBrowserRenderer $viewInBrowserRenderer, SendingQueuesRepository $sendingQueuesRepository, SubscribersRepository $subscribersRepository @@ -37,6 +42,7 @@ class ViewInBrowserController { $this->subscribersRepository = $subscribersRepository; $this->sendingQueuesRepository = $sendingQueuesRepository; $this->newsletterUrl = $newsletterUrl; + $this->newslettersRepository = $newslettersRepository; } public function view(array $data) { @@ -69,12 +75,12 @@ class ViewInBrowserController { throw new \InvalidArgumentException("Missing 'newsletter_hash'"); } - $newsletter = Newsletter::findOne($data['newsletter_id']) ?: null; + $newsletter = $this->newslettersRepository->findOneById($data['newsletter_id']); if (!$newsletter) { throw new \InvalidArgumentException("Invalid 'newsletter_id'"); } - if ($data['newsletter_hash'] !== $newsletter->hash) { + if ($data['newsletter_hash'] !== $newsletter->getHash()) { throw new \InvalidArgumentException("Invalid 'newsletter_hash'"); } return $newsletter; @@ -101,19 +107,19 @@ class ViewInBrowserController { return $subscriber; } - private function getQueue(Newsletter $newsletter, array $data): ?SendingQueueEntity { + private function getQueue(NewsletterEntity $newsletter, array $data): ?SendingQueueEntity { // queue is optional; try to find it if it's not defined and this is not a welcome email - if ($newsletter->type === Newsletter::TYPE_WELCOME) { + if ($newsletter->getType() === NewsletterEntity::TYPE_WELCOME) { return null; } // reset queue when automatic email is being previewed - if ($newsletter->type === Newsletter::TYPE_AUTOMATIC && !empty($data['preview'])) { + if ($newsletter->getType() === NewsletterEntity::TYPE_AUTOMATIC && !empty($data['preview'])) { return null; } return !empty($data['queue_id']) ? $this->sendingQueuesRepository->findOneById($data['queue_id']) - : $this->sendingQueuesRepository->findOneBy(['newsletter' => $newsletter->id]); + : $this->sendingQueuesRepository->findOneBy(['newsletter' => $newsletter->getId()]); } } diff --git a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php index 0aa677f078..9b0509fbdd 100644 --- a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php +++ b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php @@ -6,7 +6,6 @@ use MailPoet\DI\ContainerWrapper; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberEntity; -use MailPoet\Models\Newsletter; use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\Renderer; @@ -46,7 +45,7 @@ class ViewInBrowserRenderer { public function render( bool $isPreview, - Newsletter $newsletter, + NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null ) { @@ -104,9 +103,7 @@ class ViewInBrowserRenderer { 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); } diff --git a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserControllerTest.php b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserControllerTest.php index 205282277f..f46b6a46d0 100644 --- a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserControllerTest.php +++ b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserControllerTest.php @@ -7,12 +7,13 @@ use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberEntity; -use MailPoet\Models\Newsletter; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Url; use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Tasks\Sending as SendingTask; +use MailPoet\Util\Security; class ViewInBrowserControllerTest extends \MailPoetTest { /** @var ViewInBrowserController */ @@ -24,7 +25,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { /** @var SubscribersRepository */ private $subscribersRepository; - /** @var Newsletter */ + /** @var NewsletterEntity */ private $newsletter; /** @var SubscriberEntity */ @@ -39,6 +40,9 @@ class ViewInBrowserControllerTest extends \MailPoetTest { /** @var SendingQueuesRepository */ private $sendingQueuesRepository; + /** @var NewslettersRepository */ + private $newslettersRepository; + /** @var Url */ private $newsletterUrl; @@ -48,12 +52,67 @@ class ViewInBrowserControllerTest extends \MailPoetTest { $this->linkTokens = $this->diContainer->get(LinkTokens::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->sendingQueuesRepository = $this->diContainer->get(SendingQueuesRepository::class); + $this->newslettersRepository = $this->diContainer->get(NewslettersRepository::class); $this->newsletterUrl = $this->diContainer->get(Url::class); // create newsletter - $newsletter = Newsletter::create(); - $newsletter->type = 'type'; - $this->newsletter = $newsletter->save(); + $newsletterData = [ + 'body' => json_decode( + '{ + "content": { + "type": "container", + "orientation": "vertical", + "styles": { + "block": { + "backgroundColor": "transparent" + } + }, + "blocks": [ + { + "type": "container", + "orientation": "horizontal", + "styles": { + "block": { + "backgroundColor": "transparent" + } + }, + "blocks": [ + { + "type": "container", + "orientation": "vertical", + "styles": { + "block": { + "backgroundColor": "transparent" + } + }, + "blocks": [ + { + "type": "text", + "text": "
Rendered newsletter. Hello, [subscriber:firstname | default:reader]. Unsubscribe or visit Google
" + } + ] + } + ] + } + ] + } + }', true), + 'subject' => 'Some subject', + 'preheader' => 'Some preheader', + 'type' => 'standard', + 'status' => 'active', + ]; + // create newsletter + $newsletter = new NewsletterEntity(); + $newsletter->setSubject($newsletterData['subject']); + $newsletter->setPreheader($newsletterData['preheader']); + $newsletter->setType($newsletterData['type']); + $newsletter->setStatus($newsletterData['status']); + $newsletter->setBody($newsletterData['body']); + $newsletter->setHash(Security::generateHash()); + $this->newslettersRepository->persist($newsletter); + $this->newslettersRepository->flush(); + $this->newsletter = $newsletter; // create subscriber $subscriber = new SubscriberEntity(); @@ -66,17 +125,17 @@ class ViewInBrowserControllerTest extends \MailPoetTest { // create task & queue $sendingTask = SendingTask::create(); - $sendingTask->newsletterId = $newsletter->id; + $sendingTask->newsletterId = $newsletter->getId(); $sendingTask->setSubscribers([$subscriber->getId()]); $sendingTask->updateProcessedSubscribers([$subscriber->getId()]); $this->sendingTask = $sendingTask->save(); - + $this->newslettersRepository->refresh($newsletter); // build browser preview data $this->browserPreviewData = [ 'queue_id' => $sendingTask->queue()->id, 'subscriber_id' => $subscriber->getId(), - 'newsletter_id' => $newsletter->id, - 'newsletter_hash' => $newsletter->hash, + 'newsletter_id' => $newsletter->getId(), + 'newsletter_hash' => $newsletter->getHash(), 'subscriber_token' => $this->linkTokens->getToken($subscriber), 'preview' => false, ]; @@ -127,7 +186,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { public function testItSetsSubscriberToLoggedInWPUserWhenPreviewIsEnabled() { $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ - 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { + 'render' => Expected::once(function (bool $isPreview, NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { assert($subscriber !== null); // PHPStan expect($subscriber)->notNull(); expect($subscriber->getId())->equals(1); @@ -148,7 +207,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { public function testItGetsQueueByQueueId() { $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ - 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { + 'render' => Expected::once(function (bool $isPreview, NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { assert($queue !== null); // PHPStan expect($queue)->notNull(); expect($queue->getId())->equals($this->sendingTask->id); @@ -164,7 +223,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { public function testItGetsQueueByNewsletter() { $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ - 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { + 'render' => Expected::once(function (bool $isPreview, NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { assert($queue !== null); // PHPStan expect($queue)->notNull(); expect($queue->getId())->equals($this->sendingTask->queue()->id); @@ -180,7 +239,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { public function testItResetsQueueForWelcomeEmails() { $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ - 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { + 'render' => Expected::once(function (bool $isPreview, NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { expect($queue)->null(); }), ]); @@ -189,14 +248,14 @@ class ViewInBrowserControllerTest extends \MailPoetTest { // queue will be set to null for welcome email $newsletter = $this->newsletter; - $newsletter->type = Newsletter::TYPE_WELCOME; - $newsletter->save(); + $newsletter->setType(NewsletterEntity::TYPE_WELCOME); + $this->newslettersRepository->flush(); $viewInBrowserController->view($this->browserPreviewData); } public function testItResetsQueueForAutomaticEmailsInPreview() { $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ - 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { + 'render' => Expected::once(function (bool $isPreview, NewsletterEntity $newsletter, SubscriberEntity $subscriber = null, SendingQueueEntity $queue = null) { expect($queue)->null(); }), ]); @@ -207,8 +266,8 @@ class ViewInBrowserControllerTest extends \MailPoetTest { $data = $this->browserPreviewData; $data['preview'] = true; $newsletter = $this->newsletter; - $newsletter->type = Newsletter::TYPE_AUTOMATIC; - $newsletter->save(); + $newsletter->setType(NewsletterEntity::TYPE_AUTOMATIC); + $this->newslettersRepository->flush(); $viewInBrowserController->view($data); } @@ -235,6 +294,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest { return new ViewInBrowserController( $this->linkTokens, $this->newsletterUrl, + $this->newslettersRepository, $viewInBrowserRenderer, $this->sendingQueuesRepository, $this->subscribersRepository diff --git a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php index d5104a92fa..883207314d 100644 --- a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php +++ b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php @@ -8,9 +8,9 @@ use MailPoet\Entities\NewsletterLinkEntity; use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberEntity; -use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterLink; use MailPoet\Newsletter\Links\Links; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Shortcodes\Shortcodes; @@ -27,7 +27,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest { /** @var ViewInBrowserRenderer */ private $viewInBrowserRenderer; - /** @var Newsletter */ + /** @var NewsletterEntity */ public $newsletter; /** @var SendingTask */ @@ -48,9 +48,13 @@ class ViewInBrowserRendererTest extends \MailPoetTest { /** @var SendingQueuesRepository */ private $sendingQueueRepository; + /** @var NewslettersRepository */ + private $newsletterRepository; + public function _before() { $this->sendingQueueRepository = $this->diContainer->get(SendingQueuesRepository::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); + $this->newsletterRepository = $this->diContainer->get(NewslettersRepository::class); $newsletterData = [ 'body' => json_decode( '{ @@ -92,7 +96,6 @@ class ViewInBrowserRendererTest extends \MailPoetTest { ] } }', true), - 'id' => 1, 'subject' => 'Some subject', 'preheader' => 'Some preheader', 'type' => 'standard', @@ -108,9 +111,15 @@ class ViewInBrowserRendererTest extends \MailPoetTest { ]; // create newsletter - $newsletter = Newsletter::create(); - $newsletter->hydrate($newsletterData); - $this->newsletter = $newsletter->save(); + $newsletter = new NewsletterEntity(); + $newsletter->setSubject($newsletterData['subject']); + $newsletter->setPreheader($newsletterData['preheader']); + $newsletter->setType($newsletterData['type']); + $newsletter->setStatus($newsletterData['status']); + $newsletter->setBody($newsletterData['body']); + $this->newsletterRepository->persist($newsletter); + $this->newsletterRepository->flush(); + $this->newsletter = $newsletter; // create subscriber $subscriber = new SubscriberEntity(); @@ -123,7 +132,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest { // create queue $queue = SendingTask::create(); - $queue->newsletterId = $newsletter->id; + $queue->newsletterId = $newsletter->getId(); $queue->newsletterRenderedBody = $this->queueRenderedNewsletterWithoutTracking; $queue->setSubscribers([$subscriber->getId()]); $this->sendingTask = $queue->save(); @@ -132,14 +141,14 @@ class ViewInBrowserRendererTest extends \MailPoetTest { $newsletterLink1 = NewsletterLink::create(); $newsletterLink1->hash = '90e56'; $newsletterLink1->url = '[link:newsletter_view_in_browser_url]'; - $newsletterLink1->newsletterId = $this->newsletter->id; + $newsletterLink1->newsletterId = $this->newsletter->getId(); $newsletterLink1->queueId = $this->sendingTask->id; $newsletterLink1->save(); $newsletterLink2 = NewsletterLink::create(); $newsletterLink2->hash = 'i1893'; $newsletterLink2->url = 'http://google.com'; - $newsletterLink2->newsletterId = $this->newsletter->id; + $newsletterLink2->newsletterId = $this->newsletter->getId(); $newsletterLink2->queueId = $this->sendingTask->id; $newsletterLink2->save();