[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:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user