Update integration tests for usage SubscribersRepository

[MAILPOET-3268]
This commit is contained in:
Jan Lysý
2021-03-10 10:01:49 +01:00
committed by Veljko V
parent dffaab10a2
commit 7968db94ff
4 changed files with 71 additions and 51 deletions

View File

@ -76,7 +76,7 @@ class ViewInBrowserController {
return null; return null;
} }
$subscriber = Subscriber::findOne($data['subscriber_id']) ?: null; $subscriber = $this->subscribersRepository->findOneById($data['subscriber_id']);
if (!$subscriber) { if (!$subscriber) {
return null; return null;
} }
@ -85,7 +85,11 @@ class ViewInBrowserController {
throw new \InvalidArgumentException("Missing 'subscriber_token'"); throw new \InvalidArgumentException("Missing 'subscriber_token'");
} }
if (!$this->linkTokens->verifyToken($subscriber, $data['subscriber_token'])) { $subscriberModel = Subscriber::findOne($subscriber->getId());
if (!$subscriberModel) {
return null;
}
if (!$this->linkTokens->verifyToken($subscriberModel, $data['subscriber_token'])) {
throw new \InvalidArgumentException("Invalid 'subscriber_token'"); throw new \InvalidArgumentException("Invalid 'subscriber_token'");
} }
return $subscriber; return $subscriber;

View File

@ -3,11 +3,13 @@
namespace MailPoet\Newsletter\ViewInBrowser; namespace MailPoet\Newsletter\ViewInBrowser;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
@ -15,10 +17,16 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
/** @var ViewInBrowserController */ /** @var ViewInBrowserController */
private $viewInBrowserController; private $viewInBrowserController;
/** @var LinkTokens */
private $linkTokens;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var Newsletter */ /** @var Newsletter */
private $newsletter; private $newsletter;
/** @var Subscriber */ /** @var SubscriberEntity */
private $subscriber; private $subscriber;
/** @var SendingTask */ /** @var SendingTask */
@ -28,38 +36,43 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
private $browserPreviewData; private $browserPreviewData;
public function _before() { public function _before() {
// instantiate class
$this->viewInBrowserController = $this->diContainer->get(ViewInBrowserController::class);
$this->linkTokens = $this->diContainer->get(LinkTokens::class);
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
// create newsletter // create newsletter
$newsletter = Newsletter::create(); $newsletter = Newsletter::create();
$newsletter->type = 'type'; $newsletter->type = 'type';
$this->newsletter = $newsletter->save(); $this->newsletter = $newsletter->save();
// create subscriber // create subscriber
$subscriber = Subscriber::create(); $subscriber = new SubscriberEntity();
$subscriber->email = 'test@example.com'; $subscriber->setEmail('test@example.com');
$subscriber->firstName = 'First'; $subscriber->setFirstName('First');
$subscriber->lastName = 'Last'; $subscriber->setLastName('Last');
$this->subscriber = $subscriber->save(); $this->subscribersRepository->persist($subscriber);
$this->subscribersRepository->flush();
$this->subscriber = $subscriber;
// create task & queue // create task & queue
$sendingTask = SendingTask::create(); $sendingTask = SendingTask::create();
$sendingTask->newsletterId = $newsletter->id; $sendingTask->newsletterId = $newsletter->id;
$sendingTask->setSubscribers([$subscriber->id]); $sendingTask->setSubscribers([$subscriber->getId()]);
$sendingTask->updateProcessedSubscribers([$subscriber->id]); $sendingTask->updateProcessedSubscribers([$subscriber->getId()]);
$this->sendingTask = $sendingTask->save(); $this->sendingTask = $sendingTask->save();
$linkTokens = new LinkTokens; $linkTokens = new LinkTokens;
// build browser preview data // build browser preview data
$subscriberModel = Subscriber::findOne($subscriber->getId());
$this->browserPreviewData = [ $this->browserPreviewData = [
'queue_id' => $sendingTask->queue()->id, 'queue_id' => $sendingTask->queue()->id,
'subscriber_id' => $subscriber->id, 'subscriber_id' => $subscriber->getId(),
'newsletter_id' => $newsletter->id, 'newsletter_id' => $newsletter->id,
'newsletter_hash' => $newsletter->hash, 'newsletter_hash' => $newsletter->hash,
'subscriber_token' => $linkTokens->getToken($subscriber), 'subscriber_token' => $linkTokens->getToken($subscriberModel),
'preview' => false, 'preview' => false,
]; ];
// instantiate class
$this->viewInBrowserController = $this->diContainer->get(ViewInBrowserController::class);
} }
public function testItThrowsWhenDataIsMissing() { public function testItThrowsWhenDataIsMissing() {
@ -107,41 +120,35 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
public function testItSetsSubscriberToLoggedInWPUserWhenPreviewIsEnabled() { public function testItSetsSubscriberToLoggedInWPUserWhenPreviewIsEnabled() {
$viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [
'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, Subscriber $subscriber = null, SendingQueue $queue = null) { 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueue $queue = null) {
assert($subscriber !== null); // PHPStan assert($subscriber !== null); // PHPStan
expect($subscriber)->notNull(); expect($subscriber)->notNull();
expect($subscriber->id)->equals(1); expect($subscriber->getId())->equals(1);
}), }),
]); ]);
$viewInBrowserController = new ViewInBrowserController( $viewInBrowserController = $this->createController($viewInBrowserRenderer);
$this->diContainer->get(LinkTokens::class),
$viewInBrowserRenderer
);
$data = $this->browserPreviewData; $data = $this->browserPreviewData;
unset($data['subscriber_id']); unset($data['subscriber_id']);
$data['preview'] = true; $data['preview'] = true;
$this->subscriber->wpUserId = 1; $this->subscriber->setWpUserId(1);
$this->subscriber->save(); $this->subscribersRepository->flush();
wp_set_current_user(1); wp_set_current_user(1);
$viewInBrowserController->view($data); $viewInBrowserController->view($data);
} }
public function testItGetsQueueByQueueId() { public function testItGetsQueueByQueueId() {
$viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [
'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, Subscriber $subscriber = null, SendingQueue $queue = null) { 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueue $queue = null) {
assert($queue !== null); // PHPStan assert($queue !== null); // PHPStan
expect($queue)->notNull(); expect($queue)->notNull();
expect($queue->id)->same($this->sendingTask->id); expect($queue->id)->same($this->sendingTask->id);
}), }),
]); ]);
$viewInBrowserController = new ViewInBrowserController( $viewInBrowserController = $this->createController($viewInBrowserRenderer);
$this->diContainer->get(LinkTokens::class),
$viewInBrowserRenderer
);
$data = $this->browserPreviewData; $data = $this->browserPreviewData;
$data['queueId'] = $this->sendingTask->queue()->id; $data['queueId'] = $this->sendingTask->queue()->id;
@ -150,17 +157,14 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
public function testItGetsQueueByNewsletter() { public function testItGetsQueueByNewsletter() {
$viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [
'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, Subscriber $subscriber = null, SendingQueue $queue = null) { 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueue $queue = null) {
assert($queue !== null); // PHPStan assert($queue !== null); // PHPStan
expect($queue)->notNull(); expect($queue)->notNull();
expect($queue->id)->same($this->sendingTask->queue()->id); expect($queue->id)->same($this->sendingTask->queue()->id);
}), }),
]); ]);
$viewInBrowserController = new ViewInBrowserController( $viewInBrowserController = $this->createController($viewInBrowserRenderer);
$this->diContainer->get(LinkTokens::class),
$viewInBrowserRenderer
);
$data = $this->browserPreviewData; $data = $this->browserPreviewData;
$data['queueId'] = null; $data['queueId'] = null;
@ -169,15 +173,12 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
public function testItResetsQueueForWelcomeEmails() { public function testItResetsQueueForWelcomeEmails() {
$viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [
'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, Subscriber $subscriber = null, SendingQueue $queue = null) { 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueue $queue = null) {
expect($queue)->null(); expect($queue)->null();
}), }),
]); ]);
$viewInBrowserController = new ViewInBrowserController( $viewInBrowserController = $this->createController($viewInBrowserRenderer);
$this->diContainer->get(LinkTokens::class),
$viewInBrowserRenderer
);
// queue will be set to null for welcome email // queue will be set to null for welcome email
$newsletter = $this->newsletter; $newsletter = $this->newsletter;
@ -188,15 +189,12 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
public function testItResetsQueueForAutomaticEmailsInPreview() { public function testItResetsQueueForAutomaticEmailsInPreview() {
$viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [ $viewInBrowserRenderer = $this->make(ViewInBrowserRenderer::class, [
'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, Subscriber $subscriber = null, SendingQueue $queue = null) { 'render' => Expected::once(function (bool $isPreview, Newsletter $newsletter, SubscriberEntity $subscriber = null, SendingQueue $queue = null) {
expect($queue)->null(); expect($queue)->null();
}), }),
]); ]);
$viewInBrowserController = new ViewInBrowserController( $viewInBrowserController = $this->createController($viewInBrowserRenderer);
$this->diContainer->get(LinkTokens::class),
$viewInBrowserRenderer
);
// queue will be set to null for automatic email // queue will be set to null for automatic email
$data = $this->browserPreviewData; $data = $this->browserPreviewData;
@ -225,4 +223,12 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
expect($e->getMessage())->same($message); expect($e->getMessage())->same($message);
} }
} }
private function createController($viewInBrowserRenderer): ViewInBrowserController {
return new ViewInBrowserController(
$this->linkTokens,
$viewInBrowserRenderer,
$this->subscribersRepository
);
}
} }

View File

@ -3,6 +3,7 @@
namespace MailPoet\Newsletter\ViewInBrowser; namespace MailPoet\Newsletter\ViewInBrowser;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterLink; use MailPoet\Models\NewsletterLink;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
@ -13,6 +14,7 @@ use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Router\Router; use MailPoet\Router\Router;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\WP\Emoji; use MailPoet\WP\Emoji;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
@ -30,7 +32,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
/** @var SendingTask */ /** @var SendingTask */
private $sendingTask; private $sendingTask;
/** @var Subscriber */ /** @var SubscriberEntity */
private $subscriber; private $subscriber;
/** @var mixed[] */ /** @var mixed[] */
@ -39,7 +41,11 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
/** @var mixed[] */ /** @var mixed[] */
private $queueRenderedNewsletterWithoutTracking; private $queueRenderedNewsletterWithoutTracking;
/** @var SubscribersRepository */
private $subscribersRepository;
public function _before() { public function _before() {
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
$newsletterData = [ $newsletterData = [
'body' => json_decode( 'body' => json_decode(
'{ '{
@ -102,17 +108,19 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
$this->newsletter = $newsletter->save(); $this->newsletter = $newsletter->save();
// create subscriber // create subscriber
$subscriber = Subscriber::create(); $subscriber = new SubscriberEntity();
$subscriber->email = 'test@example.com'; $subscriber->setEmail('test@example.com');
$subscriber->firstName = 'First'; $subscriber->setFirstName('First');
$subscriber->lastName = 'Last'; $subscriber->setLastName('Last');
$this->subscriber = $subscriber->save(); $this->subscribersRepository->persist($subscriber);
$this->subscribersRepository->flush();
$this->subscriber = $subscriber;
// create queue // create queue
$queue = SendingTask::create(); $queue = SendingTask::create();
$queue->newsletterId = $newsletter->id; $queue->newsletterId = $newsletter->id;
$queue->newsletterRenderedBody = $this->queueRenderedNewsletterWithoutTracking; $queue->newsletterRenderedBody = $this->queueRenderedNewsletterWithoutTracking;
$queue->setSubscribers([$subscriber->id]); $queue->setSubscribers([$subscriber->getId()]);
$this->sendingTask = $queue->save(); $this->sendingTask = $queue->save();
// create newsletter link associations // create newsletter link associations

View File

@ -10,6 +10,7 @@ use MailPoet\Segments\WP;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\Source; use MailPoet\Subscribers\Source;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
@ -49,8 +50,9 @@ class SubscriptionTest extends \MailPoetTest {
}, },
] ]
); );
$subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
$this->confirmationEmailMailer = $this->createMock(ConfirmationEmailMailer::class); $this->confirmationEmailMailer = $this->createMock(ConfirmationEmailMailer::class);
$this->subscription = new Subscription($this->settings, $this->confirmationEmailMailer, $wp, $wcHelper); $this->subscription = new Subscription($this->settings, $this->confirmationEmailMailer, $wp, $wcHelper, $subscribersRepository);
$this->wcSegment = Segment::getWooCommerceSegment(); $this->wcSegment = Segment::getWooCommerceSegment();
$this->wpSegment = $this->diContainer->get(WP::class); $this->wpSegment = $this->diContainer->get(WP::class);