PURPOSE Clean posting process and improve mail.message definition and comprehension. SPECIFICATIONS In order to be more explicit subtype parameter is renamed to subtype_xmlid. It therefore clearly indicates it should be a valid subtype Xml ID. Support of ill formatted Xml IDs is removed because there is no reason to try to add some random prefix. Give something that exists or go to hell, punk ! LINKS Task ID 2071556 PR #38692
133 lines
5.7 KiB
Python
133 lines
5.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from unittest.mock import patch
|
|
|
|
from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients
|
|
from odoo.tests import tagged
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
@tagged("odoobot")
|
|
class TestOdoobot(TestMailCommon, TestRecipients):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestOdoobot, cls).setUpClass()
|
|
cls.test_record = cls.env['mail.test.simple'].with_context(cls._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
|
|
|
|
cls.odoobot = cls.env.ref("base.partner_root")
|
|
cls.message_post_default_kwargs = {
|
|
'body': '',
|
|
'attachment_ids': [],
|
|
'message_type': 'comment',
|
|
'partner_ids': [],
|
|
'subtype_xmlid': 'mail.mt_comment'
|
|
}
|
|
cls.odoobot_ping_body = '<a href="http://odoo.com/web#model=res.partner&id=%s" class="o_mail_redirect" data-oe-id="%s" data-oe-model="res.partner" target="_blank">@OdooBot</a>' % (cls.odoobot.id, cls.odoobot.id)
|
|
cls.test_record_employe = cls.test_record.with_user(cls.user_employee)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_fetch_listener(self):
|
|
channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot()
|
|
partners = self.env['mail.channel'].channel_fetch_listeners(channel.uuid)
|
|
odoobot = self.env.ref("base.partner_root")
|
|
odoobot_in_fetch_listeners = [partner for partner in partners if partner['id'] == odoobot.id]
|
|
self.assertEqual(len(odoobot_in_fetch_listeners), 1, 'odoobot should appear only once in channel_fetch_listeners')
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_odoobot_ping(self):
|
|
kwargs = self.message_post_default_kwargs.copy()
|
|
kwargs.update({'body': self.odoobot_ping_body, 'partner_ids': [self.odoobot.id, self.user_admin.partner_id.id]})
|
|
|
|
with patch('random.choice', lambda x: x[0]):
|
|
self.assertNextMessage(
|
|
self.test_record_employe.with_context({'mail_post_autofollow': True}).message_post(**kwargs),
|
|
sender=self.odoobot,
|
|
answer=["Yep, OdooBot is in the place!"]
|
|
)
|
|
# Odoobot should not be a follower but user_employee and user_admin should
|
|
follower = self.test_record.message_follower_ids.mapped('partner_id')
|
|
self.assertNotIn(self.odoobot, follower)
|
|
self.assertIn(self.user_employee.partner_id, follower)
|
|
self.assertIn(self.user_admin.partner_id, follower)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_onboarding_flow(self):
|
|
kwargs = self.message_post_default_kwargs.copy()
|
|
channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot()
|
|
|
|
kwargs['body'] = 'tagada 😊'
|
|
self.assertNextMessage(
|
|
channel.message_post(**kwargs),
|
|
sender=self.odoobot,
|
|
answer=("attachment",)
|
|
)
|
|
kwargs['body'] = ''
|
|
attachment = self.env['ir.attachment'].with_user(self.user_employee).create({
|
|
'datas': 'bWlncmF0aW9uIHRlc3Q=',
|
|
'name': 'picture_of_your_dog.doc',
|
|
'res_model': 'mail.compose.message',
|
|
})
|
|
kwargs['attachment_ids'] = [attachment.id]
|
|
last_message = self.assertNextMessage(
|
|
channel.message_post(**kwargs),
|
|
sender=self.odoobot,
|
|
answer=("help",)
|
|
)
|
|
kwargs['attachment_ids'] = []
|
|
|
|
channel.execute_command(command="help")
|
|
self.assertNextMessage(
|
|
last_message, # no message will be post with command help, use last odoobot message instead
|
|
sender=self.odoobot,
|
|
answer=("@OdooBot",)
|
|
)
|
|
# we dont test the end of the flow since it will depends of the installed apps (livechat)
|
|
self.user_employee.odoobot_state = "idle"
|
|
kwargs['partner_ids'] = []
|
|
kwargs['body'] = "I love you"
|
|
self.assertNextMessage(
|
|
channel.message_post(**kwargs),
|
|
sender=self.odoobot,
|
|
answer=("too human for me",)
|
|
)
|
|
kwargs['body'] = "Go fuck yourself"
|
|
self.assertNextMessage(
|
|
channel.message_post(**kwargs),
|
|
sender=self.odoobot,
|
|
answer=("I have feelings",)
|
|
)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_odoobot_no_default_answer(self):
|
|
kwargs = self.message_post_default_kwargs.copy()
|
|
kwargs.update({'body': "I'm not talking to @odoobot right now", 'partner_ids': []})
|
|
self.assertNextMessage(
|
|
self.test_record_employe.message_post(**kwargs),
|
|
answer=False
|
|
)
|
|
|
|
def assertNextMessage(self, message, answer=None, sender=None):
|
|
last_message = self.env['mail.message'].search([('id', '=', message.id + 1)])
|
|
if last_message:
|
|
body = last_message.body.replace('<p>', '').replace('</p>', '')
|
|
else:
|
|
self.assertFalse(answer, "No last message found when an answer was expect")
|
|
if answer is not None:
|
|
if answer and not last_message:
|
|
self.assertTrue(False, "No last message found")
|
|
if isinstance(answer, list):
|
|
self.assertIn(body, answer)
|
|
elif isinstance(answer, tuple):
|
|
for elem in answer:
|
|
self.assertIn(elem, body)
|
|
elif not answer:
|
|
self.assertFalse(last_message, "No answer should have been post")
|
|
return
|
|
else:
|
|
self.assertEqual(body, answer)
|
|
if sender:
|
|
self.assertEqual(sender, last_message.author_id)
|
|
return last_message
|