File: test_thread_controller.py

package info (click to toggle)
odoo 18.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 878,716 kB
  • sloc: javascript: 927,937; python: 685,670; xml: 388,524; sh: 1,033; sql: 415; makefile: 26
file content (130 lines) | stat: -rw-r--r-- 5,231 bytes parent folder | download
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),
            ),
        )