flectra/addons/crm/tests/test_crm_lead.py

181 lines
10 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2018-01-16 11:34:37 +01:00
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
from .common import TestCrmCases
2018-01-16 11:34:37 +01:00
from flectra.modules.module import get_module_resource
class TestCRMLead(TestCrmCases):
def test_crm_lead_cancel(self):
# I set a new sales team giving access rights of salesman.
team = self.env['crm.team'].sudo(self.crm_salemanager.id).create({'name': "Phone Marketing"})
lead = self.env.ref('crm.crm_case_1')
lead.sudo(self.crm_salemanager.id).write({'team_id': team.id})
# Salesmananger check unqualified lead
self.assertEqual(lead.stage_id.sequence, 1, 'Lead is in new stage')
def test_crm_lead_copy(self):
# I make duplicate the Lead
self.env.ref('crm.crm_case_4').copy()
def test_crm_lead_unlink(self):
# Only Sales manager Unlink the Lead so test with Manager's access rights
self.env.ref('crm.crm_case_4').sudo(self.crm_salemanager.id).unlink()
def test_find_stage(self):
# I create a new lead
lead = self.env['crm.lead'].create({
'type': "lead",
'name': "Test lead new",
'partner_id': self.env.ref("base.res_partner_1").id,
'description': "This is the description of the test new lead.",
'team_id': self.env.ref("sales_team.team_sales_department").id
})
# I change type from lead to opportunity
lead.convert_opportunity(self.env.ref("base.res_partner_2").id)
# I check default stage of opportunity
self.assertLessEqual(lead.stage_id.sequence, 1, "Default stage of lead is incorrect!")
# Now I change the stage of opportunity to won.
lead.action_set_won()
# I check stage of opp should won, after change stage.
stage_id = lead._stage_find(domain=[('probability', '=', 100.0)])
self.assertEqual(stage_id, lead.stage_id, "Stage of opportunity is incorrect!")
def test_crm_lead_message(self):
# Give the access rights of Salesman to communicate with customer
# Customer interested in our product, so he sends request by email to get more details.
# Mail script will fetch his request from mail server. Then I process that mail after read EML file.
request_file = open(get_module_resource('crm', 'tests', 'customer_request.eml'), 'rb')
request_message = request_file.read()
self.env['mail.thread'].sudo(self.crm_salesman).message_process('crm.lead', request_message)
# After getting the mail, I check details of new lead of that customer
lead = self.env['crm.lead'].sudo(self.crm_salesman).search([('email_from', '=', 'Mr. John Right <info@customer.com>')], limit=1)
self.assertTrue(lead.ids, 'Fail to create merge opportunity wizard')
self.assertFalse(lead.partner_id, 'Customer should be a new one')
self.assertEqual(lead.name, 'Fournir votre devis avec le meilleur prix.', 'Subject does not match')
# I reply his request with welcome message.
# TODO revert mail.mail to mail.compose.message (conversion to customer should be automatic).
lead = self.env['crm.lead'].search([('email_from', '=', 'Mr. John Right <info@customer.com>')], limit=1)
mail = self.env['mail.compose.message'].with_context(active_model='crm.lead', active_id=lead.id).create({
'body': "Merci de votre intérêt pour notre produit, nous vous contacterons bientôt. Bien à vous",
'email_from': 'sales@mycompany.com'
})
try:
mail.send_mail()
except:
pass
# Now, I convert him into customer and put him into regular customer list
lead = self.env['crm.lead'].search([('email_from', '=', 'Mr. John Right <info@customer.com>')], limit=1)
lead.handle_partner_assignation()
def test_crm_lead_merge(self):
# During a mixed merge (involving leads and opps), data should be handled a certain way following their type (m2o, m2m, text, ...) Start by creating two leads and an opp and giving the rights of Sales manager.
default_stage_id = self.ref("crm.stage_lead1")
LeadSalesmanager = self.env['crm.lead'].sudo(self.crm_salemanager.id)
# TEST CASE 1
test_crm_opp_01 = LeadSalesmanager.create({
'type': 'opportunity',
'name': 'Test opportunity 1',
'partner_id': self.env.ref("base.res_partner_3").id,
'stage_id': default_stage_id,
'description': 'This is the description of the test opp 1.'
})
test_crm_lead_01 = LeadSalesmanager.create({
'type': 'lead',
'name': 'Test lead first',
'partner_id': self.env.ref("base.res_partner_1").id,
'stage_id': default_stage_id,
'description': 'This is the description of the test lead first.'
})
test_crm_lead_02 = LeadSalesmanager.create({
'type': 'lead',
'name': 'Test lead second',
'partner_id': self.env.ref("base.res_partner_1").id,
'stage_id': default_stage_id,
'description': 'This is the description of the test lead second.'
})
lead_ids = [test_crm_opp_01.id, test_crm_lead_01.id, test_crm_lead_02.id]
additionnal_context = {'active_model': 'crm.lead', 'active_ids': lead_ids, 'active_id': lead_ids[0]}
# I create a merge wizard and merge the leads and opp together in the first item of the list.
merge_opp_wizard_01 = self.env['crm.merge.opportunity'].sudo(self.crm_salemanager.id).with_context(**additionnal_context).create({})
merge_opp_wizard_01.action_merge()
# I check for the resulting merged opp (based on name and partner)
merged_lead = self.env['crm.lead'].search([('name', '=', 'Test opportunity 1'), ('partner_id', '=', self.env.ref("base.res_partner_3").id)], limit=1)
self.assertTrue(merged_lead, 'Fail to create merge opportunity wizard')
self.assertEqual(merged_lead.description, 'This is the description of the test opp 1.\n\nThis is the description of the test lead first.\n\nThis is the description of the test lead second.', 'Description mismatch: when merging leads/opps with different text values, these values should get concatenated and separated with line returns')
self.assertEqual(merged_lead.type, 'opportunity', 'Type mismatch: when at least one opp in involved in the merge, the result should be a new opp (instead of %s)' % merged_lead.type)
# The other (tailing) leads/opps shouldn't exist anymore
self.assertFalse(test_crm_lead_01.exists(), 'This tailing lead (id %s) should not exist anymore' % test_crm_lead_02.id)
self.assertFalse(test_crm_lead_02.exists(), 'This tailing opp (id %s) should not exist anymore' % test_crm_opp_01.id)
# TEST CASE 2
# I want to test leads merge. Start by creating two leads (with the same partner)
test_crm_lead_03 = LeadSalesmanager.create({
'type': 'lead',
'name': 'Test lead 3',
'partner_id': self.env.ref("base.res_partner_1").id,
'stage_id': default_stage_id
})
test_crm_lead_04 = LeadSalesmanager.create({
'type': 'lead',
'name': 'Test lead 4',
'partner_id': self.env.ref("base.res_partner_1").id,
'stage_id': default_stage_id
})
lead_ids = [test_crm_lead_03.id, test_crm_lead_04.id]
additionnal_context = {'active_model': 'crm.lead', 'active_ids': lead_ids, 'active_id': lead_ids[0]}
# I create a merge wizard and merge the leads together.
merge_opp_wizard_02 = self.env['crm.merge.opportunity'].sudo(self.crm_salemanager.id).with_context(**additionnal_context).create({})
merge_opp_wizard_02.action_merge()
# I check for the resulting merged lead (based on name and partner)
merged_lead = self.env['crm.lead'].search([('name', '=', 'Test lead 3'), ('partner_id', '=', self.env.ref("base.res_partner_1").id)], limit=1)
self.assertTrue(merged_lead, 'Fail to create merge opportunity wizard')
self.assertEqual(merged_lead.partner_id.id, self.env.ref("base.res_partner_1").id, 'Partner mismatch')
self.assertEqual(merged_lead.type, 'lead', 'Type mismatch: when leads get merged together, the result should be a new lead (instead of %s)' % merged_lead.type)
self.assertFalse(test_crm_lead_04.exists(), 'This tailing lead (id %s) should not exist anymore' % test_crm_lead_04.id)
# TEST CASE 3
# I want to test opps merge. Start by creating two opportunities (with the same partner).
test_crm_opp_02 = LeadSalesmanager.create({
'type': 'opportunity',
'name': 'Test opportunity 2',
'partner_id': self.env.ref("base.res_partner_3").id,
'stage_id': default_stage_id
})
test_crm_opp_03 = LeadSalesmanager.create({
'type': 'opportunity',
'name': 'Test opportunity 3',
'partner_id': self.env.ref("base.res_partner_3").id,
'stage_id': default_stage_id
})
opportunity_ids = [test_crm_opp_02.id, test_crm_opp_03.id]
additionnal_context = {'active_model': 'crm.lead', 'active_ids': opportunity_ids, 'active_id': opportunity_ids[0]}
# I create a merge wizard and merge the opps together.
merge_opp_wizard_03 = self.env['crm.merge.opportunity'].sudo(self.crm_salemanager.id).with_context(**additionnal_context).create({})
merge_opp_wizard_03.action_merge()
merged_opportunity = self.env['crm.lead'].search([('name', '=', 'Test opportunity 2'), ('partner_id', '=', self.env.ref("base.res_partner_3").id)], limit=1)
self.assertTrue(merged_opportunity, 'Fail to create merge opportunity wizard')
self.assertEqual(merged_opportunity.partner_id.id, self.env.ref("base.res_partner_3").id, 'Partner mismatch')
self.assertEqual(merged_opportunity.type, 'opportunity', 'Type mismatch: when opps get merged together, the result should be a new opp (instead of %s)' % merged_opportunity.type)
self.assertFalse(test_crm_opp_03.exists(), 'This tailing opp (id %s) should not exist anymore' % test_crm_opp_03.id)