210 lines
8.7 KiB
Python
210 lines
8.7 KiB
Python
import odoo
|
|
from odoo import Command
|
|
from odoo.tests import HttpCase
|
|
from odoo.tests.common import new_test_user
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
@odoo.tests.tagged("-at_install", "post_install")
|
|
class TestGetOperator(HttpCase):
|
|
def _create_operator(self, lang_code=None, country_code=None):
|
|
operator = new_test_user(self.env, login=f"operator_{lang_code or country_code}_{self.operator_id}")
|
|
operator.partner_id = self.env["res.partner"].create(
|
|
{
|
|
"name": f"Operator {lang_code or country_code}",
|
|
"lang": lang_code,
|
|
"country_id": self.env["res.country"].search([("code", "=", country_code)]).id
|
|
if country_code
|
|
else None,
|
|
}
|
|
)
|
|
self.env["bus.presence"].create({"user_id": operator.id, "status": "online"}) # Simulate online status
|
|
self.operator_id += 1
|
|
return operator
|
|
|
|
def _create_chat(self, livechat, operator, in_call=False):
|
|
channel = self.env["discuss.channel"].create(
|
|
{
|
|
"name": "Visitor 1",
|
|
"channel_type": "livechat",
|
|
"livechat_active": True,
|
|
"livechat_channel_id": livechat.id,
|
|
"livechat_operator_id": operator.partner_id.id,
|
|
"channel_member_ids": [Command.create({"partner_id": operator.partner_id.id})],
|
|
}
|
|
)
|
|
if in_call:
|
|
self.env["discuss.channel.rtc.session"].create(
|
|
{
|
|
"channel_id": channel.id,
|
|
"channel_member_id": self.env["discuss.channel.member"]
|
|
.search([["partner_id", "=", operator.partner_id.id], ["channel_id", "=", channel.id]])
|
|
.id,
|
|
}
|
|
)
|
|
return channel
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.operator_id = 0
|
|
self.env["res.lang"].with_context(active_test=False).search(
|
|
[("code", "in", ["fr_FR", "es_ES", "de_DE", "en_US"])]
|
|
).write({"active": True})
|
|
random_choice_patch = patch("random.choice", lambda arr: arr[0])
|
|
self.startPatcher(random_choice_patch)
|
|
|
|
def test_get_by_lang(self):
|
|
fr_operator = self._create_operator("fr_FR")
|
|
en_operator = self._create_operator("en_US")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [fr_operator.id, en_operator.id],
|
|
}
|
|
)
|
|
self.assertEqual(fr_operator, livechat_channel._get_operator(lang="fr_FR"))
|
|
self.assertEqual(en_operator, livechat_channel._get_operator(lang="en_US"))
|
|
|
|
def test_get_by_lang_no_operator_matching_lang(self):
|
|
fr_operator = self._create_operator("fr_FR")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [fr_operator.id],
|
|
}
|
|
)
|
|
self.assertEqual(fr_operator, livechat_channel._get_operator(lang="en_US"))
|
|
|
|
def test_get_by_country(self):
|
|
fr_operator = self._create_operator(country_code="FR")
|
|
en_operator = self._create_operator(country_code="US")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [fr_operator.id, en_operator.id],
|
|
}
|
|
)
|
|
self.assertEqual(
|
|
fr_operator,
|
|
livechat_channel._get_operator(country_id=self.env["res.country"].search([("code", "=", "FR")]).id),
|
|
)
|
|
self.assertEqual(
|
|
en_operator,
|
|
livechat_channel._get_operator(country_id=self.env["res.country"].search([("code", "=", "US")]).id),
|
|
)
|
|
|
|
def test_get_by_country_no_operator_matching_country(self):
|
|
fr_operator = self._create_operator(country_code="FR")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [fr_operator.id],
|
|
}
|
|
)
|
|
self.assertEqual(
|
|
fr_operator,
|
|
livechat_channel._get_operator(country_id=self.env["res.country"].search([("code", "=", "US")]).id),
|
|
)
|
|
|
|
def test_get_by_lang_and_country_prioritize_lang(self):
|
|
fr_operator = self._create_operator("fr_FR", "FR")
|
|
en_operator = self._create_operator("en_US", "US")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [fr_operator.id, en_operator.id],
|
|
}
|
|
)
|
|
self.assertEqual(
|
|
fr_operator,
|
|
livechat_channel._get_operator(
|
|
lang="fr_FR", country_id=self.env["res.country"].search([("code", "=", "US")]).id
|
|
),
|
|
)
|
|
self.assertEqual(
|
|
en_operator,
|
|
livechat_channel._get_operator(
|
|
lang="en_US", country_id=self.env["res.country"].search([("code", "=", "FR")]).id
|
|
),
|
|
)
|
|
|
|
def test_operator_in_call_no_more_than_two_chats(self):
|
|
first_operator = self._create_operator("fr_FR", "FR")
|
|
second_operator = self._create_operator("fr_FR", "FR")
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [first_operator.id, second_operator.id],
|
|
}
|
|
)
|
|
self._create_chat(livechat_channel, first_operator)
|
|
self._create_chat(livechat_channel, first_operator)
|
|
# Previous operator is not in a call so it should be available, even if
|
|
# he already has two ongoing chats.
|
|
self.assertEqual(
|
|
first_operator, livechat_channel._get_operator(previous_operator_id=first_operator.partner_id.id)
|
|
)
|
|
self._create_chat(livechat_channel, first_operator, in_call=True)
|
|
# Previous operator is in a call so it should not be available anymore.
|
|
self.assertEqual(
|
|
second_operator, livechat_channel._get_operator(previous_operator_id=first_operator.partner_id.id)
|
|
)
|
|
|
|
def test_priority_by_number_of_chat(self):
|
|
first_operator = self._create_operator()
|
|
second_operator = self._create_operator()
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [first_operator.id, second_operator.id],
|
|
}
|
|
)
|
|
self._create_chat(livechat_channel, first_operator)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self.assertEqual(first_operator, livechat_channel._get_operator())
|
|
|
|
def test_in_call_operator_not_prioritized(self):
|
|
first_operator = self._create_operator()
|
|
second_operator = self._create_operator()
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [first_operator.id, second_operator.id],
|
|
}
|
|
)
|
|
self._create_chat(livechat_channel, first_operator, in_call=True)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self.assertEqual(second_operator, livechat_channel._get_operator())
|
|
|
|
def test_priority_by_number_of_chat_with_call_limit_not_exceeded(self):
|
|
first_operator = self._create_operator()
|
|
second_operator = self._create_operator()
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [first_operator.id, second_operator.id],
|
|
}
|
|
)
|
|
self._create_chat(livechat_channel, first_operator, in_call=True)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self.assertEqual(first_operator, livechat_channel._get_operator())
|
|
|
|
def test_priority_by_number_of_chat_all_operators_exceed_limit(self):
|
|
first_operator = self._create_operator()
|
|
second_operator = self._create_operator()
|
|
livechat_channel = self.env["im_livechat.channel"].create(
|
|
{
|
|
"name": "Livechat Channel",
|
|
"user_ids": [first_operator.id, second_operator.id],
|
|
}
|
|
)
|
|
self._create_chat(livechat_channel, first_operator, in_call=True)
|
|
self._create_chat(livechat_channel, first_operator)
|
|
self._create_chat(livechat_channel, second_operator, in_call=True)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self._create_chat(livechat_channel, second_operator)
|
|
self.assertEqual(first_operator, livechat_channel._get_operator())
|