PURPOSE When displaying an email in a list the mail client (gmail, outlook...) computes a preview based on the content. This preview is generally not well computed as it contains a lot of garbage and tags while it should contain only relevant text. SPECIFICATIONS To build this preview, all mail clients read the content of the email. The only way to be able to customize the preview is to add an invisible HTML element at the beginning of the email with the wanted preview text. We add at the end of the preview `‌` (zero-width non-joiner) to fill the end of the preview in order to not have the beginning of the mail at the end of the preview. It doesn't work with simple space as the mail clients trim each HTML element content. Task ID-2172125 PR #49886
72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import werkzeug
|
|
|
|
from lxml import etree
|
|
from unittest.mock import patch
|
|
|
|
from odoo.tests import common
|
|
|
|
|
|
class MockLinkTracker(common.BaseCase):
|
|
|
|
def setUp(self):
|
|
super(MockLinkTracker, self).setUp()
|
|
|
|
def _get_title_from_url(url):
|
|
return "Test_TITLE"
|
|
|
|
link_tracker_title_patch = patch('odoo.addons.link_tracker.models.link_tracker.LinkTracker._get_title_from_url', wraps=_get_title_from_url)
|
|
link_tracker_title_patch.start()
|
|
self.addCleanup(link_tracker_title_patch.stop)
|
|
|
|
def _get_href_from_anchor_id(self, body, anchor_id):
|
|
html = etree.fromstring(body)
|
|
return html.xpath("//*[@id='%s']" % anchor_id)[0].attrib.get('href')
|
|
|
|
def _get_tracker_from_short_url(self, short_url):
|
|
code = self.env['link.tracker.code'].sudo().search([
|
|
('code', '=', short_url.split('/r/')[-1])
|
|
])
|
|
return code.link_id
|
|
|
|
def assertLinkShortenedHtml(self, body, link_info, link_params=None):
|
|
""" Find shortened links in an HTML content. Usage :
|
|
|
|
self.assertLinkShortenedHtml(
|
|
message.body,
|
|
('url0', 'http://www.odoo.com', True),
|
|
{'utm_campaign': self.utm_c.name, 'utm_medium': self.utm_m.name}
|
|
)
|
|
"""
|
|
(anchor_id, url, is_shortened) = link_info
|
|
anchor_href = self._get_href_from_anchor_id("<div>%s</div>" % body, anchor_id)
|
|
if is_shortened:
|
|
self.assertTrue('/r/' in anchor_href, '%s should be shortened: %s' % (anchor_id, anchor_href))
|
|
link_tracker = self._get_tracker_from_short_url(anchor_href)
|
|
self.assertEqual(url, link_tracker.url)
|
|
self.assertLinkParams(url, link_tracker, link_params=link_params)
|
|
else:
|
|
self.assertTrue('/r/' not in anchor_href, '%s should not be shortened: %s' % (anchor_id, anchor_href))
|
|
self.assertEqual(anchor_href, url)
|
|
|
|
def assertLinkParams(self, url, link_tracker, link_params=None):
|
|
""" Usage
|
|
|
|
self.assertLinkTracker(
|
|
'http://www.example.com',
|
|
link_tracker,
|
|
{'utm_campaign': self.utm_c.name, 'utm_medium': self.utm_m.name}
|
|
)
|
|
"""
|
|
# check UTMS are correctly set on redirect URL
|
|
original_url = werkzeug.urls.url_parse(url)
|
|
redirect_url = werkzeug.urls.url_parse(link_tracker.redirected_url)
|
|
redirect_params = redirect_url.decode_query().to_dict(flat=True)
|
|
self.assertEqual(redirect_url.scheme, original_url.scheme)
|
|
self.assertEqual(redirect_url.decode_netloc(), original_url.decode_netloc())
|
|
self.assertEqual(redirect_url.path, original_url.path)
|
|
if link_params:
|
|
self.assertEqual(redirect_params, link_params)
|