[IMP] mail, (test_)mass_mailing: also check sent emails if possible

When using assertMailMailWEmails custom assert we now check that a sent
mail.mail matches a sent email. It allows to have a complete check from
mailing traces to sent emails.

Task ID-2500615
COM PR odoo/odoo#68874
ENT PR odoo/enterprise#17558

X-original-commit: 59da8627e0d732b12fb98faa6e66e43b8c75dc9c
This commit is contained in:
Thibault Delavallée
2021-04-09 14:39:14 +00:00
parent 344c5ef072
commit a4a5bb45b5
6 changed files with 28 additions and 17 deletions
+3
View File
@@ -325,6 +325,9 @@ class MockEmail(common.BaseCase):
self.assertEqual(
found_mail[fname], fvalue,
'Mail: expected %s for %s, got %s' % (fvalue, fname, found_mail[fname]))
if status == 'sent':
for email_to in emails:
self.assertSentEmail(email_values['email_from'] if email_values and email_values.get('email_from') else author, [email_to], **(email_values or {}))
def assertNoMail(self, recipients, mail_message=None, author=None):
try:
+17 -12
View File
@@ -7,7 +7,8 @@ from odoo.addons.mail.tests.common import MailCase, MailCommon, mail_new_test_us
class MassMailCase(MailCase, MockLinkTracker):
def assertMailTraces(self, recipients_info, mailing, records, check_mail=True):
def assertMailTraces(self, recipients_info, mailing, records,
check_mail=True, author=None):
""" Check content of traces.
:param recipients_info: list[{
@@ -19,6 +20,15 @@ class MassMailCase(MailCase, MockLinkTracker):
'failure_type': optional: UPDATE ME
}, { ... }]
"""
# map trace state to email state
state_mapping = {
'sent': 'sent',
'replied': 'sent', # replied imply something has been sent
'ignored': 'cancel',
'exception': 'exception',
'canceled': 'canceled',
}
traces = self.env['mailing.trace'].search([
('mass_mailing_id', 'in', mailing.ids),
('res_id', 'in', records.ids)
@@ -47,22 +57,17 @@ class MassMailCase(MailCase, MockLinkTracker):
)
if check_mail:
if author is None:
author = self.env.user.partner_id
fields_values = {'mailing_id': mailing}
if 'failure_type' in recipient_info:
fields_values['failure_type'] = recipient_info['failure_type']
if state == 'sent':
self.assertMailMailWEmails([email], 'sent', content=content, fields_values=fields_values)
elif state == 'replied': # replied imply something has been sent
self.assertMailMailWEmails([email], 'sent', content=content, fields_values=fields_values)
elif state == 'ignored':
self.assertMailMailWEmails([email], 'cancel', content=content, fields_values=fields_values)
elif state == 'exception':
self.assertMailMailWEmails([email], 'exception', content=content, fields_values=fields_values)
elif state == 'canceled':
self.assertMailMailWEmails([email], 'canceled', content=content, fields_values=fields_values)
if partner:
self.assertMailMail(partner, state_mapping[state], author=author, content=content, fields_values=fields_values)
else:
raise NotImplementedError()
self.assertMailMailWEmails([email], state_mapping[state], author=author, content=content, fields_values=fields_values)
class MassMailCommon(MailCommon, MassMailCase):
@@ -240,8 +240,8 @@ class TestMassMailFeatures(MassMailCommon, CronMixinCase):
mailing._process_mass_mailing_queue()
self.assertMailTraces(
[{'email': 'test1@example.com'},
{'email': 'test2@example.com', 'state': 'ignored'}],
[{'partner': partner_a},
{'partner': partner_b, 'state': 'ignored'}],
mailing, partner_a | partner_b, check_mail=True
)
@@ -75,6 +75,6 @@ class TestMassMailing(TestMailFullCommon):
'http://localhost:%s/mailing/%s/view' % (config['http_port'], mailing.id),
email['body'])
self.assertMailTraces([recipient_info], mailing, recipient, check_mail=True)
self.assertMailTraces([recipient_info], mailing, recipient, check_mail=True, author=self.env.user.partner_id)
self.assertEqual(mailing.ignored, 4)
+3 -1
View File
@@ -14,7 +14,9 @@ class TestMassMailCommon(MassMailCommon, TestMailCommon):
def setUpClass(cls):
super(TestMassMailCommon, cls).setUpClass()
cls.mailing_bl = cls.env['mailing.mailing'].create({
# enforce last update by user_marketing to match _process_mass_mailing_queue
# taking last writer as user running a batch
cls.mailing_bl = cls.env['mailing.mailing'].with_user(cls.user_marketing).create({
'name': 'SourceName',
'subject': 'MailingSubject',
'body_html': '<p>Hello ${object.name}</p>',
@@ -35,7 +35,8 @@ class TestAutoBlacklist(common.TestMassMailCommon):
self.assertMailTraces(
[{'email': 'test.record.00@test.example.com'}],
mailing, target, check_mail=True
mailing, target,
check_mail=True
)
# call bounced