Skip to content

Commit 54c8471

Browse files
test: add comprehensive tests for role and user permission checks
Signed-off-by: rohan <[email protected]>
1 parent 7e2298c commit 54c8471

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
import pytest
2+
from unittest.mock import MagicMock, patch
3+
from api.utils.access.permissions import (
4+
role_has_permission,
5+
user_has_permission,
6+
role_has_global_access,
7+
)
8+
9+
10+
class TestRoleHasPermission:
11+
def test_role_is_none(self):
12+
assert role_has_permission(None, "read", "Users") is False
13+
14+
def test_default_role_permission(self):
15+
role = MagicMock()
16+
role.is_default = True
17+
role.name = "admin" # Should be capitalized in function
18+
19+
# Admin has broad access
20+
assert role_has_permission(role, "create", "Apps") is True
21+
assert role_has_permission(role, "delete", "Members") is True
22+
assert role_has_permission(role, "unknown", "Apps") is False
23+
24+
def test_default_role_app_permission(self):
25+
role = MagicMock()
26+
role.is_default = True
27+
role.name = "admin"
28+
29+
assert (
30+
role_has_permission(role, "create", "Secrets", is_app_resource=True) is True
31+
)
32+
assert (
33+
role_has_permission(role, "delete", "Secrets", is_app_resource=True) is True
34+
)
35+
36+
def test_developer_role_restrictions(self):
37+
role = MagicMock()
38+
role.is_default = True
39+
role.name = "developer"
40+
41+
# Developer can read apps but not create/delete
42+
assert role_has_permission(role, "read", "Apps") is True
43+
assert role_has_permission(role, "create", "Apps") is False
44+
assert role_has_permission(role, "delete", "Apps") is False
45+
46+
# Developer can create secrets
47+
assert (
48+
role_has_permission(role, "create", "Secrets", is_app_resource=True) is True
49+
)
50+
51+
def test_custom_role_permission(self):
52+
role = MagicMock()
53+
role.is_default = False
54+
role.permissions = {
55+
"permissions": {
56+
"Users": ["read"],
57+
},
58+
"app_permissions": {
59+
"Secrets": ["read"],
60+
},
61+
}
62+
63+
assert role_has_permission(role, "read", "Users") is True
64+
assert role_has_permission(role, "create", "Users") is False
65+
66+
def test_custom_role_app_permission(self):
67+
role = MagicMock()
68+
role.is_default = False
69+
role.permissions = {
70+
"permissions": {},
71+
"app_permissions": {
72+
"Secrets": ["read"],
73+
},
74+
}
75+
76+
assert (
77+
role_has_permission(role, "read", "Secrets", is_app_resource=True) is True
78+
)
79+
assert (
80+
role_has_permission(role, "create", "Secrets", is_app_resource=True)
81+
is False
82+
)
83+
84+
85+
class TestUserHasPermission:
86+
@patch("api.utils.access.permissions.apps.get_model")
87+
def test_user_has_permission_success(self, mock_get_model):
88+
# Setup mocks
89+
MockOrganisationMember = MagicMock()
90+
mock_get_model.return_value = MockOrganisationMember
91+
92+
mock_user = MagicMock()
93+
mock_org = MagicMock()
94+
95+
mock_member = MagicMock()
96+
mock_member.role.is_default = True
97+
mock_member.role.name = "admin"
98+
99+
MockOrganisationMember.objects.get.return_value = mock_member
100+
101+
# Test
102+
assert user_has_permission(mock_user, "create", "Apps", mock_org) is True
103+
104+
# Verify call
105+
MockOrganisationMember.objects.get.assert_called_with(
106+
user=mock_user, organisation=mock_org, deleted_at=None
107+
)
108+
109+
@patch("api.utils.access.permissions.apps.get_model")
110+
def test_user_not_member(self, mock_get_model):
111+
# Setup mocks
112+
MockOrganisationMember = MagicMock()
113+
mock_get_model.return_value = MockOrganisationMember
114+
115+
# Simulate DoesNotExist
116+
MockOrganisationMember.DoesNotExist = Exception
117+
MockOrganisationMember.objects.get.side_effect = (
118+
MockOrganisationMember.DoesNotExist
119+
)
120+
121+
assert user_has_permission(MagicMock(), "read", "Users", MagicMock()) is False
122+
123+
@patch("api.utils.access.permissions.apps.get_model")
124+
def test_service_account_permission(self, mock_get_model):
125+
# Mock OrganisationMember
126+
MockOrganisationMember = MagicMock()
127+
mock_get_model.return_value = MockOrganisationMember
128+
129+
# For service account, the account passed is the org_member (or behaves like one)
130+
mock_sa_member = MagicMock()
131+
mock_sa_member.role.is_default = True
132+
mock_sa_member.role.name = "developer"
133+
134+
assert (
135+
user_has_permission(
136+
mock_sa_member, "read", "Apps", MagicMock(), is_service_account=True
137+
)
138+
is True
139+
)
140+
assert (
141+
user_has_permission(
142+
mock_sa_member, "create", "Apps", MagicMock(), is_service_account=True
143+
)
144+
is False
145+
)
146+
147+
148+
@patch("api.utils.access.permissions.apps.get_model")
149+
class TestRoleHasGlobalAccess:
150+
def test_default_role_global_access(self, mock_get_model):
151+
MockRole = MagicMock()
152+
MockRole.DoesNotExist = Exception
153+
mock_get_model.return_value = MockRole
154+
155+
role = MagicMock()
156+
role.is_default = True
157+
role.name = "admin"
158+
assert role_has_global_access(role) is True
159+
160+
role.name = "developer"
161+
assert role_has_global_access(role) is False
162+
163+
def test_custom_role_global_access(self, mock_get_model):
164+
MockRole = MagicMock()
165+
MockRole.DoesNotExist = Exception
166+
mock_get_model.return_value = MockRole
167+
168+
role = MagicMock()
169+
role.is_default = False
170+
role.permissions = {"global_access": True}
171+
assert role_has_global_access(role) is True
172+
173+
role.permissions = {"global_access": False}
174+
assert role_has_global_access(role) is False

0 commit comments

Comments
 (0)