diff --git a/lib/API/Endpoints/Newsletters.php b/lib/API/Endpoints/Newsletters.php index fae2361c1f..033f53ca90 100644 --- a/lib/API/Endpoints/Newsletters.php +++ b/lib/API/Endpoints/Newsletters.php @@ -340,11 +340,10 @@ class Newsletters extends APIEndpoint { } // get preview url - $subscriber = Subscriber::getCurrentWPUser(); $newsletter->preview_url = NewsletterUrl::getViewInBrowserUrl( NewsletterUrl::TYPE_LISTING_EDITOR, $newsletter, - $subscriber, + $subscriber = null, $queue ); @@ -435,4 +434,4 @@ class Newsletters extends APIEndpoint { ); } } -} +} \ No newline at end of file diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index a6b86cefcc..3e0e088b89 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -593,6 +593,7 @@ class Newsletter extends Model { return self::select(array( 'id', 'subject', + 'hash', 'type', 'status', 'updated_at', diff --git a/lib/Newsletter/Url.php b/lib/Newsletter/Url.php index c6e0fd3cd9..5e089059f7 100644 --- a/lib/Newsletter/Url.php +++ b/lib/Newsletter/Url.php @@ -27,8 +27,7 @@ class Url { $preview = true; break; case self::TYPE_LISTING_EDITOR: - // enable preview and hide newsletter hash when displaying from editor or listings - $newsletter->hash = null; + // enable preview when displaying from editor or listings $preview = true; break; default: diff --git a/lib/Router/Endpoints/ViewInBrowser.php b/lib/Router/Endpoints/ViewInBrowser.php index 626101e575..470a8297c4 100644 --- a/lib/Router/Endpoints/ViewInBrowser.php +++ b/lib/Router/Endpoints/ViewInBrowser.php @@ -50,10 +50,14 @@ class ViewInBrowser { if(empty($data->subscriber_token) || !Subscriber::verifyToken($data->subscriber->email, $data->subscriber_token) ) return false; + } else if(!$data->subscriber && !empty($data->preview)) { + // if this is a preview and subscriber does not exist, + // attemp to set subscriber to the current logged-in WP user + $data->subscriber = Subscriber::getCurrentWPUser(); } - // if newsletter ID is defined then subscriber must exist - if($data->newsletter_id && !$data->subscriber) return false; + // if newsletter hash is not provided but newsletter ID is defined then subscriber must exist + if(empty($data->newsletter_hash) && $data->newsletter_id && !$data->subscriber) return false; // queue is optional; if defined, get it $data->queue = (!empty($data->queue_id)) ? diff --git a/tests/unit/API/Endpoints/NewslettersTest.php b/tests/unit/API/Endpoints/NewslettersTest.php index 690727f8d8..59d6b2aca3 100644 --- a/tests/unit/API/Endpoints/NewslettersTest.php +++ b/tests/unit/API/Endpoints/NewslettersTest.php @@ -8,6 +8,8 @@ use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterSegment; use MailPoet\Models\Segment; use MailPoet\Newsletter\Scheduler\Scheduler; +use MailPoet\Newsletter\Url; +use MailPoet\Router\Router; class NewslettersTest extends MailPoetTest { function _before() { @@ -29,7 +31,7 @@ class NewslettersTest extends MailPoetTest { function testItCanGetANewsletter() { $router = new Newsletters(); - $response = $router->get(/* missing id */); + $response = $router->get(); // missing id expect($response->status)->equals(APIResponse::STATUS_NOT_FOUND); expect($response->errors[0]['message']) ->equals('This newsletter does not exist.'); @@ -517,7 +519,7 @@ class NewslettersTest extends MailPoetTest { expect($response->status)->equals(APIResponse::STATUS_OK); } - function testItReturnsMaillerErrorWhenSendingFailed() { + function testItReturnsMailerErrorWhenSendingFailed() { $subscriber = 'test@subscriber.com'; $data = array( 'subscriber' => $subscriber, @@ -542,6 +544,18 @@ class NewslettersTest extends MailPoetTest { expect($response->errors[0]['message'])->equals('The email could not be sent: failed'); } + function testItGeneratesPreviewLinksWithNewsletterHashAndNoSubscriberData() { + $router = new Newsletters(); + $response = $router->listing(); + $preview_link = $response->data[0]['preview_url']; + parse_str(parse_url($preview_link, PHP_URL_QUERY), $preview_link_data); + $preview_link_data = Url::transformUrlDataObject(Router::decodeRequestData($preview_link_data['data'])); + expect($preview_link_data['newsletter_hash'])->notEmpty(); + expect($preview_link_data['subscriber_id'])->false(); + expect($preview_link_data['subscriber_token'])->false(); + expect((boolean)$preview_link_data['preview'])->true(); + } + function _after() { Newsletter::deleteMany(); NewsletterSegment::deleteMany(); diff --git a/tests/unit/Router/Endpoints/ViewInBrowserTest.php b/tests/unit/Router/Endpoints/ViewInBrowserTest.php index a6cb5da8be..1484887cc2 100644 --- a/tests/unit/Router/Endpoints/ViewInBrowserTest.php +++ b/tests/unit/Router/Endpoints/ViewInBrowserTest.php @@ -143,6 +143,21 @@ class ViewInBrowserRouterTest extends MailPoetTest { expect($this->view_in_browser->_validateBrowserPreviewData($data))->equals($data); } + function testItSetsSubscriberToLoggedInWPUserWhenPreviewIsEnabled() { + $data = (object)array_merge( + $this->browser_preview_data, + array( + 'queue' => $this->queue, + 'subscriber' => null, + 'newsletter' => $this->newsletter + ) + ); + $data->preview = true; + wp_set_current_user(1); + $result = $this->view_in_browser->_validateBrowserPreviewData($data); + expect($result->subscriber->id)->equals(1); + } + function testItProcessesBrowserPreviewData() { $processed_data = $this->view_in_browser->_processBrowserPreviewData($this->browser_preview_data); expect($processed_data->queue->id)->equals($this->queue->id);