From ec874afd77af1dca292b2dd5cc4f04eb02a428f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 26 Nov 2020 10:42:15 +0000 Subject: [PATCH] [FW][IMP] test_mail: add test for auto subscribe We recently found a bug about generic internal subtypes not being correctly propagated when doing auto subscribe. For example: subscribe to a project, check an internal subtype like activities. Auto subscribe done on project tasks should include actitivities subtype but is currently not the case. This test highlights the issue and a fix will be provided soon. In this test we check both * generic subtype propagation (comment- or activities- like subtypes); * model-specific subtype propagation through parent relationship (like following New Task on project to follow New on task); * internal subtypes not being propagated to portal users; * auto subscribe at create with both create and parent follower reasons; LINKS Task ID-2205643 COM PR #47336 X-original-commit: 1e29d48f5b10deca9ed7b991ea92ffc36f61c725 X-original-pr: odoo/odoo#47336 Co-authored-by: Thibault Delavallee Co-authored-by: Priyanka kakadiya --- addons/test_mail/tests/test_mail_followers.py | 140 ++++++++++++++---- 1 file changed, 115 insertions(+), 25 deletions(-) diff --git a/addons/test_mail/tests/test_mail_followers.py b/addons/test_mail/tests/test_mail_followers.py index ba2ef2074c8..de827326d6b 100644 --- a/addons/test_mail/tests/test_mail_followers.py +++ b/addons/test_mail/tests/test_mail_followers.py @@ -6,8 +6,10 @@ from psycopg2 import IntegrityError from odoo.tests import tagged, users from odoo.addons.test_mail.tests.common import TestMailCommon from odoo.tools.misc import mute_logger +from odoo.tests import tagged +@tagged('mail_followers') class BaseFollowersTest(TestMailCommon): @classmethod @@ -156,7 +158,9 @@ class BaseFollowersTest(TestMailCommon): self.assertEqual(document.message_follower_ids.partner_id, self.partner_portal | customer) +@tagged('mail_followers') class AdvancedFollowersTest(TestMailCommon): + @classmethod def setUpClass(cls): super(AdvancedFollowersTest, cls).setUpClass() @@ -171,17 +175,59 @@ class AdvancedFollowersTest(TestMailCommon): # clean demo data to avoid interferences Subtype.search([('res_model', 'in', ['mail.test.container', 'mail.test.track'])]).unlink() - cls.sub_nodef = Subtype.create({'name': 'Sub NoDefault', 'default': False, 'res_model': 'mail.test.container'}) - cls.sub_umb1 = Subtype.create({'name': 'Sub Container1', 'default': False, 'res_model': 'mail.test.track'}) - cls.sub_umb2 = Subtype.create({'name': 'Sub Container2', 'default': False, 'res_model': 'mail.test.track'}) - cls.umb_def = Subtype.create({'name': 'Container Default', 'default': True, 'res_model': 'mail.test.container'}) - # create subtypes for auto subscription from container to sub records - cls.umb_sub_def = Subtype.create({ - 'name': 'Container Sub1', 'default': True, 'res_model': 'mail.test.container', - 'parent_id': cls.sub_umb1.id, 'relation_field': 'container_id'}) - cls.umb_sub_nodef = Subtype.create({ - 'name': 'Container Sub2', 'default': False, 'res_model': 'mail.test.container', - 'parent_id': cls.sub_umb2.id, 'relation_field': 'container_id'}) + # mail.test.track subtypes (aka: task records) + cls.sub_track_1 = Subtype.create({ + 'name': 'Track (with child relation) 1', 'default': False, + 'res_model': 'mail.test.track' + }) + cls.sub_track_2 = Subtype.create({ + 'name': 'Track (with child relation) 2', 'default': False, + 'res_model': 'mail.test.track' + }) + cls.sub_track_nodef = Subtype.create({ + 'name': 'Generic Track subtype', 'default': False, 'internal': False, + 'res_model': 'mail.test.track' + }) + cls.sub_track_def = Subtype.create({ + 'name': 'Default track subtype', 'default': True, 'internal': False, + 'res_model': 'mail.test.track' + }) + + # mail.test.container subtypes (aka: project records) + cls.umb_nodef = Subtype.create({ + 'name': 'Container NoDefault', 'default': False, + 'res_model': 'mail.test.container' + }) + cls.umb_def = Subtype.create({ + 'name': 'Container Default', 'default': True, + 'res_model': 'mail.test.container' + }) + cls.umb_def_int = Subtype.create({ + 'name': 'Container Default', 'default': True, 'internal': True, + 'res_model': 'mail.test.container' + }) + # -> subtypes for auto subscription from container to sub records + cls.umb_autosub_def = Subtype.create({ + 'name': 'Container AutoSub (default)', 'default': True, 'res_model': 'mail.test.container', + 'parent_id': cls.sub_track_1.id, 'relation_field': 'container_id' + }) + cls.umb_autosub_nodef = Subtype.create({ + 'name': 'Container AutoSub 2', 'default': False, 'res_model': 'mail.test.container', + 'parent_id': cls.sub_track_2.id, 'relation_field': 'container_id' + }) + + # generic subtypes + cls.sub_comment = cls.env.ref('mail.mt_comment') + cls.sub_generic_int_nodef = Subtype.create({ + 'name': 'Generic internal subtype', + 'default': False, + 'internal': True, + }) + cls.sub_generic_int_def = Subtype.create({ + 'name': 'Generic internal subtype (default)', + 'default': True, + 'internal': True, + }) def test_auto_subscribe_create(self): """ Creator of records are automatically added as followers """ @@ -244,30 +290,74 @@ class AdvancedFollowersTest(TestMailCommon): 'name': 'Project-Like', }) - container.message_subscribe(partner_ids=(self.partner_portal | self.partner_admin).ids) - self.assertEqual(container.message_partner_ids, self.partner_portal | self.partner_admin) + # have an inactive partner to check auto subscribe does not subscribe it + user_root = self.env.ref('base.user_root') + self.assertFalse(user_root.active) + self.assertFalse(user_root.partner_id.active) - self.user_admin.active = False - self.user_admin.flush() - self.partner_admin.active = False - self.partner_admin.flush() + container.message_subscribe(partner_ids=(self.partner_portal | user_root.partner_id).ids) + container.message_subscribe(partner_ids=self.partner_admin.ids, subtype_ids=(self.sub_comment | self.umb_autosub_nodef | self.sub_generic_int_nodef).ids) + self.assertEqual(container.message_partner_ids, self.partner_portal | self.partner_admin) + follower_por = container.message_follower_ids.filtered(lambda f: f.partner_id == self.partner_portal) + follower_adm = container.message_follower_ids.filtered(lambda f: f.partner_id == self.partner_admin) + self.assertEqual( + follower_por.subtype_ids, + self.sub_comment | self.umb_def | self.umb_autosub_def, + 'Subscribe: Default subtypes: comment (default generic) and two model-related defaults') + self.assertEqual( + follower_adm.subtype_ids, + self.sub_comment | self.umb_autosub_nodef | self.sub_generic_int_nodef, + 'Subscribe: Asked subtypes when subscribing') sub1 = self.env['mail.test.track'].with_user(self.user_employee).create({ 'name': 'Task-Like Test', 'container_id': container.id, }) - all_defaults = self.env['mail.message.subtype'].search([('default', '=', True), '|', ('res_model', '=', 'mail.test.track'), ('res_model', '=', False)]) - external_defaults = all_defaults.filtered(lambda subtype: not subtype.internal) + self.assertEqual( + sub1.message_partner_ids, self.partner_portal | self.partner_admin | self.user_employee.partner_id, + 'Followers: creator (employee) + auto subscribe from parent (portal)') + follower_por = sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.partner_portal) + follower_adm = sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.partner_admin) + follower_emp = sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.user_employee.partner_id) + self.assertEqual( + follower_por.subtype_ids, self.sub_comment | self.sub_track_1, + 'AutoSubscribe: comment (generic checked), Track (with child relation) 1 as Umbrella AutoSub (default) was checked' + ) + self.assertEqual( + follower_adm.subtype_ids, self.sub_comment | self.sub_track_2 | self.sub_generic_int_nodef, + 'AutoSubscribe: comment (generic checked), Track (with child relation) 2) as Umbrella AutoSub 2 was checked, Generic internal subtype (generic checked)' + ) + self.assertEqual( + follower_emp.subtype_ids, self.sub_comment | self.sub_track_def | self.sub_generic_int_def, + 'AutoSubscribe: only default one as no subscription on parent' + ) + + # check portal generic subscribe + sub1.message_unsubscribe(partner_ids=self.partner_portal.ids) + sub1.message_subscribe(partner_ids=self.partner_portal.ids) + follower_por = sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.partner_portal) - self.assertEqual(sub1.message_partner_ids, self.partner_portal | self.user_employee.partner_id) - self.assertEqual(sub1.message_follower_ids.partner_id, self.partner_portal | self.user_employee.partner_id) self.assertEqual( - sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.partner_portal).subtype_ids, - external_defaults | self.sub_umb1) + follower_por.subtype_ids, self.sub_comment | self.sub_track_def, + 'AutoSubscribe: only default one as no subscription on parent (no internal as portal)' + ) + + # check auto subscribe as creator + auto subscribe as parent follower takes both subtypes + container.message_subscribe( + partner_ids=self.user_employee.partner_id.ids, + subtype_ids=(self.sub_comment | self.sub_generic_int_nodef | self.umb_autosub_nodef).ids) + sub2 = self.env['mail.test.track'].with_user(self.user_employee).create({ + 'name': 'Task-Like Test', + 'container_id': container.id, + }) + follower_emp = sub2.message_follower_ids.filtered(lambda fol: fol.partner_id == self.user_employee.partner_id) + defaults = self.sub_comment | self.sub_track_def | self.sub_generic_int_def + parents = self.sub_generic_int_nodef | self.sub_track_2 self.assertEqual( - sub1.message_follower_ids.filtered(lambda fol: fol.partner_id == self.user_employee.partner_id).subtype_ids, - all_defaults) + follower_emp.subtype_ids, defaults + parents, + 'AutoSubscribe: at create auto subscribe as creator + from parent take both subtypes' + ) class AdvancedResponsibleNotifiedTest(TestMailCommon):