[IMP] test_mail: improve coverage of post helpers

Purpose of this commit is to add some test about MailThread helpers built on
top of ``message_post`` / ``composer`` (log, post with view, ...). Some tests
about batch are also added.

Some performance tests are also added for those helpers.

Counters are updated. Note that they did not change, it is just an update
based on current master counters.

Task-2710804 (MailThread Api Cleaning)

closes odoo/odoo#100184

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Thibault Delavallée
2022-09-14 23:38:05 +02:00
parent 6da353d66f
commit 94208cb8b4
5 changed files with 472 additions and 140 deletions
+16 -6
View File
@@ -501,12 +501,22 @@ class MockEmail(common.BaseCase, MockSmtplibCase):
expected['email_to'] = email_to_list
# fetch mail
sent_mail = next(
(mail for mail in self._mails
if set(mail['email_to']) == set(expected['email_to']) and mail['email_from'] == expected['email_from']
), False)
debug_info = '-'.join('From: %s-To: %s' % (mail['email_from'], mail['email_to']) for mail in self._mails) if not bool(sent_mail) else ''
self.assertTrue(bool(sent_mail), 'Expected mail from %s to %s not found in %s' % (expected['email_from'], expected['email_to'], debug_info))
sent_mails = [
mail for mail in self._mails
if set(mail['email_to']) == set(expected['email_to']) and mail['email_from'] == expected['email_from']
]
if len(sent_mails) > 1 and values.get('subject'):
# try to better filter
sent_mail = next((mail for mail in sent_mails if mail['subject'] == values['subject']), False)
else:
sent_mail = sent_mails[0] if sent_mails else False
debug_info = ''
if not sent_mail:
debug_info = '-'.join('From: %s-To: %s' % (mail['email_from'], mail['email_to']) for mail in self._mails)
self.assertTrue(
bool(sent_mail),
'Expected mail from %s to %s not found in %s' % (expected['email_from'], expected['email_to'], debug_info)
)
# assert values
for val in direct_check:
+1 -1
View File
@@ -34,7 +34,7 @@
</template>
<template id="mail_template_simple_test">
<p>Hello <t t-out="partner.name"/>,</p>
<p>Hello <t t-out="partner.name"/>, this comes from <t t-out="object.name"/>.</p>
</template>
</odoo>
@@ -50,6 +50,16 @@ class MailTestGatewayGroups(models.Model):
values['alias_parent_thread_id'] = self.id
return values
def _message_get_default_recipients(self):
return dict(
(record.id, {
'email_cc': False,
'email_to': record.email_from if not record.customer_id.ids else False,
'partner_ids': record.customer_id.ids,
})
for record in self
)
class MailTestStandard(models.Model):
""" This model can be used in tests when automatic subscription and simple
@@ -105,6 +115,16 @@ class MailTestTicket(models.Model):
user_id = fields.Many2one('res.users', 'Responsible', tracking=1)
container_id = fields.Many2one('mail.test.container', tracking=True)
def _message_get_default_recipients(self):
return dict(
(record.id, {
'email_cc': False,
'email_to': record.email_from if not record.customer_id.ids else False,
'partner_ids': record.customer_id.ids,
})
for record in self
)
def _notify_get_recipients_groups(self, msg_vals=None):
""" Activate more groups to test query counters notably (and be backward
compatible for tests). """
@@ -163,6 +183,16 @@ class MailTestContainer(models.Model):
'mail.alias', 'Alias',
delegate=True)
def _message_get_default_recipients(self):
return dict(
(record.id, {
'email_cc': False,
'email_to': False,
'partner_ids': record.customer_id.ids,
})
for record in self
)
def _notify_get_recipients_groups(self, msg_vals=None):
""" Activate more groups to test query counters notably (and be backward
compatible for tests). """
+280 -78
View File
@@ -412,12 +412,20 @@ class TestMessageNotify(TestMessagePostCommon):
@tagged('mail_post')
class TestMessagePost(TestMessagePostCommon, CronMixinCase):
class TestMessageLog(TestMessagePostCommon):
def test_initial_values(self):
self.assertFalse(self.test_record.message_ids)
self.assertFalse(self.test_record.message_follower_ids)
self.assertFalse(self.test_record.message_partner_ids)
@classmethod
def setUpClass(cls):
super(TestMessageLog, cls).setUpClass()
# ensure employee can create partners, necessary for templates
cls.user_employee.write({
'groups_id': [(4, cls.env.ref('base.group_partner_manager').id)],
})
cls.test_records, cls.test_partners = cls._create_records_for_batch(
'mail.test.ticket',
10,
)
@users('employee')
def test_message_log(self):
@@ -442,6 +450,67 @@ class TestMessagePost(TestMessagePostCommon, CronMixinCase):
}
)
@users('employee')
def test_message_log_batch(self):
test_records = self.test_records.with_env(self.env)
test_records.message_subscribe(self.partner_employee_2.ids)
new_notes = test_records._message_log_batch(
bodies=dict(
(test_record.id, '<p>Test _message_log_batch</p>')
for test_record in test_records
),
)
for test_record, new_note in zip(test_records, new_notes):
self.assertMessageFields(
new_note,
{'author_id': self.partner_employee,
'body': '<p>Test _message_log_batch</p>',
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': True,
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
}
)
@users('employee')
def test_message_log_with_view(self):
test_records = self.test_records.with_env(self.env)
test_records.message_subscribe(self.partner_employee_2.ids)
new_notes = test_records._message_log_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.user_employee.partner_id}
)
for test_record, new_note in zip(test_records, new_notes):
self.assertMessageFields(
new_note,
{'author_id': self.partner_employee,
'body': f'<p>Hello {self.user_employee.name}, this comes from {test_record.name}.</p>',
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': True,
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
}
)
@tagged('mail_post')
class TestMessagePost(TestMessagePostCommon, CronMixinCase):
def test_initial_values(self):
self.assertFalse(self.test_record.message_ids)
self.assertFalse(self.test_record.message_follower_ids)
self.assertFalse(self.test_record.message_partner_ids)
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@users('employee')
def test_message_post(self):
@@ -508,6 +577,37 @@ class TestMessagePost(TestMessagePostCommon, CronMixinCase):
partner_ids=self.partner_portal.ids,
)
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@users('employee')
def test_message_post_defaults(self):
""" Test default values when posting a classic message. """
test_record = self.env['mail.test.simple'].create([{'name': 'Defaults'}])
creation_msg = test_record.message_ids
self.assertEqual(len(creation_msg), 1)
with self.mock_mail_app():
new_message = test_record.message_post(
body='Body',
partner_ids=[self.partner_employee_2.id],
)
self.assertMessageFields(
new_message,
{'author_id': self.partner_employee,
'body': '<p>Body</p>',
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': False,
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.partner_employee_2,
'parent_id': creation_msg,
'record_name': test_record.name,
'reply_to': formataddr((f'{self.company_admin.name} {test_record.name}', f'{self.alias_catchall}@{self.alias_domain}')),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
}
)
@users('employee')
def test_message_post_inactive_follower(self):
""" Test posting with inactive followers does not notify them (e.g. odoobot) """
@@ -854,100 +954,202 @@ class TestMessagePostHelpers(TestMessagePostCommon):
'groups_id': [(4, cls.env.ref('base.group_partner_manager').id)],
})
cls.user_employee.write({
'groups_id': [(4, cls.env.ref('base.group_partner_manager').id)],
})
cls.test_records, cls.test_partners = cls._create_records_for_batch(
'mail.test.ticket',
10,
)
@users('employee')
def test_message_log_with_view(self):
test_record = self.env['mail.test.simple'].browse(self.test_record.ids)
new_note = test_record._message_log_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.user_employee.partner_id}
)
self.assertMessageFields(
new_note,
{'author_id': self.partner_employee,
'body': '<p>Hello %s,</p>' % self.user_employee.name,
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': True,
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
}
)
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_message_post_w_template(self):
test_record = self.env['mail.test.simple'].with_context(self._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
def test_message_mail_with_template(self):
""" Test sending mass mail on documents based on a template """
_attachments = self._generate_attachments_data(count=2, res_id=0, res_model='mail.template')
email_1 = 'test1@example.com'
email_2 = 'test2@example.com'
email_3 = self.partner_1.email
template = self._create_template('mail.test.simple', {
template = self._create_template('mail.test.ticket', {
'attachment_ids': [(0, 0, attach_vals) for attach_vals in _attachments],
'partner_to': '%s,%s' % (self.partner_2.id, self.user_admin.partner_id.id),
'email_to': '%s, %s' % (email_1, email_2),
'email_cc': '%s' % email_3,
'auto_delete': True,
# After the HTML sanitizer, it will become "<p>Body for: <t t-out="object.name" /><a href="">link</a></p>"
'body_html': 'Body for: <t t-out="object.name" /><script>test</script><a href="javascript:alert(1)">link</a>',
'email_cc': self.partner_1.email,
'email_to': f'{email_1}, {email_2}',
'partner_to': '{{ object.customer_id.id }},%s' % self.partner_2.id,
})
template.attachment_ids.write({'res_id': template.id})
# admin should receive emails
self.user_admin.write({'notification_type': 'email'})
test_records = self.test_records.with_env(self.env)
with self.mock_mail_gateway():
_new_mails, _new_messages = test_records.with_user(self.user_employee).message_post_with_template(
template.id,
composition_mode='mass_mail',
)
# created partners from inline email addresses
new_partners = self.env['res.partner'].search([('email', 'in', (email_1, email_2))])
self.assertEqual(len(new_partners), 2,
'Post with template: should have created partners based on template emails')
# sent emails (mass mail mode)
for test_record in test_records:
self.assertMailMail(
new_partners + self.partner_1 + self.partner_2 + test_record.customer_id,
'sent',
author=self.user_employee.partner_id,
email_values={
'attachments': [
('AttFileName_00.txt', b'AttContent_00', 'text/plain'),
('AttFileName_01.txt', b'AttContent_01', 'text/plain'),
],
'subject': f'About {test_record.name}',
'body_content': test_record.name,
},
fields_values={
'auto_delete': True,
'is_internal': False,
'is_notification': True, # not auto_delete_message -> keep underlying mail.message
'message_type': 'email',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'to_delete': True,
'subtype_id': self.env['mail.message.subtype'],
'reply_to': formataddr((f'{self.company_admin.name} {test_record.name}', f'{self.alias_catchall}@{self.alias_domain}')),
'res_id': test_record.id,
}
)
@users('employee')
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_message_mail_with_view(self):
""" Test sending a mass mailing on documents based on a view """
test_records = self.test_records.with_env(self.env)
for test_record in test_records:
test_record.message_subscribe(test_record.customer_id.ids)
with self.mock_mail_gateway():
res_messages = test_records.message_post_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.user_employee.partner_id},
composition_mode='mass_mail',
subject='About mass mailing',
)
self.assertEqual(len(res_messages), 0)
self.assertEqual(len(self._new_mails), 10)
# sent emails (mass mail mode)
for test_record in test_records:
self.assertMailMail(
[test_record.customer_id], 'sent',
author=self.user_employee.partner_id,
email_values={
'body_content': f'<p>Hello {self.user_employee.partner_id.name}, this comes from {test_record.name}.</p>',
'subject': 'About mass mailing',
},
fields_values={
'auto_delete': False,
'is_internal': False,
'is_notification': True, # not auto_delete_message -> keep underlying mail.message
'message_type': 'email',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'recipient_ids': test_record.customer_id,
'to_delete': False,
'subtype_id': self.env['mail.message.subtype'],
'reply_to': formataddr((f'{self.company_admin.name} {test_record.name}', f'{self.alias_catchall}@{self.alias_domain}')),
'res_id': test_record.id,
}
)
@users('employee')
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_message_post_with_template(self):
""" Test posting on a document based on a template content """
_attachments = self._generate_attachments_data(count=2, res_id=0, res_model='mail.template')
email_1 = 'test1@example.com'
email_2 = 'test2@example.com'
template = self._create_template('mail.test.ticket', {
'attachment_ids': [(0, 0, attach_vals) for attach_vals in _attachments],
'auto_delete': True,
'email_cc': self.partner_1.email,
'email_to': f'{email_1}, {email_2}',
'partner_to': '{{ object.customer_id.id }},%s' % self.partner_2.id,
})
template.attachment_ids.write({'res_id': template.id})
# Force the attachments of the template to be in the natural order.
self.email_template.invalidate_recordset(['attachment_ids'])
test_record = self.test_records.with_env(self.env)[0]
test_record.message_subscribe(test_record.customer_id.ids)
with self.mock_mail_gateway():
test_record.with_user(self.user_employee).message_post_with_template(self.email_template.id, composition_mode='comment')
_new_mail, new_message = test_record.with_user(self.user_employee).message_post_with_template(
self.email_template.id,
composition_mode='comment'
)
# created partners from inline email addresses
new_partners = self.env['res.partner'].search([('email', 'in', [email_1, email_2])])
for r in [self.partner_1, self.partner_2, new_partners[0], new_partners[1], self.partner_admin]:
self.assertSentEmail(
self.user_employee.partner_id,
[r],
subject='About %s' % test_record.name,
body_content=test_record.name,
attachments=[
('AttFileName_00.txt', b'AttContent_00', 'text/plain'),
('AttFileName_01.txt', b'AttContent_01', 'text/plain'),
]
)
self.assertEqual(len(new_partners), 2,
'Post with template: should have created partners based on template emails')
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_message_post_w_template_mass_mode(self):
test_record = self.env['mail.test.simple'].with_context(self._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
self.user_employee.write({
'groups_id': [(4, self.env.ref('base.group_partner_manager').id)],
})
# check notifications have been sent
self.assertMailNotifications(new_message, [{
'content': f'<p>Hello {test_record.name}</p>',
'message_type': 'notification',
'notif': [
{'partner': self.partner_1, 'type': 'email'},
{'partner': self.partner_2, 'type': 'email'},
{'partner': new_partners[0], 'type': 'email'},
{'partner': new_partners[1], 'type': 'email'},
{'partner': test_record.customer_id, 'type': 'email'},
],
'subtype': 'mail.mt_comment',
}])
self.assertMessageFields(
new_message,
{'author_id': self.partner_employee,
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': False,
'model': test_record._name,
'reply_to': formataddr((f'{self.company_admin.name} {test_record.name}', f'{self.alias_catchall}@{self.alias_domain}')),
'res_id': test_record.id,
}
)
_attachments = self._generate_attachments_data(count=2, res_id=0, res_model='mail.template')
template = self._create_template('mail.test.simple', {
'attachment_ids': [(0, 0, attach_vals) for attach_vals in _attachments],
# After the HTML sanitizer, it will become "<p>Body for: <t t-out="object.name" /><a href="">link</a></p>"
'body_html': 'Body for: <t t-out="object.name" /><script>test</script><a href="javascript:alert(1)">link</a>',
'email_to': 'test@example.com',
'email_cc': self.partner_1.email,
'partner_to': '%s,%s' % (self.partner_2.id, self.user_admin.partner_id.id),
})
template.attachment_ids.write({'res_id': template.id})
@users('employee')
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.tests')
def test_message_post_with_view(self):
""" Test posting on documents based on a view """
test_record = self.test_records.with_env(self.env)[0]
test_record.message_subscribe(test_record.customer_id.ids)
with self.mock_mail_gateway():
test_record.with_user(self.user_employee).message_post_with_template(
template.id,
composition_mode='mass_mail'
new_message = test_record.message_post_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.user_employee.partner_id}
)
new_partner = self.env['res.partner'].search([('email', '=', 'test@example.com')])
self.assertSentEmail(
self.user_employee.partner_id,
[new_partner],
subject='About %s' % test_record.name,
body_content=test_record.name,
attachments=[
('AttFileName_00.txt', b'AttContent_00', 'text/plain'),
('AttFileName_01.txt', b'AttContent_01', 'text/plain'),
]
# check notifications have been sent
self.assertMailNotifications(new_message, [{
'content': f'<p>Hello {self.user_employee.partner_id.name}, this comes from {test_record.name}.</p>',
'message_type': 'notification',
'notif': [
{'partner': test_record.customer_id, 'type': 'email'},
],
'subtype': 'mail.mt_comment',
}])
self.assertMessageFields(
new_message,
{'author_id': self.partner_employee,
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': False,
'message_type': 'notification',
'model': test_record._name,
'reply_to': formataddr((f'{self.company_admin.name} {test_record.name}', f'{self.alias_catchall}@{self.alias_domain}')),
'res_id': test_record.id,
}
)
+145 -55
View File
@@ -19,6 +19,13 @@ class BaseMailPerformance(MailCommon, TransactionCaseWithUserDemo):
# creating partners is required notably witn template usage
cls.user_employee.write({'groups_id': [(4, cls.env.ref('base.group_partner_manager').id)]})
cls.user_test = cls.env['res.users'].with_context(cls._test_context).create({
'name': 'Paulette Testouille',
'login': 'paul',
'email': 'user.test.paulette@example.com',
'notification_type': 'inbox',
'groups_id': [(6, 0, [cls.env.ref('base.group_user').id])],
})
cls.customer = cls.env['res.partner'].with_context(cls._test_context).create({
'country_id': cls.env.ref('base.be').id,
@@ -37,6 +44,57 @@ class BaseMailPerformance(MailCommon, TransactionCaseWithUserDemo):
self.patch(self.env.registry, 'ready', True)
self.flush_tracking()
def _create_test_records(self):
test_record_full = self.env['mail.test.ticket'].with_context(self._test_context).create({
'name': 'TestRecord',
'customer_id': self.customer.id,
'user_id': self.user_test.id,
'email_from': 'nopartner.test@example.com',
})
test_template_full = self.env['mail.template'].create({
'name': 'TestTemplate',
'model_id': self.env['ir.model']._get('mail.test.ticket').id,
'subject': 'About {{ object.name }}',
'body_html': '<p>Hello <t t-out="object.name"/></p>',
'email_from': '{{ object.user_id.email_formatted }}',
'partner_to': '{{ object.customer_id.id }}',
'email_to': '{{ ("%s Customer <%s>" % (object.name, object.email_from)) }}',
'attachment_ids': [
(0, 0, dict(attachment, res_model='mail.template'))
for attachment in self.test_attachments_vals
],
})
self.flush_tracking()
return test_record_full, test_template_full
def _create_test_records_for_batch(self):
test_partners = self.env['res.partner'].create([{
'phone': f'0485{idx}{idx}1122',
'email': f'test.customer.{idx}@test.example.com',
'name': f'Test Customer {idx}',
} for idx in range(0, 10)])
test_records = self.env['mail.test.ticket'].create([{
'customer_id': test_partners[idx].id,
'email_from': test_partners[idx].email_formatted,
'name': f'Test Ticket {idx}',
'user_id': self.user_test.id,
} for idx in range(0, 10)])
test_template_full = self.env['mail.template'].create({
'name': 'TestTemplate',
'model_id': self.env['ir.model']._get('mail.test.ticket').id,
'subject': 'About {{ object.name }}',
'body_html': '<p>Hello <t t-out="object.name"/></p>',
'email_from': '{{ object.user_id.email_formatted }}',
'partner_to': '{{ object.customer_id.id }}',
'email_to': '{{ ("%s Customer <%s>" % (object.name, object.email_from)) }}',
'attachment_ids': [
(0, 0, dict(attachment, res_model='mail.template'))
for attachment in self.test_attachments_vals
],
})
self.flush_tracking()
return test_partners, test_records, test_template_full
@tagged('mail_performance', 'post_install', '-at_install')
class TestBaseMailPerformance(BaseMailPerformance):
@@ -184,38 +242,10 @@ class TestMailAPIPerformance(BaseMailPerformance):
def setUp(self):
super(TestMailAPIPerformance, self).setUp()
self.user_test = self.env['res.users'].with_context(self._test_context).create({
'name': 'Paulette Testouille',
'login': 'paul',
'email': 'user.test.paulette@example.com',
'notification_type': 'inbox',
'groups_id': [(6, 0, [self.env.ref('base.group_user').id])],
})
# automatically follow activities, for backward compatibility concerning query count
self.env.ref('mail.mt_activities').write({'default': True})
def _create_test_records(self):
self.test_record_full = self.env['mail.test.ticket'].with_context(self._test_context).create({
'name': 'TestRecord',
'customer_id': self.customer.id,
'user_id': self.user_test.id,
'email_from': 'nopartner.test@example.com',
})
self.test_template_full = self.env['mail.template'].create({
'name': 'TestTemplate',
'model_id': self.env['ir.model']._get('mail.test.ticket').id,
'subject': 'About {{ object.name }}',
'body_html': '<p>Hello <t t-out="object.name"/></p>',
'email_from': '{{ object.user_id.email_formatted }}',
'partner_to': '{{ object.customer_id.id }}',
'email_to': '{{ ("%s Customer <%s>" % (object.name, object.email_from)) }}',
'attachment_ids': [
(0, 0, dict(attachment, res_model='mail.template'))
for attachment in self.test_attachments_vals
],
})
@users('__system__', 'employee')
@warmup
def test_adv_activity(self):
@@ -300,8 +330,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer(self):
self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_record, _test_template = self._create_test_records()
customer_id = self.customer.id
with self.assertQueryCount(__system__=2, employee=2):
composer = self.env['mail.compose.message'].with_context({
@@ -320,8 +349,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_attachments(self):
self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_record, _test_template = self._create_test_records()
customer = self.env['res.partner'].browse(self.customer.ids)
attachments = self.env['ir.attachment'].with_user(self.env.user).create(self.test_attachments_vals)
with self.assertQueryCount(__system__=3, employee=3):
@@ -342,11 +370,10 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_form_attachments(self):
self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_record, _test_template = self._create_test_records()
customer = self.env['res.partner'].browse(self.customer.ids)
attachments = self.env['ir.attachment'].with_user(self.env.user).create(self.test_attachments_vals)
with self.assertQueryCount(__system__=18, employee=18): # tm+com 16/16
with self.assertQueryCount(__system__=12, employee=12):
composer_form = Form(
self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
@@ -368,12 +395,31 @@ class TestMailAPIPerformance(BaseMailPerformance):
self.assertEqual(message.attachment_ids, attachments)
self.assertEqual(message.notified_partner_ids, customer + self.user_test.partner_id)
@users('__system__', 'employee')
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_mass_w_template(self):
_partners, test_records, test_template = self._create_test_records_for_batch()
with self.assertQueryCount(__system__=3, employee=3):
composer = self.env['mail.compose.message'].with_context({
'active_ids': test_records.ids,
'default_composition_mode': 'mass_mail',
'default_model': test_records._name,
'default_template_id': test_template.id,
}).create({})
composer._onchange_template_id_wrapper()
with self.assertQueryCount(__system__=126, employee=159), self.mock_mail_gateway():
composer._action_send_mail()
self.assertEqual(len(self._new_mails), 10)
@users('__system__', 'employee')
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_nodelete(self):
self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_record, _test_template = self._create_test_records()
customer_id = self.customer.id
with self.assertQueryCount(__system__=2, employee=2):
composer = self.env['mail.compose.message'].with_context({
@@ -393,11 +439,8 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_w_template(self):
self._create_test_records()
self.test_template_full.write({'attachment_ids': [(5, 0)]})
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
test_record, test_template = self._create_test_records()
test_template.write({'attachment_ids': [(5, 0)]})
with self.assertQueryCount(__system__=23, employee=24): # tm 13/14 / com 22/23
composer = self.env['mail.compose.message'].with_context({
@@ -422,10 +465,8 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_w_template_attachments(self):
self._create_test_records()
test_record, test_template = self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
with self.assertQueryCount(__system__=24, employee=25): # tm 14/15 / com 23/24
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
@@ -452,13 +493,11 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_w_template_form(self):
self._create_test_records()
self.test_template_full.write({'attachment_ids': [(5, 0)]})
test_record, test_template = self._create_test_records()
test_template.write({'attachment_ids': [(5, 0)]})
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
customer = self.env['res.partner'].browse(self.customer.ids)
with self.assertQueryCount(__system__=40, employee=42): # tm 28/30 / com 37/39
with self.assertQueryCount(__system__=34, employee=36): # tm 24/26 / com 33/35
composer_form = Form(
self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
@@ -485,12 +524,10 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
def test_mail_composer_w_template_form_attachments(self):
self._create_test_records()
test_record, test_template = self._create_test_records()
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
customer = self.env['res.partner'].browse(self.customer.ids)
with self.assertQueryCount(__system__=41, employee=43): # tm 29/31 / com 38/40
with self.assertQueryCount(__system__=35, employee=37): # tm 25/27 / com 34/36
composer_form = Form(
self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
@@ -546,6 +583,36 @@ class TestMailAPIPerformance(BaseMailPerformance):
body='<p>Test _message_log</p>',
message_type='comment')
@users('__system__', 'employee')
@warmup
def test_message_log_batch(self):
records = self.env['mail.test.simple'].create([
{'name': f'Test_{idx}'}
for idx in range(10)
])
with self.assertQueryCount(__system__=1, employee=1):
records._message_log_batch(
bodies=dict(
(record.id, '<p>Test _message_log</p>')
for record in records
),
message_type='comment')
@users('__system__', 'employee')
@warmup
def test_message_log_with_view(self):
records = self.env['mail.test.simple'].create([
{'name': f'Test_{idx}'}
for idx in range(10)
])
with self.assertQueryCount(__system__=11, employee=11):
records._message_log_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.customer.with_env(self.env)}
)
@users('__system__', 'employee')
@warmup
def test_message_log_with_post(self):
@@ -575,7 +642,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_message_post_one_email_notification(self):
record = self.env['mail.test.simple'].create({'name': 'Test'})
with self.assertQueryCount(__system__=24, employee=28):
with self.assertQueryCount(__system__=24, employee=27):
record.message_post(
body='<p>Test Post Performances with an email ping</p>',
partner_ids=self.customer.ids,
@@ -793,6 +860,29 @@ class TestMailComplexPerformance(BaseMailPerformance):
self.assertEqual(record.message_ids[0].body, '<p>Adding stuff on %s</p>' % record.name)
self.assertEqual(record.message_ids[0].notified_partner_ids, self.partners | self.user_portal.partner_id | self.customer)
@mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@users('__system__', 'employee')
@warmup
def test_complex_message_post_view(self):
_partners, test_records, test_template = self._create_test_records_for_batch()
with self.assertQueryCount(__system__=3, employee=3):
composer = self.env['mail.compose.message'].with_context({
'active_ids': test_records.ids,
'default_composition_mode': 'mass_mail',
'default_model': test_records._name,
'default_template_id': test_template.id,
}).create({})
composer._onchange_template_id_wrapper()
with self.assertQueryCount(__system__=121, employee=141):
messages_as_sudo = test_records.message_post_with_view(
'test_mail.mail_template_simple_test',
values={'partner': self.user_test.partner_id},
)
self.assertEqual(len(messages_as_sudo), 10)
@mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@users('__system__', 'employee')
@warmup