some site http://link2.com '; $result = Links::extract($template); expect($result[0])->equals( [ 'type' => Links::LINK_TYPE_URL, 'link' => 'http://example.com', ] ); } public function testItOnlyHashesAndReplacesLinksInAnchorTags() { $template = ''; $result = Links::process($template, 0, 0); expect($result[0])->equals( sprintf( '', Links::DATA_TAG_CLICK, $result[1][0]['hash'] ) ); } public function testItDoesNotRehashExistingLinks() { $link = NewsletterLink::create(); $link->newsletterId = 3; $link->queueId = 3; $link->hash = '123'; $link->url = 'http://example.com'; $link->save(); $template = ''; $result = Links::process($template, 3, 3); expect($result[0])->equals( sprintf( '', Links::DATA_TAG_CLICK, 123 ) ); } public function testItCanExtactLinkShortcodes() { $template = '[notlink:shortcode] [link:some_link_shortcode]'; $result = Links::extract($template); expect($result[0])->equals( [ 'type' => Links::LINK_TYPE_SHORTCODE, 'link' => '[link:some_link_shortcode]', ] ); } public function testItHashesAndReplacesLinks() { $template = 'some site [link:some_link_shortcode]'; list($updatedContent, $hashedLinks) = Links::process($template, 0, 0); // 2 links were hashed expect(count($hashedLinks))->equals(2); // links in returned content were replaced with hashes expect($updatedContent) ->stringContainsString(Links::DATA_TAG_CLICK . '-' . $hashedLinks[0]['hash']); expect($updatedContent) ->stringContainsString(Links::DATA_TAG_CLICK . '-' . $hashedLinks[1]['hash']); expect($updatedContent)->stringNotContainsString('link'); } public function testItHashesAndReplacesLinksWithSpecialCharacters() { $template = 'some site'; $result = Links::process($template, 0, 0); expect($result[0])->equals( sprintf( 'some site', Links::DATA_TAG_CLICK, $result[1][0]['hash'] ) ); } public function testItDoesNotReplaceUnprocessedLinks() { $template = 'some site [link:some_link_shortcode]'; $processedLinks = [ 'http://example.com' => [ 'type' => Links::LINK_TYPE_URL, 'link' => 'http://example.com', 'processed_link' => 'replace by this', ], ]; list($updatedContent, $replacedLinks) = Links::replace($template, $processedLinks); expect($replacedLinks)->count(1); // links in returned content were replaced with hashes expect($updatedContent) ->stringContainsString('replace by this'); expect($updatedContent) ->stringContainsString('[link:some_link_shortcode]'); expect($updatedContent)->stringNotContainsString('http://example.com'); } public function testItCreatesAndTransformsUrlDataObject() { $subscriberEmail = 'test@example.com'; $data = [ 'subscriber_id' => 1, 'subscriber_token' => md5($subscriberEmail), 'queue_id' => 2, 'link_hash' => 'hash', 'preview' => false, ]; $urlDataObject = Links::createUrlDataObject( $data['subscriber_id'], $data['subscriber_token'], $data['queue_id'], $data['link_hash'], $data['preview'] ); // URL data object should be an indexed array expect($urlDataObject)->equals(array_values($data)); // transformed URL object should be an associative array $transformedUrlDataObject = Links::transformUrlDataObject($urlDataObject); expect($transformedUrlDataObject)->equals($data); } public function testItReplacesHashedLinksWithSubscriberData() { $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); $subscriber->save(); $queue = SendingQueue::create(); $queue->newsletterId = 1; $queue->save(); $template = 'some site '; $result = Links::replaceSubscriberData($subscriber->id, $queue->id, $template); // there are no click/open data tags expect($result)->stringNotContainsString(Links::DATA_TAG_CLICK); expect($result)->stringNotContainsString(Links::DATA_TAG_OPEN); // data tags were converted to URLs expect($result) ->regExp('//'); // data was properly encoded preg_match_all('/data=(?P.*?)"/', $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(); } } public function testItCanSaveLinks() { $links = [ [ 'link' => 'http://example.com', 'hash' => '123', ], ]; Links::save( $links, $newsletterId = 1, $queueId = 1 ); // 1 database record was created $newsltterLink = NewsletterLink::where('newsletter_id', 1) ->where('queue_id', 1) ->findOne(); expect($newsltterLink->hash)->equals('123'); expect($newsltterLink->url)->equals('http://example.com'); } public function testItCanReuseAlreadySavedLinks() { $link = NewsletterLink::create(); $link->newsletterId = 1; $link->queueId = 2; $link->hash = '123'; $link->url = 'http://example.com'; $link->save(); $link = NewsletterLink::create(); $link->newsletterId = 1; $link->queueId = 3; $link->hash = '456'; $link->url = 'http://demo.com'; $link->save(); list($content, $links) = Links::process('x', 1, 2); expect(is_array($links))->true(); expect(count($links))->equals(1); expect($links[0]['hash'])->equals('123'); expect($links[0]['url'])->equals('http://example.com'); } public 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(); } public function testItCanConvertOnlyHashedLinkShortcodes() { // create newsletter link association $queueId = 1; $newsletterLink = NewsletterLink::create(); $newsletterLink->newsletterId = 1; $newsletterLink->queueId = $queueId; $newsletterLink->hash = '90e56'; $newsletterLink->url = '[link:newsletter_view_in_browser_url]'; $newsletterLink = $newsletterLink->save(); $content = ' View in browser Some link'; $result = Links::convertHashedLinksToShortcodesAndUrls($content, $queueId); expect($result)->stringContainsString($newsletterLink->url); expect($result)->stringContainsString('[mailpoet_click_data]-123'); } public function testItCanEnsureThatUnsubscribeLinkIsAmongProcessedLinks() { $links = [ [ 'link' => 'http://example.com', 'type' => Links::LINK_TYPE_URL, 'processed_link' => '[mailpoet_click_data]-123', 'hash' => 'abcdfgh', ], ]; $links = Links::ensureInstantUnsubscribeLink($links); expect(count($links))->equals(2); expect($links[1]['link'])->equals(NewsletterLink::INSTANT_UNSUBSCRIBE_LINK_SHORT_CODE); expect($links[1]['type'])->equals(Links::LINK_TYPE_SHORTCODE); expect($links[1])->hasKey('processed_link'); expect($links[1])->hasKey('hash'); $links = Links::ensureInstantUnsubscribeLink($links); expect(count($links))->equals(2); } public function testItCanConvertAllHashedLinksToUrls() { // create newsletter link associations $queueId = 1; $newsletterLink1 = NewsletterLink::create(); $newsletterLink1->newsletterId = 1; $newsletterLink1->queueId = $queueId; $newsletterLink1->hash = '90e56'; $newsletterLink1->url = '[link:newsletter_view_in_browser_url]'; $newsletterLink1 = $newsletterLink1->save(); $newsletterLink2 = NewsletterLink::create(); $newsletterLink2->newsletterId = 1; $newsletterLink2->queueId = $queueId; $newsletterLink2->hash = '123'; $newsletterLink2->url = 'http://google.com'; $newsletterLink2 = $newsletterLink2->save(); $content = ' View in browser Some link'; $result = Links::convertHashedLinksToShortcodesAndUrls($content, $queueId, $convertAll = true); expect($result)->stringContainsString($newsletterLink1->url); expect($result)->stringContainsString($newsletterLink2->url); } public function _after() { ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); ORM::raw_execute('TRUNCATE ' . NewsletterLink::$_table); } }