# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import re
from odoo.tests import common, tagged
from odoo.tools import TEXT_URL_REGEX
@tagged('-at_install', 'post_install')
class TestMailRenderMixin(common.HttpCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.base_url = cls.env["mail.render.mixin"].get_base_url()
def test_shorten_links(self):
test_links = [
'test_label',
'',
"""
""",
""" test_strange_html_label
""",
' test_escaped < > ',
'label',
'',
]
self.env["mail.render.mixin"]._shorten_links("".join(test_links), {})
trackers_to_find = [
[("url", "=", "https://gitlab.com"), ("label", "=", "test_label")],
[("url", "=", "https://test_542152qsdqsd.com")],
[
("url", "=", "https://test_strange_html.com"),
("label", "=", "test_strange_html_label"),
],
[
("url", "=", "https://test_escaped.com"),
("label", "=", "test_escaped < >"),
],
[
("url", "=", "https://url_with_params.com?a=b&c=d"),
("label", "=", "label"),
],
[("url", "=", self.base_url + '#')],
]
trackers_to_fail = [
[("url", "=", "https://test_542152qsdqsd.com"), ("label", "ilike", "_")]
]
for tracker_to_find in trackers_to_find:
self.assertTrue(self.env["link.tracker"].search(tracker_to_find))
for tracker_to_fail in trackers_to_fail:
self.assertFalse(self.env["link.tracker"].search(tracker_to_fail))
def test_shorten_links_html_skip_shorts(self):
old_content = self.env["mail.render.mixin"]._shorten_links(
'This is a link: old', {})
created_short_url_match = re.search(TEXT_URL_REGEX, old_content)
self.assertIsNotNone(created_short_url_match)
created_short_url = created_short_url_match[0]
self.assertRegex(created_short_url, "{base_url}/r/[\\w]+".format(base_url=self.base_url))
new_content = self.env["mail.render.mixin"]._shorten_links(
'Reusing this old link with a new one'
.format(old_short_url=created_short_url),
{}
)
expected = re.compile(
'Reusing this old link with a new one'
.format(old_short_url=created_short_url, base_url=self.base_url)
)
self.assertRegex(new_content, expected)
def test_shorten_links_html_including_base_url(self):
content = (
'This is a link: https://www.worldcommunitygrid.org
\n'
'This is another: {base_url}
\n'
'And a third: Here\n'
'And a forth: Here\n'
'And a fifth: Here too\n'
'And a 6th: Here
\n'
'And a last, more complex: There!'
.format(base_url=self.base_url)
)
expected_pattern = re.compile(
'This is a link: https://www.worldcommunitygrid.org
\n'
'This is another: {base_url}
\n'
'And a third: Here\n'
'And a forth: Here\n'
'And a fifth: Here too\n'
'And a 6th: Here
\n'
'And a last, more complex: There!'
.format(base_url=self.base_url)
)
new_content = self.env["mail.render.mixin"]._shorten_links(content, {})
self.assertRegex(new_content, expected_pattern)
matches = expected_pattern.search(new_content).groups()
# 3rd and 4th lead to the same short_url
self.assertEqual(matches[0], matches[1])
# 5th has different label but should currently lead to the same link
self.assertEqual(matches[1], matches[2])
def test_shorten_links_text_including_base_url(self):
content = (
'This is a link: https://www.worldcommunitygrid.org\n'
'This is another: {base_url}/web#debug=1&more=2\n'
'A third: {base_url}\n'
'A forth: {base_url}\n'
'And a last, with question mark: https://boinc.berkeley.edu/forum_thread.php?id=14544&postid=106833'
.format(base_url=self.base_url)
)
expected_pattern = re.compile(
'This is a link: {base_url}/r/[\\w]+\n'
'This is another: {base_url}/r/[\\w]+\n'
'A third: {base_url}/r/([\\w]+)\n'
'A forth: {base_url}/r/([\\w]+)\n'
'And a last, with question mark: {base_url}/r/([\\w]+)'
.format(base_url=self.base_url)
)
new_content = self.env["mail.render.mixin"]._shorten_links_text(content, {})
self.assertRegex(new_content, expected_pattern)
matches = expected_pattern.search(new_content).groups()
# 3rd and 4th lead to the same short_url
self.assertEqual(matches[0], matches[1])
def test_shorten_links_text_skip_shorts(self):
old_content = self.env["mail.render.mixin"]._shorten_links_text(
'This is a link: https://test_542152qsdqsd.com', {})
created_short_url_match = re.search(TEXT_URL_REGEX, old_content)
self.assertIsNotNone(created_short_url_match)
created_short_url = created_short_url_match[0]
self.assertRegex(created_short_url, "{base_url}/r/[\\w]+".format(base_url=self.base_url))
new_content = self.env["mail.render.mixin"]._shorten_links_text(
'Reusing this old link {old_short_url} with a new one, https://odoo.com'
.format(old_short_url=created_short_url),
{}
)
expected = re.compile(
'Reusing this old link {old_short_url} with a new one, {base_url}/r/[\\w]+'
.format(old_short_url=created_short_url, base_url=self.base_url)
)
self.assertRegex(new_content, expected)