When possible, use '@users' decorator. Rename tests to better match their
main purpose, notably
* test_mail_track*: mail_track specific (specific fields, display)
* test_message_track*: overall behavior of 'message_track', notably subtypes,
template usage, ...
Add some additional tests and improve test coverage, as some field types
were not covered (date, datetime, text notably). Improve currency
check for monetary fields.
Move 'mail.tracking.duration.mixin' tests into the file testing mixins
linked to 'mail.thread', rename the Case class according to current test
guidelines.
Also starting from now, `MailCommon` flushes tracking automatically at
setup time, allowing to remove some custom flush done in tests. That way
tests are less prone to non deterministic errors. This implies some changes
in execution of tests, which means some updated query counters notably.
Task-3345979 (Mail: Simplify tracking model)
Part-of: odoo/odoo#124182
103 lines
4.4 KiB
Python
103 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import exceptions, tools
|
|
from odoo.addons.mail.tests.common import MailCommon
|
|
from odoo.addons.mail.tests.mail_tracking_duration_mixin_case import MailTrackingDurationMixinCase
|
|
from odoo.addons.test_mail.tests.common import TestRecipients
|
|
from odoo.tests.common import tagged, users
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
@tagged('mail_thread', 'mail_track')
|
|
class TestMailTrackingDurationMixin(MailTrackingDurationMixinCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass('mail.test.mail.tracking.duration')
|
|
|
|
def test_mail_tracking_duration(self):
|
|
self._test_record_duration_tracking()
|
|
|
|
def test_mail_tracking_duration_batch(self):
|
|
self._test_record_duration_tracking_batch()
|
|
|
|
def test_queries_batch_mail_tracking_duration(self):
|
|
self._test_queries_batch_duration_tracking()
|
|
|
|
|
|
@tagged('mail_thread', 'mail_blacklist')
|
|
class TestMailThread(MailCommon, TestRecipients):
|
|
|
|
@mute_logger('odoo.models.unlink')
|
|
def test_blacklist_mixin_email_normalized(self):
|
|
""" Test email_normalized and is_blacklisted fields behavior, notably
|
|
when dealing with encapsulated email fields and multi-email input. """
|
|
base_email = 'test.email@test.example.com'
|
|
|
|
# test data: source email, expected email normalized
|
|
valid_pairs = [
|
|
(base_email, base_email),
|
|
(tools.formataddr(('Another Name', base_email)), base_email),
|
|
(f'Name That Should Be Escaped <{base_email}>', base_email),
|
|
('test.😊@example.com', 'test.😊@example.com'),
|
|
('"Name 😊" <test.😊@example.com>', 'test.😊@example.com'),
|
|
]
|
|
void_pairs = [(False, False),
|
|
('', False),
|
|
(' ', False)]
|
|
multi_pairs = [
|
|
(f'{base_email}, other.email@test.example.com',
|
|
base_email), # multi supports first found
|
|
(f'{tools.formataddr(("Another Name", base_email))}, other.email@test.example.com',
|
|
base_email), # multi supports first found
|
|
]
|
|
for email_from, exp_email_normalized in valid_pairs + void_pairs + multi_pairs:
|
|
with self.subTest(email_from=email_from, exp_email_normalized=exp_email_normalized):
|
|
new_record = self.env['mail.test.gateway'].create({
|
|
'email_from': email_from,
|
|
'name': 'BL Test',
|
|
})
|
|
self.assertEqual(new_record.email_normalized, exp_email_normalized)
|
|
self.assertFalse(new_record.is_blacklisted)
|
|
|
|
# blacklist email should fail as void
|
|
if email_from in [pair[0] for pair in void_pairs]:
|
|
with self.assertRaises(exceptions.UserError):
|
|
bl_record = self.env['mail.blacklist']._add(email_from)
|
|
# blacklist email currently fails but could not
|
|
elif email_from in [pair[0] for pair in multi_pairs]:
|
|
with self.assertRaises(exceptions.UserError):
|
|
bl_record = self.env['mail.blacklist']._add(email_from)
|
|
# blacklist email ok
|
|
else:
|
|
bl_record = self.env['mail.blacklist']._add(email_from)
|
|
self.assertEqual(bl_record.email, exp_email_normalized)
|
|
new_record.invalidate_recordset(fnames=['is_blacklisted'])
|
|
self.assertTrue(new_record.is_blacklisted)
|
|
|
|
bl_record.unlink()
|
|
|
|
|
|
@tagged('mail_thread', 'mail_thread_cc')
|
|
class TestMailThreadCC(MailCommon):
|
|
|
|
@users("employee")
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_suggested_recipients_mail_cc(self):
|
|
""" MailThreadCC mixin adds its own suggested recipients management
|
|
coming from CC (carbon copy) management. """
|
|
record = self.env['mail.test.cc'].create({
|
|
'email_cc': 'cc1@example.com, cc2@example.com, cc3 <cc3@example.com>',
|
|
})
|
|
suggestions = record._message_get_suggested_recipients()[record.id]
|
|
self.assertEqual(
|
|
sorted(suggestions),
|
|
[
|
|
(False, '"cc3" <cc3@example.com>', None, 'CC Email', {}),
|
|
(False, 'cc1@example.com', None, 'CC Email', {}),
|
|
(False, 'cc2@example.com', None, 'CC Email', {}),
|
|
],
|
|
'cc should be in suggestions'
|
|
)
|