1# -*- coding: utf-8 -*-
2# Part of Odoo. See LICENSE file for full copyright and licensing details.
3
4import datetime
5
6from odoo import tests, _
7from odoo.addons.website_livechat.tests.common import TestLivechatCommon
8
9
10@tests.tagged('post_install', '-at_install')
11class TestLivechatBasicFlowHttpCase(tests.HttpCase, TestLivechatCommon):
12    def test_visitor_banner_history(self):
13        # create visitor history
14        self.env['website.track'].create([{
15            'page_id': self.env.ref('website.homepage_page').id,
16            'visitor_id': self.visitor.id,
17            'visit_datetime': self.base_datetime,
18        }, {
19            'page_id': self.env.ref('website.contactus_page').id,
20            'visitor_id': self.visitor.id,
21            'visit_datetime': self.base_datetime - datetime.timedelta(minutes=10),
22        }, {
23            'page_id': self.env.ref('website.homepage_page').id,
24            'visitor_id': self.visitor.id,
25            'visit_datetime': self.base_datetime - datetime.timedelta(minutes=20),
26        }])
27
28        handmade_history = "%s (21:10) → %s (21:20) → %s (21:30)" % (
29            self.env.ref('website.homepage_page').name,
30            self.env.ref('website.contactus_page').name,
31            self.env.ref('website.homepage_page').name,
32        )
33        history = self.env['mail.channel']._get_visitor_history(self.visitor)
34
35        self.assertEqual(history, handmade_history)
36
37    def test_livechat_username(self):
38        # Open a new live chat
39        res = self.opener.post(url=self.open_chat_url, json=self.open_chat_params)
40        self.assertEqual(res.status_code, 200)
41        channel_1 = self.env['mail.channel'].search([('livechat_visitor_id', '=', self.visitor.id), ('livechat_active', '=', True)], limit=1)
42
43        # Check Channel naming
44        self.assertEqual(channel_1.name, "%s %s" % (self.visitor.display_name, self.operator.livechat_username))
45        channel_1.unlink()
46
47        # Remove livechat_username
48        self.operator.livechat_username = False
49
50        # Open a new live chat
51        res = self.opener.post(url=self.open_chat_url, json=self.open_chat_params)
52        self.assertEqual(res.status_code, 200)
53        channel_2 = self.env['mail.channel'].search([('livechat_visitor_id', '=', self.visitor.id), ('livechat_active', '=', True)], limit=1)
54
55        # Check Channel naming
56        self.assertEqual(channel_2.name, "%s %s" % (self.visitor.display_name, self.operator.name))
57
58    def test_basic_flow_with_rating(self):
59        channel = self._common_basic_flow()
60
61        self._send_rating(channel, self.visitor, 5, "This deboulonnage was fine but not topitop.")
62
63        channel._close_livechat_session()
64
65        self.assertEqual(len(channel.message_ids), 4)
66        self.assertEqual(channel.message_ids[0].author_id, self.env.ref('base.partner_root'), "Odoobot must be the sender of the 'has left the conversation' message.")
67        self.assertEqual(channel.message_ids[0].body, "<p>%s has left the conversation.</p>" % self.visitor.display_name)
68        self.assertEqual(channel.livechat_active, False, "The livechat session must be inactive as the visitor sent his feedback.")
69
70    def test_basic_flow_without_rating(self):
71        channel = self._common_basic_flow()
72
73        # has left the conversation
74        channel._close_livechat_session()
75        self.assertEqual(len(channel.message_ids), 3)
76        self.assertEqual(channel.message_ids[0].author_id, self.env.ref('base.partner_root'), "Odoobot must be the author the message.")
77        self.assertEqual(channel.message_ids[0].body, "<p>%s has left the conversation.</p>" % self.visitor.display_name)
78        self.assertEqual(channel.livechat_active, False, "The livechat session must be inactive since visitor has left the conversation.")
79
80    def _common_basic_flow(self):
81        # Open a new live chat
82        res = self.opener.post(url=self.open_chat_url, json=self.open_chat_params)
83        self.assertEqual(res.status_code, 200)
84
85        channel = self.env['mail.channel'].search([('livechat_visitor_id', '=', self.visitor.id), ('livechat_active', '=', True)], limit=1)
86
87        # Check Channel and Visitor naming
88        self.assertEqual(self.visitor.display_name, "%s #%s" % (_("Website Visitor"), self.visitor.id))
89        self.assertEqual(channel.name, "%s %s" % (self.visitor.display_name, self.operator.livechat_username))
90
91        # Post Message from visitor
92        self._send_message(channel, self.visitor.display_name, "Message from Visitor")
93
94        self.assertEqual(len(channel.message_ids), 1)
95        self.assertEqual(channel.message_ids[0].author_id.id, False, "The author of the message is not a partner.")
96        self.assertEqual(channel.message_ids[0].email_from, self.visitor.display_name, "The sender's email should be the visitor's email.")
97        self.assertEqual(channel.message_ids[0].body, "<p>Message from Visitor</p>")
98        self.assertEqual(channel.livechat_active, True, "The livechat session must be active as the visitor did not left the conversation yet.")
99
100        # Post message from operator
101        self._send_message(channel, self.operator.email, "Message from Operator", author_id=self.operator.partner_id.id)
102
103        self.assertEqual(len(channel.message_ids), 2)
104        self.assertEqual(channel.message_ids[0].author_id, self.operator.partner_id, "The author of the message should be the operator.")
105        self.assertEqual(channel.message_ids[0].email_from, self.operator.email, "The sender's email should be the operator's email.")
106        self.assertEqual(channel.message_ids[0].body, "<p>Message from Operator</p>")
107        self.assertEqual(channel.livechat_active, True, "The livechat session must be active as the visitor did not left the conversation yet.")
108
109        return channel
110