From a01933c9b4dc6ff4e1a0b73822df9097025c0e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 1 Mar 2018 14:51:48 +0100 Subject: [PATCH] [IMP] test_mail: add unit and performance tests about adding followers Purpose of this commit is to test existing behavior of followers subscription as well as adding some query count tests about message_subscribe method. As followers subscription technical implementation may change in a near future in order to be optimized it is a good idea to have current behavior and query count validated. This commit adds * test for followers update using message_subscribe API. Tests are added with forced and unforced subtypes to ensure behavior will not change or will be changed while knowing it; * performance test about message_subscribe, about adding new followers, and subscribing already-existing followers in force mode or not; Query count performance test shows that message_subscribe could probably be improved. It does several things that require queries (check of access rights, check for existing subscriptions, ensure customers have no access to internal subtypes, ...). However we feel it could be improved in order to speed-up the subscription of followers. This is linked to task 49265; it is only the first steps of it. --- addons/test_mail/tests/test_mail_followers.py | 16 +++++- addons/test_mail/tests/test_performance.py | 57 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/addons/test_mail/tests/test_mail_followers.py b/addons/test_mail/tests/test_mail_followers.py index a59ef9cea3c..3d2600facce 100644 --- a/addons/test_mail/tests/test_mail_followers.py +++ b/addons/test_mail/tests/test_mail_followers.py @@ -91,7 +91,21 @@ class BaseFollowersTest(common.BaseFunctionalTest): test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], subtype_ids=[self.mt_mg_nodef.id, self.mt_al_nodef.id]) self.assertEqual(test_record.message_partner_ids, self.user_admin.partner_id) self.assertEqual(test_record.message_channel_ids, self.env['mail.channel']) - self.assertEqual(test_record.message_follower_ids.filtered(lambda fol: fol.partner_id == self.user_admin.partner_id).subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) + self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) + + def test_followers_multiple_subscription_noforce(self): + test_record = self.test_record.sudo(self.user_employee) + + test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], subtype_ids=[self.mt_mg_nodef.id, self.mt_al_nodef.id]) + self.assertEqual(test_record.message_partner_ids, self.user_admin.partner_id) + self.assertEqual(test_record.message_channel_ids, self.env['mail.channel']) + self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) + + # set new subtypes with force=False, meaning no rewriting of the subscription is done -> result should not change + test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], force=False) + self.assertEqual(test_record.message_partner_ids, self.user_admin.partner_id) + self.assertEqual(test_record.message_channel_ids, self.env['mail.channel']) + self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) def test_followers_no_DID(self): """Test that a follower cannot suffer from dissociative identity disorder. diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py index 8432cf54993..a544b447422 100644 --- a/addons/test_mail/tests/test_performance.py +++ b/addons/test_mail/tests/test_performance.py @@ -192,6 +192,10 @@ class TestHeavyMailPerformance(TransactionCase): self.env['ir.config_parameter'].sudo().set_param('mail.catchall.alias', 'test-catchall') self.env['ir.config_parameter'].sudo().set_param('mail.bounce.alias', 'test-bounce') + self.channel = self.env['mail.channel'].with_context(self._quick_create_ctx).create({ + 'name': 'Listener', + }) + # prepare recipients to test for more realistic workload self.customer = self.env['res.partner'].with_context(self._quick_create_ctx).create({ 'name': 'Test Customer', @@ -266,6 +270,59 @@ class TestHeavyMailPerformance(TransactionCase): self.assertEqual(record.message_ids[0].body, '

Adding stuff on %s

' % record.name) self.assertEqual(record.message_ids[0].needaction_partner_ids, self.partners | self.user_portal.partner_id | self.customer) + @mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') + @users('admin', 'emp') + @warmup + def test_complex_message_subscribe(self): + pids = self.partners.ids + cids = self.channel.ids + subtypes = self.env.ref('mail.mt_comment') | self.env.ref('test_mail.st_mail_test_full_umbrella_upd') + subtype_ids = subtypes.ids + rec = self.env['mail.test.full'].create({ + 'name': 'Test', + 'umbrella_id': False, + 'customer_id': False, + 'user_id': self.user_portal.id, + }) + + self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id) + self.assertEqual(rec.message_channel_ids, self.env['mail.channel']) + + # subscribe new followers with forced given subtypes + with self.assertQueryCount(admin=20, emp=21): # test_mail only: 20 - 21 + rec.message_subscribe( + partner_ids=pids[:4], + channel_ids=cids, + subtype_ids=subtype_ids, + ) + + self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:4]) + self.assertEqual(rec.message_channel_ids, self.channel) + + # subscribe existing and new followers with force=False, meaning only some new followers will be added + with self.assertQueryCount(admin=11, emp=12): # test_mail only: 11 - 12 + rec.message_subscribe( + partner_ids=pids[:6], + channel_ids=cids, + subtype_ids=None, + force=False, + ) + + self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:6]) + self.assertEqual(rec.message_channel_ids, self.channel) + + # subscribe existing and new followers with force=True, meaning all will have the same subtypes + with self.assertQueryCount(admin=48, emp=49): # test_mail only: 48 - 49 + rec.message_subscribe( + partner_ids=pids, + channel_ids=cids, + subtype_ids=subtype_ids, + force=True, + ) + + self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners) + self.assertEqual(rec.message_channel_ids, self.channel) + @mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') @users('admin', 'emp') @warmup