Skip to content

Commit ac51d6b

Browse files
committed
Fix bug in get_xform_users_with_perms fn
1 parent eb6cb56 commit ac51d6b

File tree

2 files changed

+118
-1
lines changed

2 files changed

+118
-1
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Tests onadata.libs.utils.user_auth module
4+
"""
5+
6+
from django.contrib.auth.models import User
7+
8+
from guardian.shortcuts import assign_perm
9+
10+
from onadata.apps.main.tests.test_base import TestBase
11+
from onadata.libs.utils.user_auth import get_xform_users_with_perms
12+
13+
14+
class TestGetXformUsersWithPerms(TestBase):
15+
"""
16+
Tests for get_xform_users_with_perms function
17+
"""
18+
19+
def test_single_permission(self):
20+
"""
21+
Test that a user with a single permission is returned correctly.
22+
"""
23+
self._publish_transportation_form()
24+
alice = self._create_user("alice", "alice")
25+
26+
assign_perm("view_xform", alice, self.xform)
27+
28+
user_perms = get_xform_users_with_perms(self.xform)
29+
30+
self.assertIn(alice, user_perms)
31+
self.assertEqual(user_perms[alice], ["view_xform"])
32+
33+
def test_multiple_permissions_same_user(self):
34+
"""
35+
Test that a user with multiple permissions returns ALL permissions.
36+
This test would have failed with the bug where p.user.username was
37+
checked instead of p.user as dictionary key.
38+
"""
39+
self._publish_transportation_form()
40+
alice = self._create_user("alice", "alice")
41+
42+
assign_perm("view_xform", alice, self.xform)
43+
assign_perm("change_xform", alice, self.xform)
44+
assign_perm("delete_xform", alice, self.xform)
45+
46+
user_perms = get_xform_users_with_perms(self.xform)
47+
48+
self.assertIn(alice, user_perms)
49+
self.assertEqual(len(user_perms[alice]), 3)
50+
self.assertIn("view_xform", user_perms[alice])
51+
self.assertIn("change_xform", user_perms[alice])
52+
self.assertIn("delete_xform", user_perms[alice])
53+
54+
def test_multiple_users_with_permissions(self):
55+
"""
56+
Test that multiple users with different permissions are returned correctly.
57+
"""
58+
self._publish_transportation_form()
59+
alice = self._create_user("alice", "alice")
60+
charlie = self._create_user("charlie", "charlie")
61+
62+
assign_perm("view_xform", alice, self.xform)
63+
assign_perm("change_xform", alice, self.xform)
64+
assign_perm("view_xform", charlie, self.xform)
65+
66+
user_perms = get_xform_users_with_perms(self.xform)
67+
68+
self.assertEqual(len(user_perms), 3)
69+
self.assertIn(alice, user_perms)
70+
self.assertIn(charlie, user_perms)
71+
self.assertEqual(len(user_perms[alice]), 2)
72+
self.assertIn("view_xform", user_perms[alice])
73+
self.assertIn("change_xform", user_perms[alice])
74+
self.assertEqual(user_perms[charlie], ["view_xform"])
75+
76+
def test_no_permissions(self):
77+
"""
78+
Test that an empty dict is returned when no permissions are assigned.
79+
"""
80+
self._publish_transportation_form()
81+
82+
user_perms = get_xform_users_with_perms(self.xform)
83+
84+
self.assertEqual(
85+
user_perms,
86+
{
87+
User.objects.get(username="bob"): [
88+
"add_xform",
89+
"change_xform",
90+
"delete_xform",
91+
"view_xform",
92+
"view_xform_all",
93+
"view_xform_data",
94+
"report_xform",
95+
"move_xform",
96+
"transfer_xform",
97+
"can_export_xform_data",
98+
"delete_submission",
99+
]
100+
},
101+
)
102+
103+
def test_user_key_is_user_object_not_username(self):
104+
"""
105+
Test that the dictionary keys are User objects, not username strings.
106+
"""
107+
self._publish_transportation_form()
108+
alice = self._create_user("alice", "alice")
109+
110+
assign_perm("view_xform", alice, self.xform)
111+
112+
user_perms = get_xform_users_with_perms(self.xform)
113+
114+
# Keys should be User objects
115+
for key in user_perms.keys():
116+
self.assertNotIsInstance(key, str)
117+
self.assertEqual(key.__class__.__name__, "User")

onadata/libs/utils/user_auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def get_xform_users_with_perms(xform):
166166
.select_related("user", "permission")
167167
.only("user", "permission__codename", "content_object_id")
168168
):
169-
if p.user.username not in user_perms:
169+
if p.user not in user_perms:
170170
user_perms[p.user] = []
171171
user_perms[p.user].append(p.permission.codename)
172172

0 commit comments

Comments
 (0)