mirror of
https://github.com/bringout/oca-ocb-crm.git
synced 2026-04-22 09:12:08 +02:00
229 lines
12 KiB
Python
229 lines
12 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import Command
|
|
from odoo.addons.crm_livechat.tests import chatbot_common
|
|
from odoo.tests.common import tagged
|
|
|
|
|
|
@tagged("post_install", "-at_install")
|
|
class CrmChatbotCase(chatbot_common.CrmChatbotCase):
|
|
|
|
def test_chatbot_create_lead_public_user(self):
|
|
self._play_session_with_lead()
|
|
|
|
created_lead = self.env['crm.lead'].sudo().search([], limit=1, order='id desc')
|
|
self.assertEqual(created_lead.name, "Testing Bot's New Lead")
|
|
self.assertEqual(created_lead.email_from, 'test2@example.com')
|
|
self.assertEqual(created_lead.phone, '123456')
|
|
|
|
self.assertEqual(created_lead.team_id, self.sale_team)
|
|
self.assertEqual(created_lead.type, 'opportunity')
|
|
|
|
def test_chatbot_create_lead_and_forward_public_user(self):
|
|
"""Test create_lead_and_forward properly creates a lead, assigns it to an available sales
|
|
team member, and forwards the discussion to that member."""
|
|
self.step_create_lead.sudo().step_type = "create_lead_and_forward"
|
|
discuss_channel = self._play_session_with_lead()
|
|
not_available_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertEqual(not_available_lead.name, "Testing Bot's New Lead")
|
|
self.assertEqual(not_available_lead.email_from, "test2@example.com")
|
|
self.assertEqual(not_available_lead.phone, "123456")
|
|
self.assertEqual(not_available_lead.team_id, self.sale_team)
|
|
self.assertEqual(not_available_lead.type, "opportunity")
|
|
chatbot_partner = self.chatbot_script.operator_partner_id
|
|
# sales team member is not available
|
|
self.assertFalse(not_available_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
# sales team member is available
|
|
self.env["mail.presence"]._update_presence(self.user_employee)
|
|
discuss_channel = self._play_session_with_lead()
|
|
assigned_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertEqual(assigned_lead.user_id, self.user_employee)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, self.partner_employee)
|
|
# sales team member quota is reached (lead already assigned before)
|
|
discuss_channel = self._play_session_with_lead()
|
|
quota_reached_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertFalse(quota_reached_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
assigned_lead.unlink()
|
|
# sales team member opt out
|
|
self.sale_team.crm_team_member_ids.assignment_optout = True
|
|
discuss_channel = self._play_session_with_lead()
|
|
optout_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertFalse(optout_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
self.sale_team.crm_team_member_ids.assignment_optout = False
|
|
# sales team member invalid domain (probability of lead is 5.39)
|
|
self.sale_team.crm_team_member_ids.assignment_domain = "[('probability', '>=', 20)]"
|
|
discuss_channel = self._play_session_with_lead()
|
|
non_matching_domain_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertFalse(non_matching_domain_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
self.sale_team.crm_team_member_ids.assignment_domain = False
|
|
# auto-assign team
|
|
self.step_create_lead.crm_team_id = False
|
|
discuss_channel = self._play_session_with_lead()
|
|
auto_team_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertEqual(auto_team_lead.user_id, self.user_employee)
|
|
self.assertEqual(auto_team_lead.team_id, self.sale_team)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, self.partner_employee)
|
|
auto_team_lead.unlink()
|
|
# sales team opt out
|
|
self.sale_team.assignment_optout = True
|
|
discuss_channel = self._play_session_with_lead()
|
|
team_optout_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertFalse(team_optout_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
self.sale_team.assignment_optout = False
|
|
# sales team invalid domain (probability of lead is 5.39)
|
|
self.sale_team.assignment_domain = "[('probability', '>=', 20)]"
|
|
discuss_channel = self._play_session_with_lead()
|
|
team_non_matching_domain_lead = self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
self.assertFalse(team_non_matching_domain_lead.user_id)
|
|
self.assertEqual(discuss_channel.livechat_operator_id, chatbot_partner)
|
|
|
|
def test_chatbot_create_lead_portal_user(self):
|
|
self.authenticate(self.user_portal.login, self.user_portal.login)
|
|
self.step_create_lead.write({'crm_team_id': self.sale_team_with_lead})
|
|
self._play_session_with_lead()
|
|
|
|
created_lead = self.env['crm.lead'].sudo().search([], limit=1, order='id desc')
|
|
self.assertEqual(created_lead.name, "Testing Bot's New Lead")
|
|
self.assertNotEqual(created_lead.email_from, 'test2@example.com', "User's email should'nt have been overridden")
|
|
self.assertEqual(created_lead.phone, '123456', "User's phone should have been updated")
|
|
|
|
self.assertEqual(created_lead.team_id, self.sale_team_with_lead)
|
|
self.assertEqual(created_lead.type, 'lead')
|
|
|
|
def test_chatbot_create_lead_company(self):
|
|
self.user_portal.write({"company_ids": self.company_2, "company_id": self.company_2})
|
|
team = self.sale_team_with_lead
|
|
partner = self.user_portal.partner_id
|
|
self.step_create_lead.crm_team_id = team
|
|
self.authenticate(self.user_portal.login, self.user_portal.login)
|
|
|
|
def play_script_and_get_created_lead():
|
|
self.env["crm.lead"].search([]).unlink()
|
|
self._play_session_with_lead()
|
|
return self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
|
|
# lead has company of partner and no team if no company matching
|
|
partner.company_id = self.company_2
|
|
team.company_id = self.company_3
|
|
lead = play_script_and_get_created_lead()
|
|
self.assertEqual(lead.company_id, self.company_2)
|
|
self.assertFalse(lead.team_id)
|
|
# lead has common company of partner and team if both are matching
|
|
partner.company_id = self.company_2
|
|
team.company_id = self.company_2
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has team company if partner has no company
|
|
partner.company_id = False
|
|
team.company_id = self.company_2
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has partner company if team has no company
|
|
partner.company_id = self.company_2
|
|
team.company_id = False
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has no company if no company on partner and team
|
|
partner.company_id = False
|
|
team.company_id = False
|
|
self.assertFalse(play_script_and_get_created_lead().company_id)
|
|
|
|
def test_chatbot_create_lead_and_forward_company(self):
|
|
self.step_create_lead.sudo().step_type = "create_lead_and_forward"
|
|
self.user_portal.write({"company_ids": self.company_2.ids, "company_id": self.company_2.id})
|
|
self.user_employee.write({"company_ids": self.company_3.ids, "company_id": self.company_3.id})
|
|
self.user_employee.partner_id.company_id = self.company_3
|
|
teams = self.sale_team_with_lead + self.sale_team
|
|
partner = self.user_portal.partner_id
|
|
self.authenticate(self.user_portal.login, self.user_portal.login)
|
|
|
|
def play_script_and_get_created_lead():
|
|
self.env["crm.lead"].search([]).unlink()
|
|
self._play_session_with_lead()
|
|
return self.env["crm.lead"].sudo().search([], limit=1, order="id desc")
|
|
|
|
# lead has company of partner and no team if no company matching
|
|
partner.company_id = self.company_2
|
|
teams.company_id = self.company_3
|
|
lead = play_script_and_get_created_lead()
|
|
self.assertEqual(lead.company_id, self.company_2)
|
|
self.assertFalse(lead.team_id)
|
|
# lead has common company of partner and team if both are matching
|
|
self.user_employee.write({"company_ids": self.company_2.ids, "company_id": self.company_2.id})
|
|
self.user_employee.partner_id.company_id = self.company_2
|
|
partner.company_id = self.company_2
|
|
teams.company_id = self.company_2
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has team company if partner has no company
|
|
partner.company_id = False
|
|
teams.company_id = self.company_2
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has partner company if team has no company
|
|
partner.company_id = self.company_2
|
|
teams.company_id = False
|
|
self.assertEqual(play_script_and_get_created_lead().company_id, self.company_2)
|
|
# lead has no company if no company on partner and team
|
|
partner.company_id = False
|
|
teams.company_id = False
|
|
self.assertFalse(play_script_and_get_created_lead().company_id)
|
|
|
|
def _play_session_with_lead(self):
|
|
data = self.make_jsonrpc_request("/im_livechat/get_session", {
|
|
'channel_id': self.livechat_channel.id,
|
|
'chatbot_script_id': self.chatbot_script.id,
|
|
})
|
|
discuss_channel = (
|
|
self.env["discuss.channel"].sudo().browse(data["channel_id"])
|
|
)
|
|
self._post_answer_and_trigger_next_step(
|
|
discuss_channel, chatbot_script_answer=self.step_dispatch_create_lead
|
|
)
|
|
self.assertEqual(discuss_channel.chatbot_current_step_id, self.step_create_lead_email)
|
|
self._post_answer_and_trigger_next_step(discuss_channel, email="test2@example.com")
|
|
self.assertEqual(discuss_channel.chatbot_current_step_id, self.step_create_lead_phone)
|
|
self._post_answer_and_trigger_next_step(discuss_channel, '123456')
|
|
self.assertEqual(discuss_channel.chatbot_current_step_id, self.step_create_lead)
|
|
return discuss_channel
|
|
|
|
def test_create_lead_from_chatbot(self):
|
|
chatbot_script = self.env["chatbot.script"].create({"title": "Create lead bot"})
|
|
self.env["chatbot.script.step"].create(
|
|
[
|
|
{
|
|
"chatbot_script_id": chatbot_script.id,
|
|
"message": "Hello, how can I help you?",
|
|
"step_type": "free_input_single",
|
|
},
|
|
{
|
|
"step_type": "question_email",
|
|
"chatbot_script_id": chatbot_script.id,
|
|
"message": "Would you mind leaving your email address so that we can reach you back?",
|
|
},
|
|
{
|
|
"step_type": "create_lead",
|
|
"chatbot_script_id": chatbot_script.id,
|
|
"message": "Thank you, you should hear back from us very soon!",
|
|
},
|
|
]
|
|
)
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Create lead channel",
|
|
"rule_ids": [
|
|
Command.create(
|
|
{
|
|
"regex_url": "/",
|
|
"chatbot_script_id": chatbot_script.id,
|
|
}
|
|
)
|
|
],
|
|
}
|
|
)
|
|
self.start_tour(
|
|
f"/im_livechat/support/{livechat_channel.id}", "crm_livechat.create_lead_from_chatbot"
|
|
)
|
|
lead = self.env["crm.lead"].search([("origin_channel_id", "=", livechat_channel.channel_ids.id)])
|
|
self.assertEqual(lead.name, "I'd like to know more about the CRM application.")
|
|
self.assertTrue(lead.origin_channel_id.has_crm_lead)
|