summaryrefslogtreecommitdiff
path: root/addons/test_mail/tests/test_mail_message.py
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2019-10-11 15:40:45 +0000
committerThibault Delavallée <tde@odoo.com>2019-11-20 16:00:57 +0000
commit656c11e4ec462f8e85d19a922ab61cfa6a0643c0 (patch)
treed2372101159f1018f40c757a07e6e4ff3073ad19 /addons/test_mail/tests/test_mail_message.py
parent4bcb8cbda3ca7d36190e1c1c02a01b15e5c3dd0c (diff)
[REF] test_mail: update test mail message to new common
PURPOSE Currently tools and asserts for mail tests are located inside test_mail module. It makes difficult to re-use them in apps tests or force them to write custom quick and dirty tools and asserts. SPECIFICATIONS Update tests to new tools / asserts / helpers / classes defined in mail and test_mail. Notably * ``BaseFunctionalTest`` class is replaced by the new ``TestMailCommon`` pimped one; * ``assertNotifications`` is replaced by ``assertSinglePostNotifications`` (shortcut for a simple message_post) or ``assertPostNotifications`` (complete asserts involving several messages and notifications); * correctly invoke ``mock_mail_gateway`` when mocking email sending; * replace manual check of sent emails or ``assertEmails`` by ``assertSentEmails``; * remove custom mocks / checks and replace them by now standard mocks and assertions (if any); In this commit we update: test mail message LINKS Task ID 2068986 PR #38070
Diffstat (limited to 'addons/test_mail/tests/test_mail_message.py')
-rw-r--r--addons/test_mail/tests/test_mail_message.py130
1 files changed, 85 insertions, 45 deletions
diff --git a/addons/test_mail/tests/test_mail_message.py b/addons/test_mail/tests/test_mail_message.py
index 13a41ab84b1..3f433496f4e 100644
--- a/addons/test_mail/tests/test_mail_message.py
+++ b/addons/test_mail/tests/test_mail_message.py
@@ -1,15 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
import base64
-from odoo.addons.test_mail.tests import common
-from odoo.addons.test_mail.tests.common import mail_new_test_user
+from odoo.addons.mail.tests.common import mail_new_test_user
+from odoo.addons.test_mail.tests.common import TestMailCommon
from odoo.exceptions import AccessError, except_orm
from odoo.tools import mute_logger, formataddr
from odoo.tests import tagged
-class TestMessageValues(common.BaseFunctionalTest, common.MockEmails):
+class TestMessageValues(TestMailCommon):
@classmethod
def setUpClass(cls):
@@ -152,7 +153,7 @@ class TestMessageValues(common.BaseFunctionalTest, common.MockEmails):
self.assertEqual(msg.body, body)
-class TestMessageAccess(common.BaseFunctionalTest, common.MockEmails):
+class TestMessageAccess(TestMailCommon):
@classmethod
def setUpClass(cls):
@@ -316,6 +317,8 @@ class TestMessageAccess(common.BaseFunctionalTest, common.MockEmails):
self.env['mail.message'].with_user(self.user_employee).create({'body': 'Test'})
def test_mail_message_access_create_reply(self):
+ # TDE FIXME: should it really work ? not sure - catchall makes crash (aka, post will crash also)
+ self.env['ir.config_parameter'].set_param('mail.catchall.domain', False)
self.message.write({'partner_ids': [(4, self.user_employee.partner_id.id)]})
self.env['mail.message'].with_user(self.user_employee).create({'model': 'mail.channel', 'res_id': self.group_private.id, 'body': 'Test', 'parent_id': self.message.id})
@@ -408,69 +411,106 @@ class TestMessageAccess(common.BaseFunctionalTest, common.MockEmails):
@tagged('moderation')
-class TestMessageModeration(common.Moderation):
+class TestMessageModeration(TestMailCommon):
@classmethod
def setUpClass(cls):
super(TestMessageModeration, cls).setUpClass()
- cls.msg_admin_pending_c1 = cls._create_new_message(cls, cls.channel_1.id, status='pending_moderation', author=cls.partner_admin)
- cls.msg_admin_pending_c1_2 = cls._create_new_message(cls, cls.channel_1.id, status='pending_moderation', author=cls.partner_admin)
- cls.msg_emp2_pending_c1 = cls._create_new_message(cls, cls.channel_1.id, status='pending_moderation', author=cls.partner_employee_2)
+ cls.channel_1 = cls.env['mail.channel'].create({
+ 'name': 'Moderation_1',
+ 'email_send': True,
+ 'moderation': True
+ })
+ cls.user_employee.write({'moderation_channel_ids': [(6, 0, [cls.channel_1.id])]})
+ cls.user_portal = cls._create_portal_user()
- @mute_logger('odoo.models.unlink')
- def test_moderate_accept(self):
- self._clear_bus()
# A pending moderation message needs to have field channel_ids empty. Moderators
# need to be able to notify a pending moderation message (in a channel they moderate).
- self.assertFalse(self.msg_admin_pending_c1.channel_ids)
- self.msg_admin_pending_c1.with_user(self.user_employee)._moderate('accept')
- self.assertEqual(self.msg_admin_pending_c1.channel_ids, self.channel_1)
- self.assertEqual(self.msg_admin_pending_c1.moderation_status, 'accepted')
- self.assertEqual(self.msg_admin_pending_c1_2.moderation_status, 'pending_moderation')
- self.assertBusNotification([(self.cr.dbname, 'mail.channel', self.channel_1.id)])
+ cls.msg_c1_admin1 = cls._add_messages(cls.channel_1, 'Body11', author=cls.partner_admin, moderation_status='pending_moderation')
+ cls.msg_c1_admin2 = cls._add_messages(cls.channel_1, 'Body12', author=cls.partner_admin, moderation_status='pending_moderation')
+ cls.msg_c1_portal = cls._add_messages(cls.channel_1, 'Body21', author=cls.partner_portal, moderation_status='pending_moderation')
+
+ @mute_logger('odoo.models.unlink')
+ def test_moderate_accept(self):
+ self._reset_bus()
+ self.assertFalse(self.msg_c1_admin1.channel_ids | self.msg_c1_admin2.channel_ids | self.msg_c1_portal.channel_ids)
+
+ self.msg_c1_admin1.with_user(self.user_employee)._moderate('accept')
+ self.assertEqual(self.msg_c1_admin1.channel_ids, self.channel_1)
+ self.assertEqual(self.msg_c1_admin1.moderation_status, 'accepted')
+ self.assertEqual(self.msg_c1_admin2.moderation_status, 'pending_moderation')
+ self.assertBusNotifications([(self.cr.dbname, 'mail.channel', self.channel_1.id)])
@mute_logger('odoo.models.unlink')
def test_moderate_allow(self):
- self._clear_bus()
- # A pending moderation message needs to have field channel_ids empty. Moderators
- # need to be able to notify a pending moderation message (in a channel they moderate).
- self.assertFalse(self.msg_admin_pending_c1.channel_ids)
- self.assertFalse(self.msg_admin_pending_c1_2.channel_ids)
- self.msg_admin_pending_c1.with_user(self.user_employee)._moderate('allow')
- self.assertEqual(self.msg_admin_pending_c1.channel_ids, self.channel_1)
- self.assertEqual(self.msg_admin_pending_c1_2.channel_ids, self.channel_1)
- self.assertEqual(self.msg_admin_pending_c1.moderation_status, 'accepted')
- self.assertEqual(self.msg_admin_pending_c1_2.moderation_status, 'accepted')
- self.assertBusNotification([
+ self._reset_bus()
+
+ self.msg_c1_admin1.with_user(self.user_employee)._moderate('allow')
+ self.assertEqual(self.msg_c1_admin1.channel_ids, self.channel_1)
+ self.assertEqual(self.msg_c1_admin2.channel_ids, self.channel_1)
+ self.assertEqual(self.msg_c1_admin1.moderation_status, 'accepted')
+ self.assertEqual(self.msg_c1_admin2.moderation_status, 'accepted')
+ self.assertBusNotifications([
(self.cr.dbname, 'mail.channel', self.channel_1.id),
(self.cr.dbname, 'mail.channel', self.channel_1.id)])
@mute_logger('odoo.models.unlink')
def test_moderate_reject(self):
- self._init_mock_build_email()
- (self.msg_admin_pending_c1 | self.msg_emp2_pending_c1).with_user(self.user_employee)._moderate_send_reject_email('Title', 'Message to author')
- self.env['mail.mail'].process_email_queue()
- self.assertEmails(self.partner_employee, self.partner_employee_2 | self.partner_admin, subject='Title', body_content='Message to author')
+ with self.mock_mail_gateway():
+ (self.msg_c1_admin1 | self.msg_c1_portal).with_user(self.user_employee)._moderate_send_reject_email('Title', 'Message to author')
+ self.assertEqual(len(self._new_mails), 2)
+ for mail in self._new_mails:
+ self.assertEqual(mail.author_id, self.partner_employee)
+ self.assertEqual(mail.subject, 'Title')
+ self.assertEqual(mail.state, 'outgoing')
+ self.assertEqual(
+ set(self._new_mails.mapped('email_to')),
+ set([self.msg_c1_admin1.email_from, self.msg_c1_portal.email_from])
+ )
+ self.assertEqual(
+ set(self._new_mails.mapped('body_html')),
+ set(['<div>Message to author</div>\n%s\n' % self.msg_c1_admin1.body, '<div>Message to author</div>\n%s\n' % self.msg_c1_portal.body])
+ ) # TDE note: \n are added by append content to html, because why not
+ @mute_logger('odoo.models.unlink')
def test_moderate_discard(self):
- self._clear_bus()
- id1, id2 = self.msg_admin_pending_c1.id, self.msg_emp2_pending_c1.id # save ids because unlink will discard them
- (self.msg_admin_pending_c1 | self.msg_emp2_pending_c1).with_user(self.user_employee)._moderate_discard()
+ self._reset_bus()
+ id1, id2, id3 = self.msg_c1_admin1.id, self.msg_c1_admin2.id, self.msg_c1_portal.id # save ids because unlink will discard them
+ (self.msg_c1_admin1 | self.msg_c1_admin2 | self.msg_c1_portal).with_user(self.user_employee)._moderate_discard()
- self.assertBusNotification(
+ self.assertBusNotifications(
[(self.cr.dbname, 'res.partner', self.partner_admin.id),
- (self.cr.dbname, 'res.partner', self.partner_employee_2.id),
- (self.cr.dbname, 'res.partner', self.partner_employee.id)],
- [{'type': 'deletion', 'message_ids': [id1]}, # admin: one message deleted because discarded
- {'type': 'deletion', 'message_ids': [id2]}, # employee_2: one message delete because discarded
- {'type': 'deletion', 'message_ids': [id1, id2]}] # employee: two messages deleted because moderation done
+ (self.cr.dbname, 'res.partner', self.partner_employee.id),
+ (self.cr.dbname, 'res.partner', self.partner_portal.id)],
+ [{'type': 'deletion', 'message_ids': [id1, id2]}, # author of 2 messages
+ {'type': 'deletion', 'message_ids': [id1, id2, id3]}, # moderator
+ {'type': 'deletion', 'message_ids': [id3]}] # author of 1 message
)
@mute_logger('odoo.models.unlink')
def test_notify_moderators(self):
# create pending messages in another channel to have two notification to push
- msg_emp_pending_c2 = self._create_new_message(self.channel_2.id, status='pending_moderation', author=self.partner_employee)
-
- self.env['mail.message']._notify_moderators()
- self.assertEmails(False, self.partner_employee | self.partner_employee_2, subject='Message are pending moderation', email_from=self.env.company.catchall or self.env.company.email)
+ channel_2 = self.env['mail.channel'].create({
+ 'name': 'Moderation_1',
+ 'email_send': True,
+ 'moderation': True
+ })
+ self.user_admin.write({'moderation_channel_ids': [(6, 0, [channel_2.id])]})
+ self.msg_c2_portal = self._add_messages(channel_2, 'Body31', author=self.partner_portal, moderation_status='pending_moderation')
+
+ # one notification for each moderator: employee (channel1), admin (channel2)
+ with self.assertPostNotifications([{
+ 'content': 'Hello %s' % self.partner_employee.name,
+ 'message_type': 'user_notification', 'subtype': 'mail.mt_note',
+ 'notif': [{
+ 'partner': self.partner_employee,
+ 'type': 'inbox'}]
+ }, {
+ 'content': 'Hello %s' % self.partner_admin.name,
+ 'message_type': 'user_notification', 'subtype': 'mail.mt_note',
+ 'notif': [{
+ 'partner': self.partner_admin,
+ 'type': 'inbox'}]
+ }]):
+ self.env['mail.message']._notify_moderators()