summaryrefslogtreecommitdiff
path: root/addons/mail/tests/common.py
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-04-29 11:38:20 +0000
committerThibault Delavallée <tde@odoo.com>2020-05-26 10:35:58 +0000
commit4a2ac044f8bd4a5a1f96f0e45c008473dc15eec3 (patch)
tree26d9b7406dadcbe299941f371803f363e6426946 /addons/mail/tests/common.py
parenta874dfa08abd5b3c54e29c0257dfa23118b910da (diff)
[IMP] (test_)(mass_)mail(_full): rename and reorganize mail related test classes
Modules holding tests and helpers * link_tracker: mainly mock, asserts and tools for link tracker tests (MockLinkTracker); * mail: mainly gateway mock and base for mail tests * MockEmail -> mocks for mail gateway; * MailCase -> tools and asserts for mail tests; * MailCommon -> base for mail functional tests); * sms: mainly SMS gateway mock and base for sms tests * MockSMS -> mocks for SMS gateway; * SMS Case -> tools and asserts for mail / SMS tests; * SMSCommon -> update of MailCommon with SMS capabilities); * mass_mailing: mainly asserts and tools for mass mailing tests * MassMailCase -> update of MailCase for mass mailing tools and asserts; * MassMailCommon -> update of MailCommon with mass mailing); * mass_mailing_sms: mainly asserts and tools for mass SMS tests * MockMassSMS -> update of MockSMS for mass SMS tools and asserts; * MassSMSCommon -> update of MassMailCommon with SMS capabilities); Modules for tests * test_mail: module for mail app tests (TestMailCommon); * test_mass_mailing: module for mass mailing app tests (TestMassMailCommon); * test_mail_full: tests integrating all discuss features, currently mainly mail and SMS (TestMailFullCommon); Enterprise: update test_mail_enterprise and test_marketing_automation Task ID 2247037 Community PR odoo/odoo#50384 Enterprise PR odoo/enterprise#10266 Upgrade PR odoo/upgrade#1122
Diffstat (limited to 'addons/mail/tests/common.py')
-rw-r--r--addons/mail/tests/common.py120
1 files changed, 105 insertions, 15 deletions
diff --git a/addons/mail/tests/common.py b/addons/mail/tests/common.py
index fa764015c7c..e8ece910062 100644
--- a/addons/mail/tests/common.py
+++ b/addons/mail/tests/common.py
@@ -3,7 +3,6 @@
import email
import email.policy
-import json
import time
from collections import defaultdict
@@ -170,16 +169,32 @@ class MockEmail(common.BaseCase):
# GATEWAY ASSERTS
# ------------------------------------------------------------
- def _find_mail(self, author, recipients, mail_message):
+ def _find_mail_mail_wpartners(self, recipients, status, mail_message=None, author=None):
for mail in self._new_mails:
- if mail.mail_message_id != mail_message:
- continue
if author is not None and mail.author_id != author:
continue
+ if mail_message is not None and mail.mail_message_id != mail_message:
+ continue
+ if status and mail.state != status:
+ continue
if all(p in mail.recipient_ids for p in recipients):
break
else:
- raise AssertionError('mail.mail not found for message %s / recipients %s' % (mail_message, recipients.ids))
+ raise AssertionError('mail.mail not found for message %s / status %s / recipients %s' % (mail_message, status, recipients.ids))
+ return mail
+
+ def _find_mail_mail_wemail(self, email_to, status, mail_message=None, author=None):
+ for mail in self._new_mails:
+ if author is not None and mail.author_id != author:
+ continue
+ if mail_message is not None and mail.mail_message_id != mail_message:
+ continue
+ if status and mail.state != status:
+ continue
+ if (mail.email_to == email_to and not mail.recipient_ids) or (not mail.email_to and mail.recipient_ids.email) == email_to:
+ break
+ else:
+ raise AssertionError('mail.mail not found for email_to %s / status %s in %s' % (email_to, status, repr([m.email_to for m in self._new_mails])))
return mail
def _find_mail_mail_wrecord(self, record):
@@ -194,16 +209,33 @@ class MockEmail(common.BaseCase):
mail = self._find_mail(author, recipients, mail_message)
self.assertEqual(mail.state, 'exception')
- def assertMailSent(self, author, recipients, mail_message, check_mail_mail=True, **values):
+ def assertMailMail(self, recipients, status, check_mail_mail=True, mail_message=None, author=None, email_values=None):
if check_mail_mail:
- mail = self._find_mail(author, recipients, mail_message)
- self.assertEqual(mail.state, 'sent')
- for recipient in recipients:
- self.assertSentEmail(author, [recipient], **values)
+ mail = self._find_mail_mail_wpartners(recipients, status, mail_message=mail_message, author=author)
+ self.assertTrue(bool(mail))
+ if status == 'sent':
+ for recipient in recipients:
+ self.assertSentEmail(author, [recipient], **email_values)
+
+ def assertMailMailWEmails(self, emails, status, content, fields_values=None):
+ """ Will check in self._new_mails to find a sent mail.mail. To use with
+ mail gateway mock.
+
+ :param emails: list of emails;
+ :param status: status of mail.mail;
+ :param content: content to check for each email;
+ :param fields_values: specific value to check on the mail.mail record;
+ """
+ for email_to in emails:
+ sent_mail = self._find_mail_mail_wemail(email_to, status)
+ if content:
+ self.assertIn(content, sent_mail.body_html)
+ for fname, fvalue in (fields_values or {}).items():
+ self.assertEqual(sent_mail[fname], fvalue)
def assertNoMail(self, author, recipients, mail_message):
try:
- self._find_mail(author, recipients, mail_message)
+ self._find_mail_mail_wpartners(recipients, False, mail_message=mail_message, author=author)
except AssertionError:
pass
else:
@@ -290,6 +322,11 @@ class MailCase(MockEmail):
mail_notrack=False
)
+ def flush_tracking(self):
+ """ Force the creation of tracking values. """
+ self.env['base'].flush()
+ self.cr.precommit()
+
# ------------------------------------------------------------
# MAIL MOCKS
# ------------------------------------------------------------
@@ -363,6 +400,19 @@ class MailCase(MockEmail):
return cls.env['mail.message'].sudo().create(create_vals)
+ @classmethod
+ def _create_template(cls, model, template_values=None):
+ create_values = {
+ 'name': 'TestTemplate',
+ 'subject': 'About ${object.name}',
+ 'body_html': '<p>Hello ${object.name}</p>',
+ 'model_id': cls.env['ir.model']._get(model).id,
+ }
+ if template_values:
+ create_values.update(template_values)
+ cls.email_template = cls.env['mail.template'].create(create_values)
+ return cls.email_template
+
# ------------------------------------------------------------
# MAIL ASSERTS WRAPPERS
# ------------------------------------------------------------
@@ -505,12 +555,16 @@ class MailCase(MockEmail):
for recipients in email_groups.values():
partners = self.env['res.partner'].sudo().concat(*recipients)
if all(p in mail_groups['failure'] for p in partners):
- self.assertMailFailed(message.author_id, partners, message)
+ self.assertMailMail(partners, 'exception', author=message.author_id, mail_message=message)
else:
check_mail_mail = not self.mail_unlink_sent
- self.assertMailSent(
- message.author_id if message.author_id else message.email_from, partners, message,
- check_mail_mail=check_mail_mail, body_content=mbody)
+ self.assertMailMail(
+ partners, 'sent',
+ author=message.author_id if message.author_id else message.email_from,
+ mail_message=message,
+ check_mail_mail=check_mail_mail,
+ email_values={'body_content': mbody}
+ )
if not any(p for recipients in email_groups.values() for p in recipients):
self.assertNoMail(message.author_id, partners, message)
@@ -580,3 +634,39 @@ class MailCase(MockEmail):
self.assertEqual(tracking.new_value_char, new_value and new_value.display_name or '')
else:
self.assertEqual(1, 0)
+
+
+class MailCommon(common.SavepointCase, MailCase):
+ """ Almost-void class definition setting the savepoint case + mock of mail.
+ Used mainly for class inheritance in other applications and test modules. """
+
+ @classmethod
+ def setUpClass(cls):
+ super(MailCommon, cls).setUpClass()
+ # give default values for all email aliases and domain
+ cls._init_mail_gateway()
+ # ensure admin configuration
+ cls.user_admin = cls.env.ref('base.user_admin')
+ cls.user_admin.write({'notification_type': 'inbox'})
+ cls.partner_admin = cls.env.ref('base.partner_admin')
+ cls.company_admin = cls.user_admin.company_id
+ cls.company_admin.write({'email': 'company@example.com'})
+
+ # test standard employee
+ cls.user_employee = mail_new_test_user(
+ cls.env, login='employee',
+ groups='base.group_user',
+ company_id=cls.company_admin.id,
+ name='Ernest Employee',
+ notification_type='inbox',
+ signature='--\nErnest'
+ )
+ cls.partner_employee = cls.user_employee.partner_id
+
+ @classmethod
+ def _create_portal_user(cls):
+ cls.user_portal = mail_new_test_user(
+ cls.env, login='portal_test', groups='base.group_portal', company_id=cls.company_admin.id,
+ name='Chell Gladys', notification_type='email')
+ cls.partner_portal = cls.user_portal.partner_id
+ return cls.user_portal