diff options
Diffstat (limited to 'addons/test_mail/tests')
| -rw-r--r-- | addons/test_mail/tests/__init__.py | 5 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_mail_redirect.py | 67 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_mail_thread_internals.py (renamed from addons/test_mail/tests/test_discuss.py) | 65 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_message_track.py | 115 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_odoobot.py | 132 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_performance.py | 53 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_update_notification.py | 11 |
7 files changed, 152 insertions, 296 deletions
diff --git a/addons/test_mail/tests/__init__.py b/addons/test_mail/tests/__init__.py index 78d3b1516b6..3aac76d3df9 100644 --- a/addons/test_mail/tests/__init__.py +++ b/addons/test_mail/tests/__init__.py @@ -2,19 +2,16 @@ from . import test_invite from . import test_ir_actions -from . import test_discuss from . import test_mail_activity from . import test_mail_followers from . import test_mail_message from . import test_mail_mail from . import test_mail_channel from . import test_mail_gateway -from . import test_mail_redirect from . import test_mail_template +from . import test_mail_thread_internals from . import test_message_composer from . import test_message_management from . import test_message_post from . import test_message_track -from . import test_odoobot from . import test_performance -from . import test_update_notification diff --git a/addons/test_mail/tests/test_mail_redirect.py b/addons/test_mail/tests/test_mail_redirect.py deleted file mode 100644 index 706a9704319..00000000000 --- a/addons/test_mail/tests/test_mail_redirect.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from werkzeug.urls import url_decode, url_parse -from odoo.tests.common import HttpCase, tagged - - -@tagged('-at_install', 'post_install') -class TestMultiCompany(HttpCase): - - def test_redirect_to_records(self): - - self.company_A = self.env['res.company'].create({ - 'name': 'Company A', - 'user_ids': [(4, self.ref('base.user_admin'))], - }) - - self.company_B = self.env['res.company'].create({ - 'name': 'Company B', - }) - - self.multi_company_record = self.env['mail.test.multi.company'].create({ - 'name': 'Multi Company Record', - 'company_id': self.company_A.id, - }) - - # Test Case 0 - # Not logged, redirect to web/login - response = self.url_open('/mail/view?model=%s&res_id=%s' % ( - self.multi_company_record._name, - self.multi_company_record.id), timeout=15) - - path = url_parse(response.url).path - self.assertEqual(path, '/web/login') - - self.authenticate('admin', 'admin') - - # Test Case 1 - # Logged into company 1, try accessing record in company A - # _redirect_to_record should add company A in allowed_company_ids - response = self.url_open('/mail/view?model=%s&res_id=%s' % ( - self.multi_company_record._name, - self.multi_company_record.id), timeout=15) - - self.assertEqual(response.status_code, 200) - - fragment = url_parse(response.url).fragment - cids = url_decode(fragment)['cids'] - - self.assertEqual(cids, '1,%s' % (self.company_A.id)) - - # Test Case 2 - # Logged into company 1, try accessing record in company B - # _redirect_to_record should redirect to messaging as the user - # doesn't have any access for this company - self.multi_company_record.company_id = self.company_B - - response = self.url_open('/mail/view?model=%s&res_id=%s' % ( - self.multi_company_record._name, - self.multi_company_record.id), timeout=15) - - self.assertEqual(response.status_code, 200) - - fragment = url_parse(response.url).fragment - action = url_decode(fragment)['action'] - - self.assertEqual(action, 'mail.action_discuss') diff --git a/addons/test_mail/tests/test_discuss.py b/addons/test_mail/tests/test_mail_thread_internals.py index 86b9a7de0cb..1674d9ca312 100644 --- a/addons/test_mail/tests/test_discuss.py +++ b/addons/test_mail/tests/test_mail_thread_internals.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from werkzeug.urls import url_parse, url_decode + from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients +from odoo.tests.common import tagged, HttpCase from odoo.tools import mute_logger @@ -141,3 +144,65 @@ class TestDiscuss(TestMailCommon, TestRecipients): (False, 'cc1@example.com', 'CC Email'), (False, 'cc2@example.com', 'CC Email'), ], 'cc should be in suggestions') + + +@tagged('-at_install', 'post_install') +class TestMultiCompany(HttpCase): + + def test_redirect_to_records(self): + + self.company_A = self.env['res.company'].create({ + 'name': 'Company A', + 'user_ids': [(4, self.ref('base.user_admin'))], + }) + + self.company_B = self.env['res.company'].create({ + 'name': 'Company B', + }) + + self.multi_company_record = self.env['mail.test.multi.company'].create({ + 'name': 'Multi Company Record', + 'company_id': self.company_A.id, + }) + + # Test Case 0 + # Not logged, redirect to web/login + response = self.url_open('/mail/view?model=%s&res_id=%s' % ( + self.multi_company_record._name, + self.multi_company_record.id), timeout=15) + + path = url_parse(response.url).path + self.assertEqual(path, '/web/login') + + self.authenticate('admin', 'admin') + + # Test Case 1 + # Logged into company 1, try accessing record in company A + # _redirect_to_record should add company A in allowed_company_ids + response = self.url_open('/mail/view?model=%s&res_id=%s' % ( + self.multi_company_record._name, + self.multi_company_record.id), timeout=15) + + self.assertEqual(response.status_code, 200) + + fragment = url_parse(response.url).fragment + cids = url_decode(fragment)['cids'] + + self.assertEqual(cids, '1,%s' % (self.company_A.id)) + + # Test Case 2 + # Logged into company 1, try accessing record in company B + # _redirect_to_record should redirect to messaging as the user + # doesn't have any access for this company + self.multi_company_record.company_id = self.company_B + + response = self.url_open('/mail/view?model=%s&res_id=%s' % ( + self.multi_company_record._name, + self.multi_company_record.id), timeout=15) + + self.assertEqual(response.status_code, 200) + + fragment = url_parse(response.url).fragment + action = url_decode(fragment)['action'] + + self.assertEqual(action, 'mail.action_discuss') diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py index 20ee3d74c4b..45ae711d32b 100644 --- a/addons/test_mail/tests/test_message_track.py +++ b/addons/test_mail/tests/test_message_track.py @@ -4,8 +4,10 @@ from unittest.mock import patch from odoo.addons.test_mail.tests.common import TestMailCommon +from odoo.tests.common import tagged +@tagged('mail_track') class TestTracking(TestMailCommon): def setUp(self): @@ -127,61 +129,6 @@ class TestTracking(TestMailCommon): # one email send due to template self.assertSentEmail(self.record.env.user.partner_id, [self.partner_admin], body='<p>Hello Test</p>') - def test_message_tracking_sequence(self): - """ Update some tracked fields and check that the mail.tracking.value are ordered according to their tracking_sequence""" - self.record.write({ - 'name': 'Zboub', - 'customer_id': self.user_admin.partner_id.id, - 'user_id': self.user_admin.id, - 'umbrella_id': self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'}).id - }) - self.flush_tracking() - self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message') - - tracking_values = self.env['mail.tracking.value'].search([('mail_message_id', '=', self.record.message_ids.id)]) - self.assertEqual(tracking_values[0].tracking_sequence, 1) - self.assertEqual(tracking_values[1].tracking_sequence, 2) - self.assertEqual(tracking_values[2].tracking_sequence, 100) - - def test_track_groups(self): - # patch the group attribute - field = self.record._fields['email_from'] - self.addCleanup(setattr, field, 'groups', field.groups) - field.groups = 'base.group_erp_manager' - - self.record.sudo().write({'email_from': 'X'}) - self.flush_tracking() - - msg_emp = self.record.message_ids.message_format() - msg_sudo = self.record.sudo().message_ids.message_format() - self.assertFalse(msg_emp[0].get('tracking_value_ids'), "should not have protected tracking values") - self.assertTrue(msg_sudo[0].get('tracking_value_ids'), "should have protected tracking values") - - def test_notify_track_groups(self): - # patch the group attribute - field = self.record._fields['email_from'] - self.addCleanup(setattr, field, 'groups', field.groups) - field.groups = 'base.group_erp_manager' - - self.record.sudo().write({'email_from': 'X'}) - self.flush_tracking() - - msg_emp = self.record._notify_prepare_template_context(self.record.message_ids, {}) - msg_sudo = self.record.sudo()._notify_prepare_template_context(self.record.message_ids, {}) - self.assertFalse(msg_emp.get('tracking_values'), "should not have protected tracking values") - self.assertTrue(msg_sudo.get('tracking_values'), "should have protected tracking values") - - def test_unlinked_field(self): - record_sudo = self.record.sudo() - record_sudo.write({'email_from': 'X'}) # create a tracking value - self.flush_tracking() - self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1) - ir_model_field = self.env['ir.model.fields'].search([ - ('model', '=', 'mail.test.full'), - ('name', '=', 'email_from')]) - ir_model_field.with_context(_force_unlink=True).unlink() - self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 0) - def test_create_partner_from_tracking_multicompany(self): company1 = self.env['res.company'].create({'name': 'company1'}) self.env.user.write({'company_ids': [(4, company1.id, False)]}) @@ -334,3 +281,61 @@ class TestTracking(TestMailCommon): ('partner_name', 'char', 'Fool', 'Bar'), ('partner_email', 'char', 'foo@example.com', 'bar@example.com'), ]) + + +@tagged('mail_track') +class TestTrackingInternals(TestMailCommon): + + def setUp(self): + super(TestTrackingInternals, self).setUp() + + record = self.env['mail.test.full'].with_user(self.user_employee).with_context(self._test_context).create({ + 'name': 'Test', + }) + self.flush_tracking() + self.record = record.with_context(mail_notrack=False) + + def test_track_groups(self): + field = self.record._fields['email_from'] + self.addCleanup(setattr, field, 'groups', field.groups) + field.groups = 'base.group_erp_manager' + + self.record.sudo().write({'email_from': 'X'}) + self.flush_tracking() + + msg_emp = self.record.message_ids.message_format() + msg_sudo = self.record.sudo().message_ids.message_format() + self.assertFalse(msg_emp[0].get('tracking_value_ids'), "should not have protected tracking values") + self.assertTrue(msg_sudo[0].get('tracking_value_ids'), "should have protected tracking values") + + msg_emp = self.record._notify_prepare_template_context(self.record.message_ids, {}) + msg_sudo = self.record.sudo()._notify_prepare_template_context(self.record.message_ids, {}) + self.assertFalse(msg_emp.get('tracking_values'), "should not have protected tracking values") + self.assertTrue(msg_sudo.get('tracking_values'), "should have protected tracking values") + + def test_track_sequence(self): + """ Update some tracked fields and check that the mail.tracking.value are ordered according to their tracking_sequence""" + self.record.write({ + 'name': 'Zboub', + 'customer_id': self.user_admin.partner_id.id, + 'user_id': self.user_admin.id, + 'umbrella_id': self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'}).id + }) + self.flush_tracking() + self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message') + + tracking_values = self.env['mail.tracking.value'].search([('mail_message_id', '=', self.record.message_ids.id)]) + self.assertEqual(tracking_values[0].tracking_sequence, 1) + self.assertEqual(tracking_values[1].tracking_sequence, 2) + self.assertEqual(tracking_values[2].tracking_sequence, 100) + + def test_unlinked_field(self): + record_sudo = self.record.sudo() + record_sudo.write({'email_from': 'new_value'}) # create a tracking value + self.flush_tracking() + self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1) + ir_model_field = self.env['ir.model.fields'].search([ + ('model', '=', 'mail.test.full'), + ('name', '=', 'email_from')]) + ir_model_field.with_context(_force_unlink=True).unlink() + self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 0) diff --git a/addons/test_mail/tests/test_odoobot.py b/addons/test_mail/tests/test_odoobot.py deleted file mode 100644 index 2e4dc55490a..00000000000 --- a/addons/test_mail/tests/test_odoobot.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from unittest.mock import patch - -from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients -from odoo.tests import tagged -from odoo.tools import mute_logger - - -@tagged("odoobot") -class TestOdoobot(TestMailCommon, TestRecipients): - - @classmethod - def setUpClass(cls): - super(TestOdoobot, cls).setUpClass() - cls.test_record = cls.env['mail.test.simple'].with_context(cls._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'}) - - cls.odoobot = cls.env.ref("base.partner_root") - cls.message_post_default_kwargs = { - 'body': '', - 'attachment_ids': [], - 'message_type': 'comment', - 'partner_ids': [], - 'subtype_xmlid': 'mail.mt_comment' - } - cls.odoobot_ping_body = '<a href="http://odoo.com/web#model=res.partner&id=%s" class="o_mail_redirect" data-oe-id="%s" data-oe-model="res.partner" target="_blank">@OdooBot</a>' % (cls.odoobot.id, cls.odoobot.id) - cls.test_record_employe = cls.test_record.with_user(cls.user_employee) - - @mute_logger('odoo.addons.mail.models.mail_mail') - def test_fetch_listener(self): - channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot() - partners = self.env['mail.channel'].channel_fetch_listeners(channel.uuid) - odoobot = self.env.ref("base.partner_root") - odoobot_in_fetch_listeners = [partner for partner in partners if partner['id'] == odoobot.id] - self.assertEqual(len(odoobot_in_fetch_listeners), 1, 'odoobot should appear only once in channel_fetch_listeners') - - @mute_logger('odoo.addons.mail.models.mail_mail') - def test_odoobot_ping(self): - kwargs = self.message_post_default_kwargs.copy() - kwargs.update({'body': self.odoobot_ping_body, 'partner_ids': [self.odoobot.id, self.user_admin.partner_id.id]}) - - with patch('random.choice', lambda x: x[0]): - self.assertNextMessage( - self.test_record_employe.with_context({'mail_post_autofollow': True}).message_post(**kwargs), - sender=self.odoobot, - answer=False - ) - # Odoobot should not be a follower but user_employee and user_admin should - follower = self.test_record.message_follower_ids.mapped('partner_id') - self.assertNotIn(self.odoobot, follower) - self.assertIn(self.user_employee.partner_id, follower) - self.assertIn(self.user_admin.partner_id, follower) - - @mute_logger('odoo.addons.mail.models.mail_mail') - def test_onboarding_flow(self): - kwargs = self.message_post_default_kwargs.copy() - channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot() - - kwargs['body'] = 'tagada 😊' - self.assertNextMessage( - channel.message_post(**kwargs), - sender=self.odoobot, - answer=("attachment",) - ) - kwargs['body'] = '' - attachment = self.env['ir.attachment'].with_user(self.user_employee).create({ - 'datas': 'bWlncmF0aW9uIHRlc3Q=', - 'name': 'picture_of_your_dog.doc', - 'res_model': 'mail.compose.message', - }) - kwargs['attachment_ids'] = [attachment.id] - last_message = self.assertNextMessage( - channel.message_post(**kwargs), - sender=self.odoobot, - answer=("help",) - ) - kwargs['attachment_ids'] = [] - - channel.execute_command(command="help") - self.assertNextMessage( - last_message, # no message will be post with command help, use last odoobot message instead - sender=self.odoobot, - answer=("@OdooBot",) - ) - # we dont test the end of the flow since it will depends of the installed apps (livechat) - self.user_employee.odoobot_state = "idle" - kwargs['partner_ids'] = [] - kwargs['body'] = "I love you" - self.assertNextMessage( - channel.message_post(**kwargs), - sender=self.odoobot, - answer=("too human for me",) - ) - kwargs['body'] = "Go fuck yourself" - self.assertNextMessage( - channel.message_post(**kwargs), - sender=self.odoobot, - answer=("I have feelings",) - ) - - @mute_logger('odoo.addons.mail.models.mail_mail') - def test_odoobot_no_default_answer(self): - kwargs = self.message_post_default_kwargs.copy() - kwargs.update({'body': "I'm not talking to @odoobot right now", 'partner_ids': []}) - self.assertNextMessage( - self.test_record_employe.message_post(**kwargs), - answer=False - ) - - def assertNextMessage(self, message, answer=None, sender=None): - last_message = self.env['mail.message'].search([('id', '=', message.id + 1)]) - if last_message: - body = last_message.body.replace('<p>', '').replace('</p>', '') - else: - self.assertFalse(answer, "No last message found when an answer was expect") - if answer is not None: - if answer and not last_message: - self.assertTrue(False, "No last message found") - if isinstance(answer, list): - self.assertIn(body, answer) - elif isinstance(answer, tuple): - for elem in answer: - self.assertIn(elem, body) - elif not answer: - self.assertFalse(last_message, "No answer should have been post") - return - else: - self.assertEqual(body, answer) - if sender: - self.assertEqual(sender, last_message.author_id) - return last_message diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py index de82171251b..1d8ab7729c9 100644 --- a/addons/test_mail/tests/test_performance.py +++ b/addons/test_mail/tests/test_performance.py @@ -183,6 +183,11 @@ class TestMailAPIPerformance(BaseMailPerformance): 'notification_type': 'inbox', 'groups_id': [(6, 0, [self.env.ref('base.group_user').id])], }) + + # automatically follow activities, for backward compatibility concerning query count + self.env.ref('mail.mt_activities').write({'default': True}) + + def _create_test_records(self): self.test_record_full = self.env['mail.test.full'].with_context(self._quick_create_ctx).create({ 'name': 'TestRecord', 'customer_id': self.customer.id, @@ -199,9 +204,6 @@ class TestMailAPIPerformance(BaseMailPerformance): 'email_to': '${("%s Customer <%s>" % (object.name, object.email_from)) | safe}', }) - # automatically follow activities, for backward compatibility concerning query count - self.env.ref('mail.mt_activities').write({'default': True}) - @users('__system__', 'emp') @warmup def test_adv_activity(self): @@ -255,6 +257,7 @@ class TestMailAPIPerformance(BaseMailPerformance): @warmup @mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail') def test_mail_composer(self): + self._create_test_records() test_record = self.env['mail.test.full'].browse(self.test_record_full.id) customer_id = self.customer.id with self.assertQueryCount(__system__=4, emp=4): @@ -274,6 +277,7 @@ class TestMailAPIPerformance(BaseMailPerformance): @warmup @mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') def test_mail_composer_w_template(self): + self._create_test_records() test_record = self.env['mail.test.full'].browse(self.test_record_full.id) test_template = self.env['mail.template'].browse(self.test_template_full.id) # TODO FIXME non deterministic, last check 25 Mar 2020. Runbot at most +7 compared to local. @@ -395,6 +399,25 @@ class TestMailAPIPerformance(BaseMailPerformance): with self.assertQueryCount(__system__=2, emp=2): record.message_subscribe(partner_ids=self.user_test.partner_id.ids, subtype_ids=subtype_ids) + @mute_logger('odoo.models.unlink') + @users('__system__', 'emp') + @warmup + def test_message_track(self): + record = self.env['mail.test.tracking'].create({'name': 'Zizizatestname'}) + with self.assertQueryCount(__system__=3, emp=3): + record.write({'name': 'Zizizanewtestname'}) + record.flush() + + with self.assertQueryCount(__system__=5, emp=5): + record.write({'field_%s' % (i): 'Tracked Char Fields %s' % (i) for i in range(3)}) + record.flush() + + with self.assertQueryCount(__system__=6, emp=6): + record.write({'field_%s' % (i): 'Field Without Cache %s' % (i) for i in range(3)}) + record.flush() + record.write({'field_%s' % (i): 'Field With Cache %s' % (i) for i in range(3)}) + record.flush() + @tagged('mail_performance') class TestMailComplexPerformance(BaseMailPerformance): @@ -949,27 +972,3 @@ class TestMailHeavyPerformancePost(BaseMailPerformance): self.assertEqual(self.attachements.mapped('res_model'), [record._name for i in range(3)]) self.assertEqual(self.attachements.mapped('res_id'), [record.id for i in range(3)]) # self.assertEqual(record.message_ids[0].notified_partner_ids, []) - - -@tagged('mail_performance') -class TestTrackingPerformance(BaseMailPerformance): - - @users('__system__', 'demo') - @warmup - def test_tracking_multiple_fields(self): - """ Check that tracking multiple fields is scalable """ - - record = self.env['mail.test.tracking'].create({'name': 'Zizizatestname'}) - with self.assertQueryCount(__system__=3, demo=3): - record.write({'name': 'Zizizanewtestname'}) - record.flush() - - with self.assertQueryCount(__system__=5, demo=5): - record.write({'field_%s' % (i): 'Tracked Char Fields %s' % (i) for i in range(3)}) - record.flush() - - with self.assertQueryCount(__system__=6, demo=6): - record.write({'field_%s' % (i): 'Field Without Cache %s' % (i) for i in range(3)}) - record.flush() - record.write({'field_%s' % (i): 'Field With Cache %s' % (i) for i in range(3)}) - record.flush() diff --git a/addons/test_mail/tests/test_update_notification.py b/addons/test_mail/tests/test_update_notification.py deleted file mode 100644 index 7621e4056a1..00000000000 --- a/addons/test_mail/tests/test_update_notification.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo.tests.common import TransactionCase - - -class TestUpdateNotification(TransactionCase): - def test_user_count(self): - ping_msg = self.env['publisher_warranty.contract'].with_context(active_test=False)._get_message() - user_count = self.env['res.users'].search_count([('active', '=', True)]) - self.assertEqual(ping_msg.get('nbr_users'), user_count, 'Update Notification: Users count is badly computed in ping message') - share_user_count = self.env['res.users'].search_count([('active', '=', True), ('share', '=', True)]) - self.assertEqual(ping_msg.get('nbr_share_users'), share_user_count, 'Update Notification: Portal Users count is badly computed in ping message') |
