diff --git a/addons/sales_team/tests/common.py b/addons/sales_team/tests/common.py index 32709b1ddc4..8dcd51a2645 100644 --- a/addons/sales_team/tests/common.py +++ b/addons/sales_team/tests/common.py @@ -50,7 +50,6 @@ class TestSalesCommon(TransactionCase): notification_type='inbox', groups='sales_team.group_sale_salesman', ) - cls.user_admin = cls.env.ref('base.user_admin') cls.env['crm.team'].search([]).write({'sequence': 9999}) cls.sales_team_1 = cls.env['crm.team'].create({ diff --git a/addons/test_crm_full/__init__.py b/addons/test_crm_full/__init__.py new file mode 100644 index 00000000000..67dee8c60db --- /dev/null +++ b/addons/test_crm_full/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. diff --git a/addons/test_crm_full/__manifest__.py b/addons/test_crm_full/__manifest__.py new file mode 100644 index 00000000000..86302d6c840 --- /dev/null +++ b/addons/test_crm_full/__manifest__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Test Full Crm Flow', + 'version': '1.0', + 'category': 'Hidden/Tests', + 'description': """ +This module is intended to test the main crm flows of Odoo, both frontend and +backend. It notably includes IAP bridges modules to test their impact. """, + 'depends': [ + 'crm', + 'crm_iap_enrich', + 'crm_iap_mine', + 'crm_sms', + 'event_crm', + 'sale_crm', + 'website_crm', + 'website_crm_iap_reveal', + 'website_crm_partner_assign', + 'website_crm_livechat', + ], + 'license': 'LGPL-3', +} diff --git a/addons/test_crm_full/tests/__init__.py b/addons/test_crm_full/tests/__init__.py new file mode 100644 index 00000000000..72c0b71531b --- /dev/null +++ b/addons/test_crm_full/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_performance diff --git a/addons/test_crm_full/tests/common.py b/addons/test_crm_full/tests/common.py new file mode 100644 index 00000000000..bce1f749eb8 --- /dev/null +++ b/addons/test_crm_full/tests/common.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime + +from odoo.addons.crm.tests.common import TestCrmCommon +from odoo.addons.crm_iap_mine.tests.common import MockIAPReveal # MockIAPEnrich +from odoo.addons.website.tests.test_website_visitor import MockVisitor + + +class TestCrmFullCommon(TestCrmCommon, MockIAPReveal, MockVisitor): + + @classmethod + def setUpClass(cls): + super(TestCrmFullCommon, cls).setUpClass() + cls._init_mail_gateway() + cls._activate_multi_company() + + # Context data: dates + # ------------------------------------------------------------ + + # Mock dates to have reproducible computed fields based on time + cls.reference_now = datetime(2022, 1, 1, 10, 0, 0) + cls.reference_today = datetime(2022, 1, 1) + + # Customers + # ------------------------------------------------------------ + + country_be = cls.env.ref('base.be') + cls.env['res.lang']._activate_lang('fr_BE') + + cls.partners = cls.env['res.partner'].create([ + {'country_id': country_be.id, + 'email': 'partner.email.%02d@test.example.com' % idx, + 'function': 'Noisy Customer', + 'lang': 'fr_BE', + 'mobile': '04569999%02d' % idx, + 'name': 'PartnerCustomer', + 'phone': '04560000%02d' % idx, + 'street': 'Super Street, %092d' % idx, + 'zip': '1400', + } for idx in range(0, 10) + ]) diff --git a/addons/test_crm_full/tests/test_performance.py b/addons/test_crm_full/tests/test_performance.py new file mode 100644 index 00000000000..8c946b078e0 --- /dev/null +++ b/addons/test_crm_full/tests/test_performance.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from freezegun import freeze_time + +from odoo.addons.test_crm_full.tests.common import TestCrmFullCommon +from odoo.tests.common import users, warmup, Form +from odoo.tests import tagged + + +@tagged('crm_performance', 'post_install', '-at_install') +class CrmPerformanceCase(TestCrmFullCommon): + + def setUp(self): + super(CrmPerformanceCase, self).setUp() + # patch registry to simulate a ready environment + self.patch(self.env.registry, 'ready', True) + self._flush_tracking() + + self.user_sales_leads.write({ + 'groups_id': [ + (4, self.env.ref('event.group_event_user').id), + (4, self.env.ref('im_livechat.im_livechat_group_user').id), + ] + }) + + def _flush_tracking(self): + """ Force the creation of tracking values notably, and ensure tests are + reproducible. """ + self.env['base'].flush() + self.cr.flush() + + +@tagged('crm_performance', 'post_install', '-at_install') +class TestCrmPerformance(CrmPerformanceCase): + + @users('user_sales_leads') + @warmup + def test_lead_create_batch_mixed(self): + """ Test multiple lead creation (import) """ + batch_size = 10 + country_be = self.env.ref('base.be') + lang_be_id = self.env['res.lang']._lang_get_id('fr_BE') + + with freeze_time(self.reference_now), self.assertQueryCount(user_sales_leads=281): # tcf only: 281 (~280 - 274) - com runbot: 273 + self.env.cr._now = self.reference_now # force create_date to check schedulers + crm_values = [ + {'country_id': country_be.id, + 'email_from': 'address.email.%02d@test.example.com' % idx, + 'function': 'Noisy Customer', + 'lang_id': lang_be_id, + 'mobile': '04551111%02d' % idx, + 'name': 'Test Lead %02d' % idx, + 'phone': '04550000%02d' % idx, + 'street': 'Super Street, %092d' % idx, + 'zip': '1400', + } for idx in range(batch_size) + ] + crm_values += [ + {'partner_id': self.partners[idx].id, + 'name': 'Test Lead %02d' % idx, + } for idx in range(batch_size) + ] + _leads = self.env['crm.lead'].create(crm_values) + + @users('user_sales_leads') + @warmup + def test_lead_create_form_address(self): + """ Test a single lead creation using Form """ + country_be = self.env.ref('base.be') + lang_be = self.env['res.lang']._lang_get('fr_BE') + + with freeze_time(self.reference_now), self.assertQueryCount(user_sales_leads=188): # tcf only: 173 - com runbot: 174 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['crm.lead']) as lead_form: + lead_form.country_id = country_be + lead_form.email_from = 'address.email@test.example.com' + lead_form.function = 'Noisy Customer' + lead_form.lang_id = lang_be + lead_form.mobile = '0455111100' + lead_form.name = 'Test Lead' + lead_form.phone = '0455000011' + lead_form.street = 'Super Street, 00' + lead_form.zip = '1400' + + _lead = lead_form.save() + + @users('user_sales_leads') + @warmup + def test_lead_create_form_partner(self): + """ Test a single lead creation using Form with a partner """ + with freeze_time(self.reference_now), self.assertQueryCount(user_sales_leads=189): # tcf only: 174 - com runbot: 175 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['crm.lead']) as lead_form: + lead_form.partner_id = self.partners[0] + lead_form.name = 'Test Lead' + + _lead = lead_form.save() + + @users('user_sales_leads') + @warmup + def test_lead_create_single_address(self): + """ Test multiple lead creation (import) """ + country_be = self.env.ref('base.be') + lang_be_id = self.env['res.lang']._lang_get_id('fr_BE') + + with freeze_time(self.reference_now), self.assertQueryCount(user_sales_leads=42): # tcf only: 41 - com runbot: 42 + self.env.cr._now = self.reference_now # force create_date to check schedulers + crm_values = [ + {'country_id': country_be.id, + 'email_from': 'address.email.00@test.example.com', + 'function': 'Noisy Customer', + 'lang_id': lang_be_id, + 'mobile': '0455111100', + 'name': 'Test Lead', + 'phone': '0455000000', + 'street': 'Super Street, 00', + 'zip': '1400', + } + ] + _lead = self.env['crm.lead'].create(crm_values) + + @users('user_sales_leads') + @warmup + def test_lead_create_single_partner(self): + """ Test multiple lead creation (import) """ + with freeze_time(self.reference_now), self.assertQueryCount(user_sales_leads=48): # tcf only: 47 - com runbot: 48 + self.env.cr._now = self.reference_now # force create_date to check schedulers + crm_values = [ + {'partner_id': self.partners[0].id, + 'name': 'Test Lead', + } + ] + _lead = self.env['crm.lead'].create(crm_values)