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
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import odoo
from odoo.tests import JsonRpcException
from odoo.addons.mail.tests.test_controller_common import TestControllerCommon
class MessagePostSubTestData:
def __init__(
self,
user,
allowed,
/,
*,
partners=None,
partner_emails=None,
route_kw=None,
exp_author=None,
exp_partners=None,
exp_emails=None,
):
self.user = user if user._name == "res.users" else user.env.ref("base.public_user")
self.guest = user if user._name == "mail.guest" else user.env["mail.guest"]
self.allowed = allowed
self.route_kw = {
"context": {"mail_create_nosubscribe": True, "mail_post_autofollow": False},
**(route_kw or {}),
}
if partner_emails is not None:
self.route_kw["partner_emails"] = partner_emails
self.post_data = {
"body": "<p>Hello</p>",
"message_type": "comment",
"subtype_xmlid": "mail.mt_comment",
}
if partners is not None:
self.post_data["partner_ids"] = partners.ids
self.exp_author = exp_author
self.exp_partners = exp_partners
self.exp_emails = exp_emails
@odoo.tests.tagged("-at_install", "post_install")
class TestThreadControllerCommon(TestControllerCommon):
def _execute_message_post_subtests(self, record, tests: list[MessagePostSubTestData]):
for test in tests:
self._authenticate_user(user=test.user, guest=test.guest)
with self.subTest(
record=record, user=test.user.name, guest=test.guest.name, route_kw=test.route_kw
):
if test.allowed:
self._message_post(record, test.post_data, test.route_kw)
message = self._find_message(record)
self.assertTrue(message)
if test.guest and not test.exp_author:
self.assertEqual(message.author_guest_id, test.guest)
else:
self.assertEqual(message.author_id, test.exp_author or test.user.partner_id)
if test.exp_partners is not None:
self.assertEqual(message.partner_ids, test.exp_partners)
if test.exp_emails is not None:
self.assertEqual(message.partner_ids.mapped("email"), test.exp_emails)
else:
with self.assertRaises(JsonRpcException, msg="werkzeug.exceptions.NotFound"):
self._message_post(record, test.post_data, test.route_kw)
def _message_post(self, record, post_data, route_kw):
self.make_jsonrpc_request(
route="/mail/message/post",
params={
"thread_model": record._name,
"thread_id": record.id,
"post_data": post_data,
**route_kw,
},
)
def _find_message(self, record):
return self.env["mail.message"].search(
[("res_id", "=", record.id), ("model", "=", record._name)], order="id desc", limit=1
)
@odoo.tests.tagged("-at_install", "post_install")
class TestThreadController(TestThreadControllerCommon):
def test_partner_message_post_access(self):
"""Test access of message_post on partner record."""
record = self.env["res.partner"].create({"name": "Test Partner"})
def test_access(user, allowed):
return MessagePostSubTestData(user, allowed)
self._execute_message_post_subtests(
record,
(
test_access(self.user_public, False),
test_access(self.guest, False),
test_access(self.user_portal, False),
# False because not base.group_partner_manager
test_access(self.user_employee, False),
test_access(self.user_demo, True),
test_access(self.user_admin, True),
),
)
def test_partner_message_post_partner_ids(self):
"""Test partner_ids of message_post on partner record."""
record = self.env["res.partner"].create({"name": "Test Partner"})
partners = (
self.user_portal + self.user_employee + self.user_demo + self.user_admin
).partner_id
no_partner = self.env["res.partner"]
def test_partners(user, allowed, exp_partners):
return MessagePostSubTestData(
user, allowed, partners=partners, exp_partners=exp_partners
)
self._execute_message_post_subtests(
record,
(
test_partners(self.user_public, False, no_partner),
test_partners(self.guest, False, no_partner),
test_partners(self.user_portal, False, no_partner),
# False because not base.group_partner_manager
test_partners(self.user_employee, False, no_partner),
test_partners(self.user_demo, True, partners),
test_partners(self.user_admin, True, partners),
),
)
|