[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 <tde@odoo.com>
Co-authored-by: Priyanka kakadiya <pka@odoo.com>
This commit is contained in:
Thibault Delavallée
2021-01-19 18:11:51 +00:00
co-authored by Priyanka kakadiya
parent 67106f6840
commit ec874afd77
+115 -25
View File
@@ -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):