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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
# 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
@odoo.tests.tagged("-at_install", "post_install")
class TestMessageReactionControllerCommon(TestControllerCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.reaction = "😊"
def _execute_subtests(self, message, subtests):
for data_user, allowed, *args in subtests:
route_kw = args[0] if args else {}
kwargs = args[1] if len(args) > 1 else {}
user = data_user if data_user._name == "res.users" else self.user_public
guest = data_user if data_user._name == "mail.guest" else self.env["mail.guest"]
self._authenticate_user(user=user, guest=guest)
msg = str(message.body) if message != self.fake_message else "fake message"
with self.subTest(message=msg, user=user.name, guest=guest.name, route_kw=route_kw):
if allowed:
self._add_reaction(message, self.reaction, route_kw)
reactions = self._find_reactions(message)
self.assertEqual(len(reactions), 1)
expected_partner = kwargs.get("partner")
if guest and not expected_partner:
self.assertEqual(reactions.guest_id, guest)
else:
self.assertEqual(reactions.partner_id, expected_partner or user.partner_id)
self._remove_reaction(message, self.reaction, route_kw)
self.assertEqual(len(self._find_reactions(message)), 0)
else:
with self.assertRaises(
JsonRpcException, msg="add reaction should raise NotFound"
):
self._add_reaction(message, self.reaction, route_kw)
with self.assertRaises(
JsonRpcException, msg="remove reaction should raise NotFound"
):
self._remove_reaction(message, self.reaction, route_kw)
def _add_reaction(self, message, content, route_kw):
self.make_jsonrpc_request(
route="/mail/message/reaction",
params={"action": "add", "content": content, "message_id": message.id, **route_kw},
)
def _remove_reaction(self, message, content, route_kw):
self.make_jsonrpc_request(
route="/mail/message/reaction",
params={"action": "remove", "content": content, "message_id": message.id, **route_kw},
)
def _find_reactions(self, message):
return self.env["mail.message.reaction"].search([("message_id", "=", message.id)])
@odoo.tests.tagged("-at_install", "post_install")
class TestMessageReactionController(TestMessageReactionControllerCommon):
def test_message_reaction_partner(self):
"""Test access of message reaction for partner chatter."""
message = self.user_demo.partner_id.message_post(body="partner message")
self._execute_subtests(
message,
(
(self.user_public, False),
(self.guest, False),
(self.user_portal, False),
# False because not group_partner_manager
(self.user_employee, False),
(self.user_demo, True),
(self.user_admin, True),
),
)
def test_message_reaction_public_channel(self):
"""Test access of message reaction for a public channel."""
channel = self.env["discuss.channel"].create(
{"group_public_id": None, "name": "public channel"}
)
message = channel.message_post(body="public message")
self._execute_subtests(
message,
(
(self.user_public, False),
(self.guest, True),
(self.user_portal, True),
(self.user_employee, True),
(self.user_demo, True),
(self.user_admin, True),
),
)
def test_message_reaction_channel_as_member(self):
"""Test access of message reaction for a channel as member."""
channel = self.env["discuss.channel"].browse(
self.env["discuss.channel"].create_group(
partners_to=(self.user_portal + self.user_employee + self.user_demo).partner_id.ids
)["id"]
)
channel.add_members(guest_ids=self.guest.ids)
message = channel.message_post(body="invite message")
self._execute_subtests(
message,
(
(self.user_public, False),
(self.guest, True),
(self.user_portal, True),
(self.user_employee, True),
(self.user_demo, True),
(self.user_admin, True),
),
)
def test_message_reaction_channel_as_non_member(self):
"""Test access of message reaction for a channel as non-member."""
channel = self.env["discuss.channel"].browse(
self.env["discuss.channel"].create_group(partners_to=[])["id"]
)
message = channel.message_post(body="private message")
self._execute_subtests(
message,
(
(self.user_public, False),
(self.guest, False),
(self.user_portal, False),
(self.user_employee, False),
(self.user_demo, False),
(self.user_admin, True),
),
)
def test_message_reaction_fake_message(self):
"""Test access of message reaction for a non-existing message."""
self._execute_subtests(
self.fake_message,
(
(self.user_public, False),
(self.guest, False),
(self.user_portal, False),
(self.user_employee, False),
(self.user_demo, False),
(self.user_admin, False),
),
)
|