- Updates unit tests

This commit is contained in:
Vlad
2016-12-18 22:46:42 -05:00
parent 9698cf2d2e
commit 9095482af2
7 changed files with 322 additions and 46 deletions

View File

@@ -0,0 +1,38 @@
<?php
use MailPoet\Config\Shortcodes;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\Url;
use MailPoet\Router\Router;
class ConfigShortcodesTest extends MailPoetTest {
function _before() {
$newsletter = Newsletter::create();
$newsletter->type = Newsletter::TYPE_STANDARD;
$newsletter->status = Newsletter::STATUS_SENT;
$this->newsletter = $newsletter->save();
$queue = SendingQueue::create();
$queue->newsletter_id = $newsletter->id;
$queue->status = SendingQueue::STATUS_COMPLETED;
$this->queue = $queue->save();
}
function testItGetsArchives() {
$shortcodes = new Shortcodes();
// result contains a link pointing to the "view in browser" router endpoint
$result = $shortcodes->getArchive($params = false);
$dom = pQuery::parseStr($result);
$link = $dom->query('a');
$link = $link->attr('href');
expect($link)->contains('endpoint=view_in_browser');
// request data object contains newsletter hash but not newsletter id
$parsed_link = parse_url($link);
parse_str(html_entity_decode($parsed_link['query']), $data);
$request_data = Url::transformUrlDataObject(
Router::decodeRequestData($data['data'])
);
expect($request_data['newsletter_id'])->isEmpty();
expect($request_data['newsletter_hash'])->equals($this->newsletter->hash);
}
}

View File

@@ -245,6 +245,118 @@ class NewsletterTest extends MailPoetTest {
expect($newsletter->Event)->equals($association->value);
}
function testItGetsArchiveNewslettersForSegments() {
// clear the DB
$this->_after();
$types = array(
Newsletter::TYPE_STANDARD,
Newsletter::TYPE_NOTIFICATION_HISTORY
);
$newsletters = array();
$sending_queues[] = array();
for($i = 0; $i < count($types); $i++) {
$newsletters[$i] = Newsletter::createOrUpdate(
array(
'subject' => 'My Standard Newsletter',
'preheader' => 'Pre Header',
'type' => $types[$i]
)
);
$sending_queues[$i] = SendingQueue::create();
$sending_queues[$i]->newsletter_id = $newsletters[$i]->id;
$sending_queues[$i]->status = SendingQueue::STATUS_COMPLETED;
$sending_queues[$i]->save();
}
// set segment association for the last newsletter
$newsletter_segment = NewsletterSegment::create();
$newsletter_segment->newsletter_id = end($newsletters[1])->id;
$newsletter_segment->segment_id = 123;
$newsletter_segment->save();
expect(Newsletter::findMany())->count(2);
// return archives in segment 123
$results = Newsletter::getArchives(array(123));
expect($results)->count(1);
expect($results[0]->id)->equals($newsletters[1]->id);
expect($results[0]->type)->equals(Newsletter::TYPE_NOTIFICATION_HISTORY);
}
function testItGetsAllArchiveNewsletters() {
// clear the DB
$this->_after();
$types = array(
Newsletter::TYPE_STANDARD,
Newsletter::TYPE_STANDARD, // should be returned
Newsletter::TYPE_WELCOME,
Newsletter::TYPE_NOTIFICATION,
Newsletter::TYPE_NOTIFICATION_HISTORY, // should be returned
Newsletter::TYPE_NOTIFICATION_HISTORY
);
$newsletters = array();
$sending_queues[] = array();
for($i = 0; $i < count($types); $i++) {
$newsletters[$i] = Newsletter::createOrUpdate(
array(
'subject' => 'My Standard Newsletter',
'preheader' => 'Pre Header',
'type' => $types[$i]
)
);
$sending_queues[$i] = SendingQueue::create();
$sending_queues[$i]->newsletter_id = $newsletters[$i]->id;
$sending_queues[$i]->status = SendingQueue::STATUS_COMPLETED;
$sending_queues[$i]->save();
}
// set teh sending queue status of the first newsletter to null
$sending_queues[0]->status = null;
$sending_queues[0]->save();
// trash the last newsletter
end($newsletters)->trash();
expect(Newsletter::findMany())->count(6);
// archives return only:
// 1. STANDARD and NOTIFICATION HISTORY newsletters
// 2. active newsletters (i.e., not trashed)
// 3. with sending queue records that are COMPLETED
$results = Newsletter::getArchives();
expect($results)->count(2);
expect($results[0]->id)->equals($newsletters[1]->id);
expect($results[0]->type)->equals(Newsletter::TYPE_STANDARD);
expect($results[1]->id)->equals($newsletters[4]->id);
expect($results[1]->type)->equals(Newsletter::TYPE_NOTIFICATION_HISTORY);
}
function testItGeneratesHashOnNewsletterSave() {
expect(strlen($this->newsletter->hash))
->equals(Newsletter::NEWSLETTER_HASH_LENGTH);
}
function testItRegeneratesHashOnNewsletterDuplication() {
$duplicate_newsletter = $this->newsletter->duplicate();
expect($duplicate_newsletter->hash)->notEquals($this->newsletter->hash);
expect(strlen($duplicate_newsletter->hash))
->equals(Newsletter::NEWSLETTER_HASH_LENGTH);
}
function testItRegeneratesHashOnNotificationHistoryCreation() {
$notification_history = $this->newsletter->createNotificationHistory();
expect($notification_history->hash)->notEquals($this->newsletter->hash);
expect(strlen($notification_history->hash))
->equals(Newsletter::NEWSLETTER_HASH_LENGTH);
}
function testItGetsQueueFromNewsletter() {
$queue = SendingQueue::create();
$queue->newsletter_id = $this->newsletter->id;
$queue->save();
expect($this->newsletter->queue()->findOne()->id)->equals($queue->id);
}
function _after() {
ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);

View File

@@ -9,7 +9,6 @@ use MailPoet\Models\SubscriberCustomField;
use MailPoet\Models\SubscriberSegment;
class SubscriberTest extends MailPoetTest {
function _before() {
$this->data = array(
'first_name' => 'John',
@@ -555,6 +554,23 @@ class SubscriberTest extends MailPoetTest {
expect($total)->equals(1);
}
function testItGeneratesSubscriberToken() {
$token = Subscriber::generateToken($this->data['email']);
expect(strlen($token))->equals(Subscriber::SUBSCRIBER_TOKEN_LENGTH);
}
function testItVerifiesSubscriberToken() {
$token = Subscriber::generateToken($this->data['email']);
expect(Subscriber::verifyToken($this->data['email'], $token))->true();
expect(Subscriber::verifyToken('fake@email.com', $token))->false();
}
function testVerifiedTokensOfDifferentLengths() {
$token = md5(AUTH_KEY . $this->data['email']);
expect(strlen($token))->notEquals(Subscriber::SUBSCRIBER_TOKEN_LENGTH);
expect(Subscriber::verifyToken($this->data['email'], $token))->true();
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
ORM::raw_execute('TRUNCATE ' . Segment::$_table);

View File

@@ -5,6 +5,7 @@ use MailPoet\Models\NewsletterLink;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\Shortcodes\Categories\Link;
use MailPoet\Router\Router;
class LinksTest extends MailPoetTest {
@@ -46,6 +47,29 @@ class LinksTest extends MailPoetTest {
expect($updated_content)->notContains('link');
}
function testItCreatesAndTransformsUrlDataObject() {
$subscriber_email = 'test@example.com';
$data = array(
'subscriber_id' => 1,
'subscriber_token' => Subscriber::generateToken($subscriber_email),
'queue_id' => 2,
'link_hash' => 'hash',
'preview' => false
);
$url_data_object = Links::createUrlDataObject(
$data['subscriber_id'],
$subscriber_email,
$data['queue_id'],
$data['link_hash'],
$data['preview']
);
// URL data object should be an indexed array
expect($url_data_object)->equals(array_values($data));
// transformed URL object should be an associative array
$transformed_url_data_object = Links::transformUrlDataObject($url_data_object);
expect($transformed_url_data_object)->equals($data);
}
function testItReplacesHashedLinksWithSubscriberData() {
$subscriber = Subscriber::create();
$subscriber->hydrate(Fixtures::get('subscriber_template'));
@@ -70,6 +94,7 @@ class LinksTest extends MailPoetTest {
preg_match_all('/data=(?P<data>.*?)"/', $result, $result);
foreach($result['data'] as $data) {
$data = Router::decodeRequestData($data);
$data = Links::transformUrlDataObject($data);
expect($data['subscriber_id'])->equals($subscriber->id);
expect($data['queue_id'])->equals($queue->id);
expect(isset($data['subscriber_token']))->true();
@@ -97,6 +122,52 @@ class LinksTest extends MailPoetTest {
expect($newsltter_link->url)->equals('http://example.com');
}
function testItMatchesHashedLinks() {
$regex = Links::getLinkRegex();
expect((boolean)preg_match($regex, '[some_tag]-123'))->false();
expect((boolean)preg_match($regex, '[some_tag]'))->false();
expect((boolean)preg_match($regex, '[mailpoet_click_data]-123'))->true();
expect((boolean)preg_match($regex, '[mailpoet_open_data]'))->true();
}
function testItCanConvertOnlyHashedLinkShortcodes() {
// create newsletter link association
$newsletter_link = NewsletterLink::create();
$newsletter_link->newsletter_id = 1;
$newsletter_link->queue_id = 1;
$newsletter_link->hash = '90e56';
$newsletter_link->url = '[link:newsletter_view_in_browser_url]';
$newsletter_link = $newsletter_link->save();
$content = '
<a href="[mailpoet_click_data]-90e56">View in browser</a>
<a href="[mailpoet_click_data]-123">Some link</a>';
$result = Links::convertHashedLinksToShortcodesAndUrls($content);
expect($result)->contains($newsletter_link->url);
expect($result)->contains('[mailpoet_click_data]-123');
}
function testItCanConvertAllHashedLinksToUrls() {
// create newsletter link associations
$newsletter_link_1 = NewsletterLink::create();
$newsletter_link_1->newsletter_id = 1;
$newsletter_link_1->queue_id = 1;
$newsletter_link_1->hash = '90e56';
$newsletter_link_1->url = '[link:newsletter_view_in_browser_url]';
$newsletter_link_1 = $newsletter_link_1->save();
$newsletter_link_2 = NewsletterLink::create();
$newsletter_link_2->newsletter_id = 1;
$newsletter_link_2->queue_id = 1;
$newsletter_link_2->hash = '123';
$newsletter_link_2->url = 'http://google.com';
$newsletter_link_2 = $newsletter_link_2->save();
$content = '
<a href="[mailpoet_click_data]-90e56">View in browser</a>
<a href="[mailpoet_click_data]-123">Some link</a>';
$result = Links::convertHashedLinksToShortcodesAndUrls($content, $convert_all = true);
expect($result)->contains($newsletter_link_1->url);
expect($result)->contains($newsletter_link_2->url);
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);

View File

@@ -94,13 +94,13 @@ class ShortcodesTest extends MailPoetTest {
'<a data-post-id="10" href="#">another post</a>' .
'<a href="#">not post</a>';
$result =
$shortcodes_object->process(array('[newsletter:subject]'));
$shortcodes_object->process(array('[newsletter:subject]'), $content);
expect($result[0])->equals($this->newsletter->subject);
$result =
$shortcodes_object->process(array('[newsletter:total]'), $content);
expect($result[0])->equals(2);
$result =
$shortcodes_object->process(array('[newsletter:post_title]'));
$shortcodes_object->process(array('[newsletter:post_title]'), $content);
$wp_post = get_post($this->WP_post);
expect($result['0'])->equals($wp_post->post_title);
}

View File

@@ -1,6 +1,7 @@
<?php
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterLink;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Setting;
use MailPoet\Models\Subscriber;
@@ -9,7 +10,8 @@ use MailPoet\Router\Router;
class ViewInBrowserTest extends MailPoetTest {
function __construct() {
$this->newsletter = array(
$this->newsletter =
array(
'body' => json_decode(
'{
"content": {
@@ -41,7 +43,7 @@ class ViewInBrowserTest extends MailPoetTest {
"blocks": [
{
"type": "text",
"text": "<p>Rendered newsletter. Hello,&nbsp;[subscriber:firstname | default:reader] & [link:newsletter_view_in_browser_url]</p>"
"text": "<p>Rendered newsletter. Hello, [subscriber:firstname | default:reader]. <a href=\"[link:newsletter_view_in_browser_url]\">Unsubscribe</a> or visit <a href=\"http://google.com\">Google</a></p>"
}
]
}
@@ -57,15 +59,11 @@ class ViewInBrowserTest extends MailPoetTest {
'status' => 'active'
);
$this->queue_rendered_newsletter_without_tracking = array(
'html' => 'Newsletter from queue. Hello, [subscriber:firstname] &
[link:newsletter_view_in_browser_url]'
'html' => '<p>Newsletter from queue. Hello, [subscriber:firstname | default:reader]. <a href="[link:newsletter_view_in_browser_url]">Unsubscribe</a> or visit <a href="http://google.com">Google</a></p>'
);
$this->queue_rendered_newsletter_with_tracking = array(
'html' => 'Newsletter from queue. Hello, [subscriber:firstname] &
[mailpoet_click_data]-90e56'
'html' => '<p>Newsletter from queue. Hello, [subscriber:firstname | default:reader]. <a href="[mailpoet_click_data]-90e56">Unsubscribe</a> or visit <a href="[mailpoet_click_data]-i1893">Google</a></p>'
);
// instantiate class
$this->view_in_browser = new ViewInBrowser();
}
function _before() {
@@ -85,6 +83,20 @@ class ViewInBrowserTest extends MailPoetTest {
$queue->newsletter_rendered_body = $this->queue_rendered_newsletter_without_tracking;
$queue->subscribers = array('processed' => array($subscriber->id));
$this->queue = $queue->save();
// create newsletter link associations
$newsletter_link_1 = NewsletterLink::create();
$newsletter_link_1->hash = '90e56';
$newsletter_link_1->url = '[link:newsletter_view_in_browser_url]';
$newsletter_link_1->newsletter_id = $this->newsletter->id;
$newsletter_link_1->queue_id = $this->queue->id;
$this->newsletter_link_1 = $newsletter_link_1->save();
$newsletter_link_2 = NewsletterLink::create();
$newsletter_link_2->hash = 'i1893';
$newsletter_link_2->url = 'http://google.com';
$newsletter_link_2->newsletter_id = $this->newsletter->id;
$newsletter_link_2->queue_id = $this->queue->id;
$this->newsletter_link_2 = $newsletter_link_2->save();
}
function testItRendersNewsletter() {
@@ -119,7 +131,7 @@ class ViewInBrowserTest extends MailPoetTest {
expect($rendered_body)->contains(Router::NAME . '&endpoint=view_in_browser');
}
function testItProcessesLinksWhenTrackingIsEnabled() {
function testItRewritesLinksToRouterEndpointWhenTrackingIsEnabled() {
Setting::setValue('tracking.enabled', true);
$queue = $this->queue;
$queue->newsletter_rendered_body = $this->queue_rendered_newsletter_with_tracking;
@@ -132,8 +144,38 @@ class ViewInBrowserTest extends MailPoetTest {
expect($rendered_body)->contains(Router::NAME . '&endpoint=track');
}
function testItConvertsHashedLinksToUrlsWhenPreviewIsEnabledAndNewsletterWasSent() {
$queue = $this->queue;
$queue->newsletter_rendered_body = $this->queue_rendered_newsletter_with_tracking;
$rendered_body = ViewInBrowser::renderNewsletter(
$this->newsletter,
$this->subscriber,
$queue,
$preview = true
);
// hashed link should be replaced with a URL
expect($rendered_body)->notContains('[mailpoet_click_data]');
expect($rendered_body)->contains('<a href="http://google.com">');
}
function testReplacesLinkShortcodesWithUrlHashWhenPreviewIsEnabledAndNewsletterWasSent() {
$queue = $this->queue;
$queue->newsletter_rendered_body = $this->queue_rendered_newsletter_with_tracking;
$rendered_body = ViewInBrowser::renderNewsletter(
$this->newsletter,
$this->subscriber,
$queue,
$preview = true
);
// link shortcodes should be replaced with a hash (#)
expect($rendered_body)->notContains('[mailpoet_click_data]');
expect($rendered_body)->contains('<a href="#">');
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
ORM::raw_execute('TRUNCATE ' . NewsletterLink::$_table);
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
}

View File

@@ -37,17 +37,13 @@ class ViewInBrowserRouterTest extends MailPoetTest {
function testItAbortsWhenBrowserPreviewDataIsMissing() {
$view_in_browser = Stub::make($this->view_in_browser, array(
'_abort' => Stub::exactly(3, function() { })
'_abort' => Stub::exactly(2, function () { })
), $this);
// newsletter ID is required
$data = $this->browser_preview_data;
unset($data['newsletter_id']);
$view_in_browser->_processBrowserPreviewData($data);
// subscriber ID is required
$data = $this->browser_preview_data;
unset($data['subscriber_id']);
$view_in_browser->_processBrowserPreviewData($data);
// subscriber token is required
// subscriber token is required if subscriber is provided
$data = $this->browser_preview_data;
unset($data['subscriber_token']);
$view_in_browser->_processBrowserPreviewData($data);
@@ -55,50 +51,51 @@ class ViewInBrowserRouterTest extends MailPoetTest {
function testItAbortsWhenBrowserPreviewDataIsInvalid() {
$view_in_browser = Stub::make($this->view_in_browser, array(
'_abort' => Stub::exactly(3, function() { })
'_abort' => Stub::exactly(3, function () { })
), $this);
// newsletter ID is invalid
$data = $this->browser_preview_data;
$data['newsletter_id'] = 99;
$view_in_browser->_processBrowserPreviewData($data);
// subscriber ID is invalid
// subscriber token is invalid
$data = $this->browser_preview_data;
$data['subscriber_id'] = 99;
$data['subscriber_token'] = false;
$view_in_browser->_processBrowserPreviewData($data);
// subscriber token is invalid
$data = $this->browser_preview_data;
$data['subscriber_token'] = 'invalid';
$view_in_browser->_processBrowserPreviewData($data);
// subscriber has not received the newsletter
}
function testItFailsValidationWhenSubscriberTokenDoesNotMatch() {
$data = (object)array_merge(
$subscriber = $this->subscriber;
$subscriber->email = 'random@email.com';
$subscriber->save();
$data = (object) array_merge(
$this->browser_preview_data,
array(
'queue' => $this->queue,
'subscriber' => $this->subscriber,
'subscriber' => $subscriber,
'newsletter' => $this->newsletter
)
);
$data->subscriber->email = 'random@email.com';
expect($this->view_in_browser->_validateBrowserPreviewData($data))->false();
}
function testItFailsValidationWhenSubscriberIsNotOnProcessedList() {
$data = (object)array_merge(
$this->browser_preview_data,
array(
'queue' => $this->queue,
'subscriber' => $this->subscriber,
'newsletter' => $this->newsletter
)
);
$data->subscriber->id = 99;
expect($this->view_in_browser->_validateBrowserPreviewData($data))->false();
$data = (object) $this->browser_preview_data;
$result = $this->view_in_browser->_validateBrowserPreviewData($data);
expect($result)->notEmpty();
$queue = $this->queue;
$queue->subscribers = array('processed' => array());
$queue->save();
$result = $this->view_in_browser->_validateBrowserPreviewData($data);
expect($result)->false();
}
function testItDoesNotRequireWpUsersToBeOnProcessedListWhenPreviewIsEnabled() {
$data = (object)array_merge(
$data = (object) array_merge(
$this->browser_preview_data,
array(
'queue' => $this->queue,
@@ -120,7 +117,7 @@ class ViewInBrowserRouterTest extends MailPoetTest {
function testItReturnsViewActionResult() {
$view_in_browser = Stub::make($this->view_in_browser, array(
'_displayNewsletter' => Stub::exactly(1, function() { })
'_displayNewsletter' => Stub::exactly(1, function () { })
), $this);
$view_in_browser->data = $view_in_browser->_processBrowserPreviewData($this->browser_preview_data);
$view_in_browser->view();