diff --git a/addons/mail/tests/test_mail_channel.py b/addons/mail/tests/test_mail_channel.py index 0c9b180c947..e06b10eeaa8 100644 --- a/addons/mail/tests/test_mail_channel.py +++ b/addons/mail/tests/test_mail_channel.py @@ -2,23 +2,29 @@ from email.utils import formataddr -from .common import TestMail -from odoo import api +from odoo.addons.mail.tests import common from odoo.exceptions import AccessError, except_orm from odoo.tools import mute_logger -class TestMailGroup(TestMail): +class TestChannelAccessRights(common.BaseFunctionalTest, common.MockEmails): @classmethod def setUpClass(cls): - super(TestMailGroup, cls).setUpClass() - # for specific tests of mail channel, get back to its expected behavior - # cls.registry('mail.channel')._revert_method('message_get_recipient_values') - Channel = cls.env['mail.channel'].with_context({ - 'mail_create_nolog': True, - 'mail_create_nosubscribe': True - }) + super(TestChannelAccessRights, cls).setUpClass() + Channel = cls.env['mail.channel'].with_context(cls._quick_create_ctx) + + Users = cls.env['res.users'].with_context(cls._quick_create_user_ctx) + cls.user_public = Users.create({ + 'name': 'Bert Tartignole', + 'login': 'bert', + 'email': 'b.t@example.com', + 'groups_id': [(6, 0, [cls.env.ref('base.group_public').id])]}) + cls.user_portal = Users.create({ + 'name': 'Chell Gladys', + 'login': 'chell', + 'email': 'chell@gladys.portal', + 'groups_id': [(6, 0, [cls.env.ref('base.group_portal').id])]}) # Pigs: base group for tests cls.group_pigs = Channel.create({ @@ -35,15 +41,6 @@ class TestMailGroup(TestMail): 'name': 'Private', 'public': 'private'}) - @classmethod - def tearDownClass(cls): - # set master class behavior back - @api.multi - def mail_group_message_get_recipient_values(self, notif_message=None, recipient_ids=None): - return self.env['mail.thread'].message_get_recipient_values(notif_message=notif_message, recipient_ids=recipient_ids) - cls.env['mail.channel']._patch_method('message_get_recipient_values', mail_group_message_get_recipient_values) - super(TestMailGroup, cls).tearDownClass() - @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models') def test_access_rights_public(self): # Read public group -> ok @@ -72,7 +69,7 @@ class TestMailGroup(TestMail): with self.assertRaises(AccessError): self.group_public.sudo(self.user_public).unlink() - @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models') + @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models', 'odoo.models.unlink') def test_access_rights_groups(self): # Employee read employee-based group: ok # TODO Change the except_orm to Warning @@ -95,6 +92,7 @@ class TestMailGroup(TestMail): with self.assertRaises(AccessError): self.group_private.sudo(self.user_employee).write({'name': 're-modified'}) + @mute_logger('odoo.addons.base.ir.ir_model', 'odoo.models') def test_access_rights_followers_ko(self): with self.assertRaises(AccessError): self.group_private.sudo(self.user_portal).name @@ -114,29 +112,86 @@ class TestMailGroup(TestMail): with self.assertRaises(except_orm): trigger_read = partner.name - def test_mail_group_notification_recipients_grouped(self): - # Data: set alias_domain to see emails with alias - self.env['ir.config_parameter'].set_param('mail.catchall.domain', 'schlouby.fr') - self.group_private.write({'alias_name': 'Test'}) - self.group_private.message_subscribe_users([self.user_employee.id, self.user_portal.id]) - self.group_private.message_post(body="Test", message_type='comment', subtype='mt_comment') - sent_emails = self._mails - self.assertEqual(len(sent_emails), 1) - for email in sent_emails: +class TestChannelFeatures(common.BaseFunctionalTest, common.MockEmails): + + @classmethod + def setUpClass(cls): + super(TestChannelFeatures, cls).setUpClass() + cls.test_channel = cls.env['mail.channel'].with_context(cls._quick_create_ctx).create({ + 'name': 'Test', + 'description': 'Description', + 'alias_name': 'test', + 'public': 'public', + }) + cls.test_partner = cls.env['res.partner'].with_context(cls._quick_create_ctx).create({ + 'name': 'Test Partner', + 'email': 'test@example.com', + }) + + def _join_channel(self, channel, partners): + for partner in partners: + channel.write({'channel_last_seen_partner_ids': [(0, 0, {'partner_id': partner.id})]}) + channel.invalidate_cache() + + def _leave_channel(self, channel, partners): + for partner in partners: + channel._action_unfollow(partner) + + def test_channel_listeners(self): + self.assertEqual(self.test_channel.message_channel_ids, self.test_channel) + self.assertEqual(self.test_channel.message_partner_ids, self.env['res.partner']) + self.assertEqual(self.test_channel.channel_partner_ids, self.env['res.partner']) + + self._join_channel(self.test_channel, self.test_partner) + self.assertEqual(self.test_channel.message_channel_ids, self.test_channel) + self.assertEqual(self.test_channel.message_partner_ids, self.env['res.partner']) + self.assertEqual(self.test_channel.channel_partner_ids, self.test_partner) + + self._leave_channel(self.test_channel, self.test_partner) + self.assertEqual(self.test_channel.message_channel_ids, self.test_channel) + self.assertEqual(self.test_channel.message_partner_ids, self.env['res.partner']) + self.assertEqual(self.test_channel.channel_partner_ids, self.env['res.partner']) + + def test_channel_post_nofollow(self): + self.test_channel.message_post(body='Test', message_type='comment', subtype='mt_comment') + self.assertEqual(self.test_channel.message_channel_ids, self.test_channel) + self.assertEqual(self.test_channel.message_partner_ids, self.env['res.partner']) + + @mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') + def test_channel_mailing_list_recipients(self): + """ Posting a message on a mailing list should send one email to all recipients """ + self.env['ir.config_parameter'].set_param('mail.catchall.domain', 'schlouby.fr') + self.test_channel.write({'email_send': True}) + self._join_channel(self.test_channel, self.user_employee.partner_id | self.test_partner) + self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment') + + self.assertEqual(len(self._mails), 1) + for email in self._mails: self.assertEqual( set(email['email_to']), - set([formataddr((self.user_employee.name, self.user_employee.email)), formataddr((self.user_portal.name, self.user_portal.email))])) + set([formataddr((self.user_employee.name, self.user_employee.email)), formataddr((self.test_partner.name, self.test_partner.email))])) - def test_mail_group_notification_recipients_separated(self): - # Remove alias, should trigger classic behavior of mail group - self.group_private.write({'alias_name': False}) - self.group_private.message_subscribe_users([self.user_employee.id, self.user_portal.id]) + @mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') + def test_channel_chat_recipients(self): + """ Posting a message on a chat should not send emails """ + self.env['ir.config_parameter'].set_param('mail.catchall.domain', 'schlouby.fr') + self.test_channel.write({'email_send': False}) + self._join_channel(self.test_channel, self.user_employee.partner_id | self.test_partner) + self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment') + + self.assertEqual(len(self._mails), 0) + + @mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') + def test_channel_classic_recipients(self): + """ Posting a message on a classic channel should work like classic post """ + self.test_channel.write({'alias_name': False}) + self.test_channel.message_subscribe([self.user_employee.partner_id.id, self.test_partner.id]) + self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment') - self.group_private.message_post(body="Test", message_type='comment', subtype='mt_comment') sent_emails = self._mails self.assertEqual(len(sent_emails), 2) for email in sent_emails: self.assertIn( email['email_to'][0], - [formataddr((self.user_employee.name, self.user_employee.email)), formataddr((self.user_portal.name, self.user_portal.email))]) + [formataddr((self.user_employee.name, self.user_employee.email)), formataddr((self.test_partner.name, self.test_partner.email))])