Install mass_mailing with demo data, send a mailing using the "Thank you for joining us" template. Inside your mail client, click on the LOGIN button, this open your web browser on a link-tracker URL but the page fails to load because "The page isn't redirecting properly". Inside the template of that "Thank you for joining us" mail, the logging button is basically defined as follow: `<a href="#">LOGIN</a>`, a URL with a fragment that is empty, a redirection to the current page. Upon rendering that template and send it to the recipients, all links are wrapped inside a link-tracker for well tracking purpose, this created a link `/r/xyz` targeting `#`. Upon accessing that `/r/xyz` URL the client would be redirected to `#` which in that context is actually `/r/xyz#`: the link-tracker itself. The browser detects that there is a redirecting loop and show an error instead. The problem is solved by saving an absolute link with the link-tracker instead of a relative one. Task-3603607 closes odoo/odoo#150678 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com> Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
156 lines
7.0 KiB
Python
156 lines
7.0 KiB
Python
# -*- 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 = [
|
|
'<a href="https://gitlab.com" title="title" fake="fake">test_label</a>',
|
|
'<a href="https://test_542152qsdqsd.com"/>',
|
|
"""<a href="https://third_test_54212.com">
|
|
<img src="imagesrc"/>
|
|
</a>
|
|
""",
|
|
"""<a
|
|
href="https://test_strange_html.com" title="title"
|
|
fake='fake'
|
|
> test_strange_html_label
|
|
</a>
|
|
""",
|
|
'<a href="https://test_escaped.com" title="title" fake="fake"> test_escaped < > </a>',
|
|
'<a href="https://url_with_params.com?a=b&c=d">label</a>',
|
|
'<a href="#"></a>',
|
|
]
|
|
|
|
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: <a href="https://test_542152qsdqsd.com">old</a>', {})
|
|
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 <a href="{old_short_url}">link</a> with a new <a href="https://odoo.com">one</a>'
|
|
.format(old_short_url=created_short_url),
|
|
{}
|
|
)
|
|
expected = re.compile(
|
|
'Reusing this old <a href="{old_short_url}">link</a> with a new <a href="{base_url}/r/[\\w]+">one</a>'
|
|
.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: <a href="https://www.worldcommunitygrid.org">https://www.worldcommunitygrid.org</a><br/>\n'
|
|
'This is another: <a href="{base_url}/web#debug=1&more=2">{base_url}</a><br/>\n'
|
|
'And a third: <a href="{base_url}">Here</a>\n'
|
|
'And a forth: <a href="{base_url}">Here</a>\n'
|
|
'And a fifth: <a href="{base_url}">Here too</a>\n'
|
|
'And a 6th: <a href="/web">Here</a><br>\n'
|
|
'And a last, more complex: <a href="https://boinc.berkeley.edu/forum_thread.php?id=14544&postid=106833">There!</a>'
|
|
.format(base_url=self.base_url)
|
|
)
|
|
expected_pattern = re.compile(
|
|
'This is a link: <a href="{base_url}/r/[\\w]+">https://www.worldcommunitygrid.org</a><br/>\n'
|
|
'This is another: <a href="{base_url}/r/[\\w]+">{base_url}</a><br/>\n'
|
|
'And a third: <a href="{base_url}/r/([\\w]+)">Here</a>\n'
|
|
'And a forth: <a href="{base_url}/r/([\\w]+)">Here</a>\n'
|
|
'And a fifth: <a href="{base_url}/r/([\\w]+)">Here too</a>\n'
|
|
'And a 6th: <a href="{base_url}/r/([\\w]+)">Here</a><br>\n'
|
|
'And a last, more complex: <a href="{base_url}/r/([\\w]+)">There!</a>'
|
|
.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</a>'
|
|
.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)
|