File: test_crm_lead.py

package info (click to toggle)
oca-core 11.0.20180730-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 509,684 kB
  • sloc: xml: 258,806; python: 164,081; sql: 217; sh: 92; makefile: 16
file content (180 lines) | stat: -rw-r--r-- 10,323 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from .common import TestCrmCases
from odoo.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)