diff options
Diffstat (limited to 'addons/crm/tests/test_crm_lead_convert_mass.py')
| -rw-r--r-- | addons/crm/tests/test_crm_lead_convert_mass.py | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/addons/crm/tests/test_crm_lead_convert_mass.py b/addons/crm/tests/test_crm_lead_convert_mass.py new file mode 100644 index 00000000..bee86106 --- /dev/null +++ b/addons/crm/tests/test_crm_lead_convert_mass.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.crm.tests import common as crm_common +from odoo.tests.common import tagged, users + + +@tagged('lead_manage', 'crm_performance') +class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): + + @classmethod + def setUpClass(cls): + super(TestLeadConvertMass, cls).setUpClass() + + cls.leads = cls.lead_1 + cls.lead_w_partner + cls.lead_w_email_lost + cls.assign_users = cls.user_sales_manager + cls.user_sales_leads_convert + cls.user_sales_salesman + + @users('user_sales_manager') + def test_assignment_salesmen(self): + test_leads = self._create_leads_batch(count=50, user_ids=[False]) + user_ids = self.assign_users.ids + self.assertEqual(test_leads.user_id, self.env['res.users']) + + with self.assertQueryCount(user_sales_manager=0): + test_leads = self.env['crm.lead'].browse(test_leads.ids) + + with self.assertQueryCount(user_sales_manager=254): # often 251, sometimes +3 on runbot + test_leads.handle_salesmen_assignment(user_ids=user_ids, team_id=False) + + self.assertEqual(test_leads.team_id, self.sales_team_convert | self.sales_team_1) + self.assertEqual(test_leads[0::3].user_id, self.user_sales_manager) + self.assertEqual(test_leads[1::3].user_id, self.user_sales_leads_convert) + self.assertEqual(test_leads[2::3].user_id, self.user_sales_salesman) + + @users('user_sales_manager') + def test_assignment_salesmen_wteam(self): + test_leads = self._create_leads_batch(count=50, user_ids=[False]) + user_ids = self.assign_users.ids + team_id = self.sales_team_convert.id + self.assertEqual(test_leads.user_id, self.env['res.users']) + + with self.assertQueryCount(user_sales_manager=0): + test_leads = self.env['crm.lead'].browse(test_leads.ids) + + with self.assertQueryCount(user_sales_manager=221): # crm only: 215 - generally 218, sometimes +2/+3 on runbot + test_leads.handle_salesmen_assignment(user_ids=user_ids, team_id=team_id) + + self.assertEqual(test_leads.team_id, self.sales_team_convert) + self.assertEqual(test_leads[0::3].user_id, self.user_sales_manager) + self.assertEqual(test_leads[1::3].user_id, self.user_sales_leads_convert) + self.assertEqual(test_leads[2::3].user_id, self.user_sales_salesman) + + @users('user_sales_manager') + def test_mass_convert_internals(self): + """ Test internals mass converted in convert mode, without duplicate management """ + # reset some assigned users to test salesmen assign + (self.lead_w_partner | self.lead_w_email_lost).write({ + 'user_id': False + }) + + mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ + 'active_model': 'crm.lead', + 'active_ids': self.leads.ids, + 'active_id': self.leads.ids[0] + }).create({ + 'deduplicate': False, + 'user_id': self.user_sales_salesman.id, + 'force_assignment': False, + }) + + # default values + self.assertEqual(mass_convert.name, 'convert') + self.assertEqual(mass_convert.action, 'each_exist_or_create') + # depending on options + self.assertEqual(mass_convert.partner_id, self.env['res.partner']) + self.assertEqual(mass_convert.deduplicate, False) + self.assertEqual(mass_convert.user_id, self.user_sales_salesman) + self.assertEqual(mass_convert.team_id, self.sales_team_convert) + + mass_convert.action_mass_convert() + for lead in self.lead_1 | self.lead_w_partner: + self.assertEqual(lead.type, 'opportunity') + if lead == self.lead_w_partner: + self.assertEqual(lead.user_id, self.env['res.users']) # user_id is bypassed + self.assertEqual(lead.partner_id, self.contact_1) + elif lead == self.lead_1: + self.assertEqual(lead.user_id, self.user_sales_leads) # existing value not forced + new_partner = lead.partner_id + self.assertEqual(new_partner.name, 'Amy Wong') + self.assertEqual(new_partner.email, 'amy.wong@test.example.com') + + # test unforced assignation + mass_convert.write({ + 'user_ids': self.user_sales_salesman.ids, + }) + mass_convert.action_mass_convert() + self.assertEqual(self.lead_w_partner.user_id, self.user_sales_salesman) + self.assertEqual(self.lead_1.user_id, self.user_sales_leads) # existing value not forced + + # lost leads are untouched + self.assertEqual(self.lead_w_email_lost.type, 'lead') + self.assertFalse(self.lead_w_email_lost.active) + self.assertFalse(self.lead_w_email_lost.date_conversion) + # TDE FIXME: partner creation is done even on lost leads because not checked in wizard + # self.assertEqual(self.lead_w_email_lost.partner_id, self.env['res.partner']) + + @users('user_sales_manager') + def test_mass_convert_deduplicate(self): + """ Test duplicated_lead_ids fields having another behavior in mass convert + because why not. Its use is: among leads under convert, store those with + duplicates if deduplicate is set to True. """ + lead_1_dups = self._create_duplicates(self.lead_1, create_opp=False) + lead_1_final = self.lead_1 # after merge: same but with lower ID + + lead_w_partner_dups = self._create_duplicates(self.lead_w_partner, create_opp=False) + lead_w_partner_final = lead_w_partner_dups[0] # lead_w_partner has no stage -> lower in sort by confidence + lead_w_partner_dups_partner = lead_w_partner_dups[1] # copy with a partner_id (with the same email) + + mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ + 'active_model': 'crm.lead', + 'active_ids': self.leads.ids, + }).create({ + 'deduplicate': True, + }) + self.assertEqual(mass_convert.action, 'each_exist_or_create') + self.assertEqual(mass_convert.name, 'convert') + self.assertEqual(mass_convert.lead_tomerge_ids, self.leads) + self.assertEqual(mass_convert.duplicated_lead_ids, self.lead_1 | self.lead_w_partner) + + mass_convert.action_mass_convert() + + self.assertEqual( + (lead_1_dups | lead_w_partner_dups | lead_w_partner_dups_partner).exists(), + lead_w_partner_final + ) + for lead in lead_1_final | lead_w_partner_final: + self.assertTrue(lead.active) + self.assertEqual(lead.type, 'opportunity') + + @users('user_sales_manager') + def test_mass_convert_find_existing(self): + """ Check that we don't find a wrong partner + that have similar name during mass conversion + """ + wrong_partner = self.env['res.partner'].create({ + 'name': 'casa depapel', + 'street': "wrong street" + }) + + lead = self.env['crm.lead'].create({'name': 'Asa Depape'}) + mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ + 'active_model': 'crm.lead', + 'active_ids': lead.ids, + 'active_id': lead.ids[0] + }).create({ + 'deduplicate': False, + 'action': 'each_exist_or_create', + 'name': 'convert', + }) + mass_convert.action_mass_convert() + + self.assertNotEqual(lead.partner_id, wrong_partner, "Partner Id should not match the wrong contact") + + @users('user_sales_manager') + def test_mass_convert_performances(self): + test_leads = self._create_leads_batch(count=50, user_ids=[False]) + user_ids = self.assign_users.ids + + with self.assertQueryCount(user_sales_manager=1361): # still some randomness (1360 spotted) - crm only: 1352 + mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ + 'active_model': 'crm.lead', + 'active_ids': test_leads.ids, + }).create({ + 'deduplicate': True, + 'user_ids': user_ids, + 'force_assignment': True, + }) + mass_convert.action_mass_convert() + + self.assertEqual(set(test_leads.mapped('type')), set(['opportunity'])) + self.assertEqual(len(test_leads.partner_id), len(test_leads)) + # TDE FIXME: strange + # self.assertEqual(test_leads.team_id, self.sales_team_convert | self.sales_team_1) + self.assertEqual(test_leads.team_id, self.sales_team_1) + self.assertEqual(test_leads[0::3].user_id, self.user_sales_manager) + self.assertEqual(test_leads[1::3].user_id, self.user_sales_leads_convert) + self.assertEqual(test_leads[2::3].user_id, self.user_sales_salesman) + + @users('user_sales_manager') + def test_mass_convert_w_salesmen(self): + # reset some assigned users to test salesmen assign + (self.lead_w_partner | self.lead_w_email_lost).write({ + 'user_id': False + }) + + mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ + 'active_model': 'crm.lead', + 'active_ids': self.leads.ids, + 'active_id': self.leads.ids[0] + }).create({ + 'deduplicate': False, + 'user_ids': self.assign_users.ids, + 'force_assignment': True, + }) + + # TDE FIXME: what happens if we mix people from different sales team ? currently nothing, to check + mass_convert.action_mass_convert() + + for idx, lead in enumerate(self.leads - self.lead_w_email_lost): + self.assertEqual(lead.type, 'opportunity') + assigned_user = self.assign_users[idx % len(self.assign_users)] + self.assertEqual(lead.user_id, assigned_user) |
