diff --git a/addons/link_tracker/tests/common.py b/addons/link_tracker/tests/common.py index f4c13c3e4d5..1de5ea1b3c5 100644 --- a/addons/link_tracker/tests/common.py +++ b/addons/link_tracker/tests/common.py @@ -14,9 +14,6 @@ class MockLinkTracker(common.BaseCase): def setUp(self): super(MockLinkTracker, self).setUp() - self._web_base_url = self.env['mail.mail'].get_base_url() - self.env['ir.config_parameter'].sudo().set_param('web.base.url', 'https://test.odoo.com') - def _get_title_from_url(url): return "Test_TITLE" @@ -29,11 +26,13 @@ class MockLinkTracker(common.BaseCase): html = etree.fromstring(body, parser=etree.HTMLParser()) 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([ + def _get_code_from_short_url(self, short_url): + return self.env['link.tracker.code'].sudo().search([ ('code', '=', short_url.split('/r/')[-1]) ]) - return code.link_id + + def _get_tracker_from_short_url(self, short_url): + return self._get_code_from_short_url(short_url).link_id def assertLinkShortenedHtml(self, body, link_info, link_params=None): """ Find shortened links in an HTML content. Usage : diff --git a/addons/link_tracker/tests/test_link_tracker.py b/addons/link_tracker/tests/test_link_tracker.py index 3b1d405b005..45f4fc23f84 100644 --- a/addons/link_tracker/tests/test_link_tracker.py +++ b/addons/link_tracker/tests/test_link_tracker.py @@ -1,12 +1,19 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from .common import MockLinkTracker -from odoo.tests import common +from odoo.addons.link_tracker.tests.common import MockLinkTracker from odoo.exceptions import UserError +from odoo.tests import common, tagged +@tagged('link_tracker') class TestLinkTracker(common.TransactionCase, MockLinkTracker): + + def setUp(self): + super(TestLinkTracker, self).setUp() + self._web_base_url = 'https://test.odoo.com' + self.env['ir.config_parameter'].sudo().set_param('web.base.url', self._web_base_url) + def test_create(self): link_trackers = self.env['link.tracker'].create([ { @@ -120,9 +127,9 @@ class TestLinkTracker(common.TransactionCase, MockLinkTracker): # URL to the local website -> UTM parameters should be added since we know we handle them # even though the parameter "no_external_tracking" is enabled - link.url = 'https://test.odoo.com/test?a=example.com' + link.url = f'{self._web_base_url}/test?a=example.com' self.assertLinkParams( - 'https://test.odoo.com/test', + f'{self._web_base_url}/test', link, {**expected_utm_params, 'a': 'example.com'} ) diff --git a/addons/mass_mailing/tests/test_mailing_ab_testing.py b/addons/mass_mailing/tests/test_mailing_ab_testing.py index 9d6a1a1d5db..5d3880c9a13 100644 --- a/addons/mass_mailing/tests/test_mailing_ab_testing.py +++ b/addons/mass_mailing/tests/test_mailing_ab_testing.py @@ -10,6 +10,7 @@ from odoo.tools import mute_logger @tagged('post_install', '-at_install') class TestMailingABTesting(MassMailCommon): + def setUp(self): super().setUp() self.mailing_list = self._create_mailing_list_of_x_contacts(150) diff --git a/addons/mass_mailing/tests/test_mailing_controllers.py b/addons/mass_mailing/tests/test_mailing_controllers.py index fefe7796738..de181ba070d 100644 --- a/addons/mass_mailing/tests/test_mailing_controllers.py +++ b/addons/mass_mailing/tests/test_mailing_controllers.py @@ -1,24 +1,94 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from freezegun import freeze_time + +import datetime import werkzeug from odoo.addons.mass_mailing.tests.common import MassMailCommon from odoo.tests.common import HttpCase +from odoo.tests import tagged -class TestMassMailingControllers(MassMailCommon, HttpCase): +@tagged('link_tracker') +class TestMailingControllers(MassMailCommon, HttpCase): + + @classmethod + def setUpClass(cls): + super(TestMailingControllers, cls).setUpClass() + cls._create_mailing_list() + cls.test_mailing = cls.env['mailing.mailing'].create({ + 'body_html': '

Hello
Go to this link

', + 'contact_list_ids': [(4, cls.mailing_list_1.id), (4, cls.mailing_list_2.id)], + 'mailing_model_id': cls.env['ir.model']._get('mailing.list').id, + 'mailing_type': 'mail', + 'name': 'TestMailing', + 'reply_to': cls.email_reply_to, + 'subject': 'Test', + }) + + cls.test_contact = cls.mailing_list_1.contact_ids[0] + + # freeze time base value + cls._reference_now = datetime.datetime(2022, 6, 14, 10, 0, 0) + + def test_tracking_short_code(self): + """ Test opening short code linked to a mailing trace: should set the + trace as opened and clicked, create a click record. """ + mailing = self.test_mailing.with_env(self.env) + with self.mock_mail_gateway(mail_unlink_sent=False): + mailing.action_send_mail() + + mail = self._find_mail_mail_wrecord(self.test_contact) + mailing_trace = mail.mailing_trace_ids + link_tracker_code = self._get_code_from_short_url( + self._get_href_from_anchor_id(mail.body, 'url') + ) + self.assertEqual(len(link_tracker_code), 1) + self.assertEqual(link_tracker_code.link_id.count, 0) + self.assertEqual(mail.state, 'sent') + self.assertEqual(len(mailing_trace), 1) + self.assertFalse(mailing_trace.links_click_datetime) + self.assertFalse(mailing_trace.open_datetime) + self.assertEqual(mailing_trace.trace_status, 'sent') + + short_link_url = werkzeug.urls.url_join( + mail.get_base_url(), + f'r/{link_tracker_code.code}/m/{mailing_trace.id}' + ) + with freeze_time(self._reference_now): + _response = self.url_open(short_link_url) + + self.assertEqual(link_tracker_code.link_id.count, 1) + self.assertEqual(mailing_trace.links_click_datetime, self._reference_now) + self.assertEqual(mailing_trace.open_datetime, self._reference_now) + self.assertEqual(mailing_trace.trace_status, 'open') def test_tracking_url_token(self): - self.env['ir.config_parameter'].sudo().set_param('web.base.url', self._web_base_url) + """ Test tracking of mails linked to a mailing trace: should set the + trace as opened. """ + mailing = self.test_mailing.with_env(self.env) + with self.mock_mail_gateway(mail_unlink_sent=False): + mailing.action_send_mail() - mail_mail = self.env['mail.mail'].create({}) + mail = self._find_mail_mail_wrecord(self.test_contact) + mailing_trace = mail.mailing_trace_ids + self.assertEqual(mail.state, 'sent') + self.assertEqual(len(mailing_trace), 1) + self.assertFalse(mailing_trace.open_datetime) + self.assertEqual(mailing_trace.trace_status, 'sent') - response = self.url_open(mail_mail._get_tracking_url()) + with freeze_time(self._reference_now): + response = self.url_open(mail._get_tracking_url()) self.assertEqual(response.status_code, 200) + self.assertEqual(mail.state, 'sent') + self.assertEqual(mailing_trace.open_datetime, self._reference_now) + self.assertEqual(mailing_trace.trace_status, 'open') - base_url = mail_mail.get_base_url() - url = werkzeug.urls.url_join(base_url, 'mail/track/%s/fake_token/blank.gif' % mail_mail.id) - - response = self.url_open(url) + track_url = werkzeug.urls.url_join( + mail.get_base_url(), + 'mail/track/%s/fake_token/blank.gif' % mail.id + ) + response = self.url_open(track_url) self.assertEqual(response.status_code, 400) diff --git a/addons/test_mail_full/tests/test_sms_sms.py b/addons/test_mail_full/tests/test_sms_sms.py index 8ad82017b13..829c8be6cc9 100644 --- a/addons/test_mail_full/tests/test_sms_sms.py +++ b/addons/test_mail_full/tests/test_sms_sms.py @@ -10,8 +10,10 @@ from odoo import exceptions from odoo.addons.link_tracker.tests.common import MockLinkTracker from odoo.addons.sms.models.sms_sms import SmsSms as SmsSms from odoo.addons.test_mail_full.tests.common import TestMailFullCommon +from odoo.tests import tagged +@tagged('link_tracker') class TestSMSPost(TestMailFullCommon, MockLinkTracker): @classmethod @@ -34,6 +36,11 @@ class TestSMSPost(TestMailFullCommon, MockLinkTracker): 'medium_id': cls.utm_m.id, } + def setUp(self): + super(TestSMSPost, self).setUp() + self._web_base_url = 'https://test.odoo.com' + self.env['ir.config_parameter'].sudo().set_param('web.base.url', self._web_base_url) + def test_body_link_shorten(self): link = 'http://www.example.com' self.env['link.tracker'].search([('url', '=', link)]).unlink() @@ -43,7 +50,7 @@ class TestSMSPost(TestMailFullCommon, MockLinkTracker): link = self.env['link.tracker'].search([('url', '=', link)]) self.assertIn(link.short_url, new_body) - link = 'https://test.odoo.com/my/super_page?test[0]=42&toto=áâà#title3' + link = f'{self._web_base_url}/my/super_page?test[0]=42&toto=áâà#title3' self.env['link.tracker'].search([('url', '=', link)]).unlink() new_body = self.env['mail.render.mixin']._shorten_links_text('Welcome to %s !' % link, self.tracker_values) self.assertNotIn(link, new_body) @@ -60,14 +67,14 @@ class TestSMSPost(TestMailFullCommon, MockLinkTracker): self.assertFalse(new_body) def test_body_link_shorten_wshort(self): - link = 'https://test.odoo.com/r/RAOUL' + link = f'{self._web_base_url}/r/RAOUL' self.env['link.tracker'].search([('url', '=', link)]).unlink() new_body = self.env['mail.render.mixin']._shorten_links_text('Welcome to %s !' % link, self.tracker_values) self.assertIn(link, new_body) self.assertFalse(self.env['link.tracker'].search([('url', '=', link)])) def test_body_link_shorten_wunsubscribe(self): - link = 'https://test.odoo.com/sms/3/' + link = f'{self._web_base_url}/sms/3/' self.env['link.tracker'].search([('url', '=', link)]).unlink() new_body = self.env['mail.render.mixin']._shorten_links_text('Welcome to %s !' % link, self.tracker_values) self.assertIn(link, new_body) @@ -81,39 +88,39 @@ class TestSMSPost(TestMailFullCommon, MockLinkTracker): }) sms_0 = self.env['sms.sms'].create({ - 'body': 'Welcome to https://test.odoo.com', + 'body': f'Welcome to {self._web_base_url}', 'number': '10', 'mailing_id': mailing.id, }) sms_1 = self.env['sms.sms'].create({ - 'body': 'Welcome to https://test.odoo.com/r/RAOUL', + 'body': f'Welcome to {self._web_base_url}/r/RAOUL', 'number': '11', }) sms_2 = self.env['sms.sms'].create({ - 'body': 'Welcome to https://test.odoo.com/r/RAOUL', + 'body': f'Welcome to {self._web_base_url}/r/RAOUL', 'number': '12', 'mailing_id': mailing.id, }) sms_3 = self.env['sms.sms'].create({ - 'body': 'Welcome to https://test.odoo.com/leodagan/r/RAOUL', + 'body': f'Welcome to {self._web_base_url}/leodagan/r/RAOUL', 'number': '13', 'mailing_id': mailing.id, }) sms_4 = self.env['sms.sms'].create({ - 'body': 'Welcome to https://test.odoo.com/r/RAOUL\nAnd again,\n' - 'https://test.odoo.com/r/RAOUL', + 'body': f'Welcome to {self._web_base_url}/r/RAOUL\nAnd again,\n' + f'{self._web_base_url}/r/RAOUL', 'number': '14', 'mailing_id': mailing.id, }) res = (sms_0 | sms_1 | sms_2 | sms_3 | sms_4)._update_body_short_links() - self.assertEqual(res[sms_0.id], 'Welcome to https://test.odoo.com') - self.assertEqual(res[sms_1.id], 'Welcome to https://test.odoo.com/r/RAOUL') - self.assertEqual(res[sms_2.id], 'Welcome to https://test.odoo.com/r/RAOUL/s/%s' % sms_2.id) - self.assertEqual(res[sms_3.id], 'Welcome to https://test.odoo.com/leodagan/r/RAOUL') + self.assertEqual(res[sms_0.id], f'Welcome to {self._web_base_url}') + self.assertEqual(res[sms_1.id], f'Welcome to {self._web_base_url}/r/RAOUL') + self.assertEqual(res[sms_2.id], f'Welcome to {self._web_base_url}/r/RAOUL/s/%s' % sms_2.id) + self.assertEqual(res[sms_3.id], f'Welcome to {self._web_base_url}/leodagan/r/RAOUL') self.assertEqual( res[sms_4.id], - f'Welcome to https://test.odoo.com/r/RAOUL/s/{sms_4.id}\nAnd again,\nhttps://test.odoo.com/r/RAOUL/s/{sms_4.id}') + f'Welcome to {self._web_base_url}/r/RAOUL/s/{sms_4.id}\nAnd again,\n{self._web_base_url}/r/RAOUL/s/{sms_4.id}') def test_sms_send_batch_size(self): self.count = 0