From ff6b35f759c64e49db787775e5df150ce0f53f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 6 Jan 2020 16:32:24 +0000 Subject: [PATCH] [IMP] crm: clean and improve tests for lead2opportunity converters PURPOSE As crm will soon evolve (onchange -> compute, code improvements, addition of new features) cleaning and improving tests is necessary to help avoid issues. SPECIFICATIONS In this commit we add tests for the lead 2 opportunity converters. Indeed it is strange that such a critical wizard has so few tests. Notably the use of single-lead / multi-lead mode is more tested, allowing to see that code is somewhat oldish. LINKS Side effect of Task ID 2056759 (remove crm.partner.binding mixin) Side effect of Task ID 2088565 (crm onchange -> compute) Community PR #43127 Enterprise PR odoo/enterprise#7656 --- addons/crm/tests/__init__.py | 4 +- addons/crm/tests/customer_request.eml | 30 ---- ...pportunity.py => test_crm_lead_convert.py} | 157 ++++++++++++++++-- ...ation.py => test_crm_lead_notification.py} | 0 4 files changed, 146 insertions(+), 45 deletions(-) delete mode 100644 addons/crm/tests/customer_request.eml rename addons/crm/tests/{test_lead2opportunity.py => test_crm_lead_convert.py} (53%) rename addons/crm/tests/{test_new_lead_notification.py => test_crm_lead_notification.py} (100%) diff --git a/addons/crm/tests/__init__.py b/addons/crm/tests/__init__.py index 2897d0b277f..dfcb9be62a3 100644 --- a/addons/crm/tests/__init__.py +++ b/addons/crm/tests/__init__.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from . import test_crm_lead -from . import test_new_lead_notification -from . import test_lead2opportunity +from . import test_crm_lead_notification +from . import test_crm_lead_convert from . import test_crm_activity from . import test_crm_ui from . import test_crm_pls diff --git a/addons/crm/tests/customer_request.eml b/addons/crm/tests/customer_request.eml deleted file mode 100644 index 2c6c5e8110d..00000000000 --- a/addons/crm/tests/customer_request.eml +++ /dev/null @@ -1,30 +0,0 @@ -Return-Path: -X-Original-To: info@customer.com -Delivered-To: sales@my.com -Received: by mail.my.com (Postfix, from userid xxx) - id 822ECBFB67; Mon, 24 Oct 2011 07:36:51 +0200 (CEST) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.my.com -X-Spam-Level: -X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=ham - version=3.3.1 -Received: from [192.168.1.146] - (Authenticated sender: info@mail.customer.com) - by mail.customer.com (Postfix) with ESMTPSA id 07A30BFAB4 - for ; Mon, 24 Oct 2011 07:36:50 +0200 (CEST) -Message-ID: <4EA4F95D.904@customer.com> -Date: Mon, 24 Oct 2011 11:06:29 +0530 -From: Mr. John Right -User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8 -MIME-Version: 1.0 -To: sales@my.com -Subject: Fournir votre devis avec le meilleur prix. -Content-Type: text/plain; charset=ISO-8859-1; format=flowed -Content-Transfer-Encoding: 8bit - -Bonjour l'équipe de vente, - -Je veux acheter vos produits et services. - -S'il vous plaît fournir votre cotation avec le meilleur prix. - -Merci diff --git a/addons/crm/tests/test_lead2opportunity.py b/addons/crm/tests/test_crm_lead_convert.py similarity index 53% rename from addons/crm/tests/test_lead2opportunity.py rename to addons/crm/tests/test_crm_lead_convert.py index 8e69b2a4a4d..c4f85fd6f1e 100644 --- a/addons/crm/tests/test_lead2opportunity.py +++ b/addons/crm/tests/test_crm_lead_convert.py @@ -1,13 +1,144 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. -from .common import TestCrmCommon +from unittest.mock import patch + +from odoo.addons.crm.tests.common import TestCrmCommon +from odoo.fields import Datetime +from odoo.tests.common import tagged, users -class TestLead2opportunity2win(TestCrmCommon): +@tagged('lead_manage') +class TestLeadConvertCommon(TestCrmCommon): + + @classmethod + def setUpClass(cls): + super(TestLeadConvertCommon, cls).setUpClass() + + cls.sales_team_convert = cls.env['crm.team'].create({ + 'name': 'Convert Sales Team', + 'alias_name': False, + 'use_leads': True, + 'use_opportunities': True, + 'company_id': False, + 'user_id': cls.user_sales_manager.id, + 'member_ids': [(4, cls.user_sales_salesman.id)], + }) + cls.lead_1.write({'date_open': Datetime.from_string('2020-01-15 11:30:00')}) + + cls.crm_lead_dt_patcher = patch('odoo.addons.crm.models.crm_lead.fields.Datetime', wraps=Datetime) + cls.crm_lead_dt_mock = cls.crm_lead_dt_patcher.start() + + @classmethod + def tearDownClass(cls): + cls.crm_lead_dt_patcher.stop() + super(TestLeadConvertCommon, cls).tearDownClass() + + def create_duplicates(self): + self.lead_1_dup1 = self.env['crm.lead'].create({ + 'name': 'Duplicate1', + 'type': 'lead', + 'user_id': False, + 'team_id': self.lead_1.team_id.id, + 'contact_name': 'Amy Wong Duplicate', + 'email_from': self.lead_1.email_from, + }) + self.lead_1_dup2 = self.env['crm.lead'].create({ + 'name': 'Duplicate2', + 'type': 'lead', + 'user_id': False, + 'team_id': self.lead_1.team_id.id, + 'contact_name': 'Amy Wong Duplicate Two', + 'email_from': self.lead_1.email_from, + }) + + +class TestLeadConvert(TestLeadConvertCommon): + + @users('user_sales_manager') + def test_lead_convert_convert(self): + date = Datetime.from_string('2020-01-20 16:00:00') + self.crm_lead_dt_mock.now.return_value = date + + self.assertFalse(self.lead_1.date_conversion) + self.assertEqual(self.lead_1.date_open, Datetime.from_string('2020-01-15 11:30:00')) + + convert = self.env['crm.lead2opportunity.partner'].with_context({ + 'active_model': 'crm.lead', + 'active_id': self.lead_1.id, + 'active_ids': self.lead_1.ids, + }).create({}) + + # test internals of convert wizard + # self.assertEqual(convert.lead_id, self.lead_1) + self.assertEqual(convert.user_id, self.lead_1.user_id) + self.assertEqual(convert.team_id, self.lead_1.team_id) + self.assertFalse(convert.partner_id) + self.assertEqual(convert.name, 'convert') + self.assertEqual(convert.action, 'create') + + convert.write({'user_id': self.user_sales_salesman.id}) + convert._onchange_user() + self.assertEqual(convert.user_id, self.user_sales_salesman) + self.assertEqual(convert.team_id, self.sales_team_convert) + + convert.action_apply() + self.assertEqual(self.lead_1.type, 'opportunity') + + @users('user_sales_manager') + def test_lead_convert_merge(self): + self.create_duplicates() + date = Datetime.from_string('2020-01-20 16:00:00') + self.crm_lead_dt_mock.now.return_value = date + + self.assertFalse(self.lead_1.date_conversion) + self.assertEqual(self.lead_1.date_open, Datetime.from_string('2020-01-15 11:30:00')) + + convert = self.env['crm.lead2opportunity.partner'].with_context({ + 'active_model': 'crm.lead', + 'active_id': self.lead_1.id, + 'active_ids': self.lead_1.ids, + }).create({}) + + # test internals of convert wizard + self.assertEqual(convert.opportunity_ids, self.lead_1 | self.lead_1_dup1 | self.lead_1_dup2) + self.assertEqual(convert.user_id, self.lead_1.user_id) + self.assertEqual(convert.team_id, self.lead_1.team_id) + self.assertFalse(convert.partner_id) + self.assertEqual(convert.name, 'merge') + self.assertEqual(convert.action, 'create') + + convert.write({'user_id': self.user_sales_salesman.id}) + convert._onchange_user() + self.assertEqual(convert.user_id, self.user_sales_salesman) + self.assertEqual(convert.team_id, self.sales_team_convert) + + convert.action_apply() + self.assertEqual(self.lead_1.type, 'opportunity') + + @users('user_sales_manager') + def test_lead_convert_various(self): + self.lead_1.write({'contact_name': False}) + + convert = self.env['crm.lead2opportunity.partner'].with_context({ + 'active_model': 'crm.lead', + 'active_id': self.lead_1.id, + }).create({}) + self.assertEqual(convert.action, 'nothing') + + self.lead_1.write({'partner_id': self.contact_1.id}) + + convert = self.env['crm.lead2opportunity.partner'].with_context({ + 'active_model': 'crm.lead', + 'active_id': self.lead_1.id, + }).create({}) + self.assertEqual(convert.action, 'exist') + + +class TestLeadConvertMass(TestLeadConvertCommon): def test_lead2opportunity2win(self): """ Tests for Test Lead 2 opportunity 2 win """ - CrmLead2OpportunityPartnerMass = self.env['crm.lead2opportunity.partner.mass'] default_stage_id = self.stage_gen_1.id crm_case_2 = self.env['crm.lead'].create({ @@ -40,14 +171,12 @@ class TestLead2opportunity2win(TestCrmCommon): self.assertEqual(crm_case_3.partner_id.id, self.contact_2.id, 'Partner mismatch!') self.assertEqual(crm_case_3.stage_id.id, default_stage_id, 'Stage of opportunity is incorrect!') - # Now I schedule meeting with customer. - crm_case_3.action_schedule_meeting() - - # After communicated with customer, I put some notes with contract details. - crm_case_3.message_post(subject='Test note', body='Détails envoyés par le client sur ​​le FAX pour la qualité') - # I convert mass lead into opportunity customer. - mass = CrmLead2OpportunityPartnerMass.with_user(self.user_sales_manager).with_context({'active_model': 'crm.lead', 'active_ids': [crm_case_13.id, crm_case_2.id], 'active_id': crm_case_13.id}).create({ + mass = self.env['crm.lead2opportunity.partner.mass'].with_user(self.user_sales_manager).with_context({ + 'active_model': 'crm.lead', + 'active_ids': [crm_case_13.id, crm_case_2.id], + 'active_id': crm_case_13.id} + ).create({ 'user_ids': [(6, 0, self.env.ref('base.user_root').ids)], 'team_id': self.env.ref("sales_team.team_sales_department").id }) @@ -73,7 +202,6 @@ class TestLead2opportunity2win(TestCrmCommon): def test_lead2opportunity_assign_salesmen(self): """ Tests for Test Lead2opportunity Assign Salesmen """ - CrmLead2OpportunityPartnerMass = self.env['crm.lead2opportunity.partner.mass'] LeadSaleman = self.env['crm.lead'].with_user(self.user_sales_manager) default_stage_id = self.stage_gen_1.id @@ -137,8 +265,11 @@ class TestLead2opportunity2win(TestCrmCommon): salesmen_ids = [test_res_user_01.id, test_res_user_02.id, test_res_user_03.id, test_res_user_04.id] # Salesman create a mass convert wizard and convert all the leads. - additionnal_context = {'active_model': 'crm.lead', 'active_ids': lead_ids, 'active_id': test_crm_lead_01.id} - mass = CrmLead2OpportunityPartnerMass.with_user(self.user_sales_manager).with_context(**additionnal_context).create({ + mass = self.env['crm.lead2opportunity.partner.mass'].with_user(self.user_sales_manager).with_context({ + 'active_model': 'crm.lead', + 'active_ids': lead_ids, + 'active_id': test_crm_lead_01.id} + ).create({ 'user_ids': [(6, 0, salesmen_ids)], 'team_id': self.env.ref("sales_team.team_sales_department").id, 'deduplicate': False, diff --git a/addons/crm/tests/test_new_lead_notification.py b/addons/crm/tests/test_crm_lead_notification.py similarity index 100% rename from addons/crm/tests/test_new_lead_notification.py rename to addons/crm/tests/test_crm_lead_notification.py