diff --git a/lib/Newsletter/Shortcodes/Categories/Link.php b/lib/Newsletter/Shortcodes/Categories/Link.php index b5056b5b64..f6f08c18bb 100644 --- a/lib/Newsletter/Shortcodes/Categories/Link.php +++ b/lib/Newsletter/Shortcodes/Categories/Link.php @@ -71,7 +71,7 @@ class Link implements CategoryInterface { case 'newsletter_view_in_browser_url': $url = NewsletterUrl::getViewInBrowserUrl( $newsletterModel, - $wpUserPreview ? null : $subscriber, + $wpUserPreview ? null : $subscriberModel, $queueModel, $wpUserPreview ); diff --git a/tests/integration/Newsletter/ShortcodesTest.php b/tests/integration/Newsletter/ShortcodesTest.php index c4dcc7f396..65310b153c 100644 --- a/tests/integration/Newsletter/ShortcodesTest.php +++ b/tests/integration/Newsletter/ShortcodesTest.php @@ -17,6 +17,7 @@ use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Settings\SettingsController; use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscription\SubscriptionUrlFactory; +use MailPoet\Util\Security; use MailPoet\WP\Functions as WPFunctions; use WP_Post; @@ -51,6 +52,7 @@ class ShortcodesTest extends \MailPoetTest { $this->shortcodesObject = $this->diContainer->get(Shortcodes::class); $this->shortcodesObject->setNewsletter($this->newsletter); $this->shortcodesObject->setSubscriber($this->subscriber); + $this->shortcodesObject->setWpUserPreview(false); $this->settings->set('tracking.enabled', false); $this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens); $this->entityManager->flush(); @@ -247,16 +249,39 @@ class ShortcodesTest extends \MailPoetTest { $result = $shortcodesObject->process(['[link:subscription_unsubscribe_url]']); expect($result['0'])->regExp('/^http.*?action=confirm_unsubscribe/'); + $linkData = $this->getLinkData($result['0']); + expect($linkData['email'])->equals($this->subscriber->getEmail()); + expect($linkData['token'])->equals($this->subscriber->getLinkToken()); + $result = $shortcodesObject->process(['[link:subscription_instant_unsubscribe_url]']); expect($result['0'])->regExp('/^http.*?action=unsubscribe/'); + $linkData = $this->getLinkData($result['0']); + expect($linkData['email'])->equals($this->subscriber->getEmail()); + expect($linkData['token'])->equals($this->subscriber->getLinkToken()); + $result = $shortcodesObject->process(['[link:subscription_manage_url]']); expect($result['0'])->regExp('/^http.*?action=manage/'); - $result = + $linkData = $this->getLinkData($result['0']); + expect($linkData['email'])->equals($this->subscriber->getEmail()); + expect($linkData['token'])->equals($this->subscriber->getLinkToken()); + $result = $shortcodesObject->process(['[link:newsletter_view_in_browser_url]']); expect($result['0'])->regExp('/^http.*?endpoint=view_in_browser/'); + $linkData = $this->getLinkData($result['0']); + expect($linkData['newsletter_id'])->equals($this->newsletter->getId()); + expect($linkData['newsletter_hash'])->equals($this->newsletter->getHash()); + expect($linkData['subscriber_token'])->equals($this->subscriber->getLinkToken()); + expect($linkData['subscriber_id'])->equals($this->subscriber->getId()); + } + + private function getLinkData(string $link): array { + $parsedUrlQuery = parse_url($link, PHP_URL_QUERY); + $queryData = []; + parse_str((string)$parsedUrlQuery, $queryData); + return NewsletterUrl::transformUrlDataObject(json_decode(base64_decode($queryData['data']), true)); } public function testItReturnsShortcodeWhenTrackingEnabled() { @@ -361,6 +386,7 @@ class ShortcodesTest extends \MailPoetTest { $subscriber->setEmail('mister@trump.com'); $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); $subscriber->setWpUserId($this->wPUser->ID); + $subscriber->setLinkToken(Security::generateHash()); return $subscriber; } @@ -368,6 +394,7 @@ class ShortcodesTest extends \MailPoetTest { $newsletter = new NewsletterEntity(); $newsletter->setSubject('some subject'); $newsletter->setType($type); + $newsletter->setHash(Security::generateHash()); $newsletter->setStatus(NewsletterEntity::STATUS_SENT); if ($parent) { $newsletter->setParent($parent);