summaryrefslogtreecommitdiff
path: root/addons/test_mail
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-11-26 10:42:15 +0000
committerThibault Delavallée <tde@odoo.com>2021-01-19 16:33:17 +0000
commit1e29d48f5b10deca9ed7b991ea92ffc36f61c725 (patch)
tree669fea888522285a80b3c74fa900a8a089b11d46 /addons/test_mail
parent66533ebd88ed89c3baae6fdb1d0a28a458fa0cb9 (diff)
[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: odoo/odoo@ad210729da4bf72dad77acc4030a38478340f4c6 X-original-PR: odoo/odoo#47336 Co-Authored-By: Thibault Delavallee <tde@odoo.com> Co-Authored-By: Priyanka kakadiya <pka@odoo.com>
Diffstat (limited to 'addons/test_mail')
-rw-r--r--addons/test_mail/tests/test_mail_followers.py140
1 files 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):