Skip to content

Commit fe12ad3

Browse files
Ta#78696 [16.0][FIX] base_extended_security : unit-testing (#243)
Co-authored-by: Lanto R. <124650562+lanto-razafindrabe@users.noreply.github.com>
1 parent 4e9cf4b commit fe12ad3

4 files changed

Lines changed: 74 additions & 48 deletions

File tree

base_extended_security/__manifest__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33

44
{
55
"name": "Base Extended Security",
6-
"version": "16.0.1.1.0",
6+
"version": "16.0.1.1.1",
77
"author": "Numigi",
88
"maintainer": "Numigi",
99
"license": "LGPL-3",
1010
"category": "Other",
1111
"summary": "Securize access to records",
12-
"depends": ["web", "account"],
12+
"depends": ["web"],
1313
"data": [
1414
"security/ir.model.access.csv",
1515
"views/extended_security_rule.xml",

base_extended_security/models/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from odoo import models, api
55

66

7-
class BaseWithExtendedSecurity(models.AbstractModel):
7+
class Base(models.AbstractModel):
88

99
_inherit = "base"
1010

base_extended_security/models/ir_ui_view.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from odoo import api, models
66

77

8-
class ViewWithButtonsHiden(models.Model):
8+
class IrUiView(models.Model):
99
_inherit = "ir.ui.view"
1010

1111
def _remove_write_access_buttons(self, env, model, tree):

base_extended_security/tests/test_security_rules.py

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,41 @@ def setUpClass(cls):
2929
}
3030
)
3131

32-
cls.product = cls.env["product.product"].create(
32+
# PARTNER
33+
cls.partner = cls.env["res.partner"].create(
3334
{
34-
"name": "Product 1",
35+
"name": "Partner 1",
3536
}
3637
)
3738

3839
cls.rule = cls.env["extended.security.rule"].create(
3940
{
40-
"model_id": cls.env.ref("product.model_product_product").id,
41+
"model_id": cls.env.ref("base.model_res_partner").id,
42+
"group_ids": [(4, cls.group.id)],
43+
"perm_read": False,
44+
"perm_write": False,
45+
"perm_create": False,
46+
"perm_unlink": False,
47+
}
48+
)
49+
50+
# IR ACTIONS SERVER
51+
cls.res_partner_model = cls.env["ir.model"].search(
52+
[("model", "=", "res.partner")]
53+
)
54+
cls.comment_html = "<p>MyComment</p>"
55+
cls.action_1 = cls.env["ir.actions.server"].create(
56+
{
57+
"name": "TestAction",
58+
"model_id": cls.res_partner_model.id,
59+
"model_name": "res.partner",
60+
"state": "code",
61+
"code": 'record.write({"comment": "%s"})' % cls.comment_html,
62+
}
63+
)
64+
cls.rule_1 = cls.env["extended.security.rule"].create(
65+
{
66+
"model_id": cls.env.ref("base.model_ir_actions_server").id,
4167
"group_ids": [(4, cls.group.id)],
4268
"perm_read": False,
4369
"perm_write": False,
@@ -51,87 +77,83 @@ def test_if_member_of_group__access_error_not_raised(self, access_type):
5177
self.rule["perm_{}".format(access_type)] = True
5278
self.user.groups_id |= self.group
5379
method = "check_extended_security_{}".format(access_type)
54-
getattr(self.product.with_user(self.user), method)()
80+
getattr(self.partner.with_user(self.user), method)()
5581

5682
@data("read", "write", "create", "unlink")
5783
def test_if_access_type_uncheked__access_error_raised(self, access_type):
5884
method = "check_extended_security_{}".format(access_type)
59-
getattr(self.product.with_user(self.user), method)()
85+
getattr(self.partner.with_user(self.user), method)()
6086

6187
@data("read", "write", "create", "unlink")
6288
def test_if_not_member_of_group__access_error_raised(self, access_type):
6389
self.rule["perm_{}".format(access_type)] = True
6490
method = "check_extended_security_{}".format(access_type)
6591

6692
with pytest.raises(AccessError):
67-
getattr(self.product.with_user(self.user), method)()
93+
getattr(self.partner.with_user(self.user), method)()
6894

6995
def test_after_rule_deleted__rule_not_applied(self):
7096
self.rule.perm_read = True
7197
with pytest.raises(AccessError):
72-
self.product.with_user(self.user).check_extended_security_read()
98+
self.partner.with_user(self.user).check_extended_security_read()
7399

74100
self.rule.unlink()
75-
self.product.with_user(self.user).check_extended_security_read()
101+
self.partner.with_user(self.user).check_extended_security_read()
76102

77103
def test_after_rule_created__rule_applied(self):
78-
self.product.with_user(self.user).check_extended_security_read()
104+
self.partner.with_user(self.user).check_extended_security_read()
79105
self.rule.copy({"perm_read": True})
80106

81107
with pytest.raises(AccessError):
82-
self.product.with_user(self.user).check_extended_security_read()
108+
self.partner.with_user(self.user).check_extended_security_read()
83109

84110
def test_after_rule_unchecked__rule_not_applied(self):
85111
self.rule.perm_read = True
86112

87113
with pytest.raises(AccessError):
88-
self.product.with_user(self.user).check_extended_security_read()
114+
self.partner.with_user(self.user).check_extended_security_read()
89115

90116
self.rule.perm_read = False
91-
self.product.with_user(self.user).check_extended_security_read()
117+
self.partner.with_user(self.user).check_extended_security_read()
92118

93119
def test_after_rule_archived__rule_not_applied(self):
94120
self.rule.perm_read = True
95121

96122
with pytest.raises(AccessError):
97-
self.product.with_user(self.user).check_extended_security_read()
123+
self.partner.with_user(self.user).check_extended_security_read()
98124

99125
self.rule.active = False
100-
self.product.with_user(self.user).check_extended_security_read()
126+
self.partner.with_user(self.user).check_extended_security_read()
101127

102128
def test_after_rule_checked__rule_applied(self):
103-
self.product.with_user(self.user).check_extended_security_read()
129+
self.partner.with_user(self.user).check_extended_security_read()
104130

105131
self.rule.perm_read = True
106132
with pytest.raises(AccessError):
107-
self.product.with_user(self.user).check_extended_security_read()
133+
self.partner.with_user(self.user).check_extended_security_read()
108134

109135
def test_on_search__if_not_authorized__domain_is_empty(self):
110136
self.rule.perm_read = True
111137
domain = (
112-
self.env["product.product"]
113-
.with_user(self.user)
114-
.get_extended_security_domain()
138+
self.env["res.partner"].with_user(self.user).get_extended_security_domain()
115139
)
116-
search_result = self.env["product.product"].search(domain)
117-
assert self.product not in search_result
140+
search_result = self.env["res.partner"].search(domain)
141+
assert self.partner not in search_result
118142

119143
def test_on_search__if_authorized__domain_not_empty(self):
120144
self.rule.perm_read = True
121145
self.user.groups_id |= self.group
122146

123147
domain = (
124-
self.env["product.product"]
125-
.with_user(self.user)
126-
.get_extended_security_domain()
148+
self.env["res.partner"].with_user(self.user).get_extended_security_domain()
127149
)
128-
search_result = self.env["product.product"].search(domain)
150+
search_result = self.env["res.partner"].search(domain)
129151

130-
assert self.product in search_result
152+
assert self.partner in search_result
131153

132-
def _get_product_list_view_arch(self):
133-
view = self.env.ref("product.product_product_tree_view")
134-
arch = self.env["product.product"].get_view(view_id=view.id)["arch"]
154+
def _get_partner_list_view_arch(self):
155+
view = self.env.ref("base.view_partner_tree")
156+
arch = self.env["res.partner"].get_view(view_id=view.id)["arch"]
135157
return etree.fromstring(arch)
136158

137159
@data(
@@ -143,7 +165,7 @@ def _get_product_list_view_arch(self):
143165
def test_if_authorized__view_property_not_disabled(
144166
self, access_type, view_property
145167
):
146-
list_view = self._get_product_list_view_arch()
168+
list_view = self._get_partner_list_view_arch()
147169
assert view_property not in list_view.attrib
148170

149171
def _get_nested_ir_rule_many2many_arch(self):
@@ -177,6 +199,15 @@ def _get_nested_ir_model_access_one2many_arch(self):
177199
tree_attrib = model_access_field["edition_view"]["tree"].attrib
178200
return tree_attrib
179201

202+
def test_if_not_authorized__toggle_button_hidden(self):
203+
self.rule_1.perm_write = True
204+
form_view = self._get_ir_actions_server_form_view_arch()
205+
assert not form_view.xpath("//header/button[@name='create_action']")
206+
207+
def test_if_authorized__toggle_button_not_hidden(self):
208+
form_view = self._get_ir_actions_server_form_view_arch()
209+
assert form_view.xpath("//header/button[@name='create_action']")
210+
180211
@data(
181212
("write", "edit"),
182213
("create", "create"),
@@ -197,11 +228,6 @@ def test_in_nested_one2many_list__view_property_disabled(
197228
one2many_list = self._get_nested_ir_model_access_one2many_arch()
198229
assert view_property in one2many_list
199230

200-
def test_if_not_authorized__toggle_button_hidden(self):
201-
self.rule.perm_write = True
202-
form_view = self._get_product_form_view_arch()
203-
assert not form_view.xpath("//button[@name='action_update_quantity_on_hand']")
204-
205231
def test_read_access_action(self):
206232
self.rule.model_id = self.env.ref("base.model_res_partner")
207233
self.rule.perm_write = True
@@ -217,22 +243,22 @@ def test_read_access_action(self):
217243
def test_if_unauthorized__view_property_disabled(self, access_type, view_property):
218244
self.rule["perm_{}".format(access_type)] = True
219245

220-
list_view = self._get_product_list_view_arch()
246+
list_view = self._get_partner_list_view_arch()
221247
assert list_view.attrib[view_property] == "false"
222248

223-
def _get_product_form_view_arch(self):
224-
return self._get_form_view_arch(
225-
"product.product", "product.product_normal_form_view"
226-
)
227-
228249
def _get_partner_form_view_arch(self):
229250
return self._get_form_view_arch("res.partner", "base.view_partner_form")
230251

252+
def _get_ir_actions_server_form_view_arch(self):
253+
return self._get_form_view_arch(
254+
"ir.actions.server", "base.view_server_action_form"
255+
)
256+
231257
def _get_form_view_arch(self, model, view_ref):
232258
view = self.env.ref(view_ref)
233259
arch = self.env[model].get_view(view_id=view.id)["arch"]
234260
return etree.fromstring(arch)
235261

236-
def test_if_authorized__toggle_button_not_hidden(self):
237-
form_view = self._get_product_form_view_arch()
238-
assert form_view.xpath("//button[@name='action_open_label_layout']")
262+
def test_if_authorized__field_not_hidden(self):
263+
form_view = self._get_partner_form_view_arch()
264+
assert form_view.xpath("//field[@name='name']")

0 commit comments

Comments
 (0)