Completed
Push — master ( 463532...ebb95c )
by
unknown
01:33 queued 37s
created

UserTests.test_get_users_list_unauthed()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1
Metric Value
cc 1
dl 0
loc 4
ccs 4
cts 4
cp 1
crap 1
rs 10
1 1
import json
2
3 1
from django.core import mail
4
5 1
from rest_framework import status
6 1
from rest_framework.test import APITestCase, force_authenticate
7
8 1
from sigma_core.tests.factories import UserFactory, AdminUserFactory, GroupMemberFactory, GroupFactory, ClusterFactory
9 1
from sigma_core.serializers.user import DetailedUserSerializer as UserSerializer
10
from sigma_core.models.group import Group
11
from sigma_core.models.group_member import GroupMember
12 1
13 1
class UserTests(APITestCase):
14
    @classmethod
15 1
    def setUpTestData(self):
16
        super(UserTests, self).setUpTestData()
17 1
        self.cluster = ClusterFactory()
18 1
        self.clusteradmin = UserFactory()
19 1
        self.clusteradmin.clusters.add(self.cluster)
20
        GroupMemberFactory(group=self.cluster, user=self.clusteradmin, perm_rank=Group.ADMINISTRATOR_RANK)
21 1
22 1
        self.user = UserFactory()
23 1
        self.user2 = UserFactory()
24
        self.user3 = UserFactory()
25 1
        self.group_2pending_3accepted = GroupFactory()
26
        GroupMemberFactory(group=self.group_2pending_3accepted, user=self.user2, perm_rank=0)
27 1
        GroupMemberFactory(group=self.group_2pending_3accepted, user=self.user3, perm_rank=1)
28
        self.group23_bis = GroupFactory()
29
        GroupMemberFactory(group=self.group23_bis, user=self.user2, perm_rank=1)
30 1
        GroupMemberFactory(group=self.group23_bis, user=self.user3, perm_rank=1)
31
        self.admin_user = AdminUserFactory()
32 1
33 1
        serializer = UserSerializer(self.user)
34
        self.user_data = serializer.data
35
        self.user_url = '/user/%d/' % self.user.id
36
37
        self.users_list = [self.user, self.user2, self.admin_user]
38
        self.users_list_for_user3 = [self.user2, self.user3]
39
40
        self.new_user_data = {'lastname': 'Doe', 'firstname': 'John', 'email': '[email protected]', 'password': 'password', 'clusters' : {self.cluster.id}}
41 1
42
#### List requests
43 1
    def test_get_users_list_unauthed(self):
44 1
        # Client not authenticated
45 1
        response = self.client.get('/user/')
46 1
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
47
48
    def test_get_users_list_forbidden(self):
49 1
        # Client authenticated but has no permission
50
        self.client.force_authenticate(user=self.user)
51 1
        response = self.client.get('/user/')
52 1
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
53
54
    def test_get_users_list_admin_ok(self):
55
        # Client authenticated but has no permission
56
        self.client.force_authenticate(user=self.admin_user)
57
        response = self.client.get('/user/')
58
        self.assertEqual(response.status_code, status.HTTP_200_OK)
59
60 1
#### Get requests
61
    def test_get_user_unauthed(self):
62 1
        # Client is not authenticated
63 1
        response = self.client.get(self.user_url)
64 1
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
65 1
66 1
    def test_get_user_forbidden_no_common_group(self):
67
        # Client authenticated but has no group in common
68
        self.client.force_authenticate(user=self.user)
69 1
        response = self.client.get("/user/%d/" % self.user3.id)
70
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
71 1
72 1
    def test_get_user_forbidden_common_group_not_accepted(self):
73
        # Client authenticated, group in common, but not accepted in this Group
74 1
        user4 = UserFactory()
75
        GroupMemberFactory(group=self.group_2pending_3accepted, user=user4, perm_rank=0)
76 1
        self.client.force_authenticate(user=user4)
77 1
        response = self.client.get("/user/%d/" % self.user2.id)
78 1
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
79 1
80
    def test_get_user_ok_same_group(self):
81
        self.client.force_authenticate(user=self.user3)
82 1
        response = self.client.get("/user/%d/" % self.user2.id)
83
        self.assertEqual(response.status_code, status.HTTP_200_OK)
84 1
85 1
    def test_get_user_ok(self):
86
        # Client has permissions
87 1
        self.client.force_authenticate(user=self.user)
88
        response = self.client.get(self.user_url)
89 1
        self.assertEqual(response.status_code, status.HTTP_200_OK)
90 1
        response.data.pop('permissions', None) # Workaround because DRY rest permissions needs a request
91 1
        self.assertEqual(response.data, self.user_data)
92
93 1
    def test_get_user_memberships_all_visible(self):
94
        # User3 is in both groups
95 1
        self.client.force_authenticate(user=self.user3)
96 1
        response = self.client.get('/user/%d/' % self.user2.id)
97 1
        self.assertEqual(response.status_code, status.HTTP_200_OK)
98 1
        self.assertEqual(len(response.data['memberships']), 2)
99
100
    def test_get_user_memberships_only_one_visible(self):
101 1
        # User2 is in both groups, but not accepted in the first group
102
        self.client.force_authenticate(user=self.user2)
103 1
        response = self.client.get('/user/%d/' % self.user3.id)
104 1
        self.assertEqual(response.status_code, status.HTTP_200_OK)
105 1
        self.assertEqual(len(response.data['memberships']), 1)
106 1
107 1
#### "Get my data" requests
108
    def test_get_my_data_unauthed(self):
109 1
        # Client is not authenticated
110
        response = self.client.get('/user/me/')
111 1
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
112 1
113 1
    def test_get_my_data_ok(self):
114 1
        # Client is authenticated
115 1
        self.client.force_authenticate(user=self.user)
116
        response = self.client.get('/user/me/')
117 1
        self.assertEqual(response.status_code, status.HTTP_200_OK)
118
        self.assertEqual(response.data['id'], self.user.id)
119 1
120 1
#### Create requests
121 1
    def test_create_user_unauthed(self):
122 1
        # Client is not authenticated
123 1
        response = self.client.post('/user/', self.new_user_data)
124 1
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
125
126 1
    def test_create_user_not_cluster_admin(self):
127 1
        # Client has no permission
128
        self.client.force_authenticate(user=self.user)
129 1
        response = self.client.post('/user/', self.new_user_data)
130
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
131 1
132 1
    def test_create_user_admin_ok(self):
133 1
        # Client has permissions
134 1
        self.client.force_authenticate(user=self.admin_user)
135 1
        response = self.client.post('/user/', self.new_user_data)
136
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
137 1
        self.assertEqual(response.data['lastname'], self.new_user_data['lastname'])
138
        self.assertTrue(GroupMember.objects.filter(user=response.data['id'], group=self.cluster.id).exists())
139 1
140 1
    def test_create_user_admin__bad_request1(self):
141 1
        # Client has permissions
142 1
        self.client.force_authenticate(user=self.admin_user)
143 1
        data = self.new_user_data.copy()
144 1
        data['clusters'] = 'Completely wrong'
145
        response = self.client.post('/user/', data)
146 1
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
147 1
148
    def test_create_user_admin__bad_request2(self):
149 1
        # Client has permissions
150
        self.client.force_authenticate(user=self.admin_user)
151 1
        data = self.new_user_data.copy()
152 1
        data['clusters'] = {'cluster': 1}
153 1
        response = self.client.post('/user/', data)
154 1
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
155 1
156
    def test_create_user_admin__bad_request3(self):
157 1
        # Client has permissions
158
        self.client.force_authenticate(user=self.admin_user)
159 1
        data = self.new_user_data.copy()
160 1
        data['clusters'] = None
161 1
        response = self.client.post('/user/', data)
162 1
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
163 1
164 1
    def test_create_user_clusteradmin_ok(self):
165
        # Client has permissions
166 1
        self.client.force_authenticate(user=self.clusteradmin)
167 1
        response = self.client.post('/user/', self.new_user_data)
168
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
169
        self.assertEqual(response.data['lastname'], self.new_user_data['lastname'])
170
        self.assertTrue(GroupMember.objects.filter(user=response.data['id'], group=self.cluster.id).exists())
171 1
172
#### Modification requests
173 1
    def test_edit_email_wrong_permission(self):
174 1
        # Client wants to change another user's email
175 1
        self.client.force_authenticate(user=self.user)
176 1
        user_data = UserSerializer(self.user2).data
177
        user_data['email'] = "[email protected]"
178 1
        response = self.client.put("/user/%d/" % self.user2.id, user_data)
179
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
180 1
181 1
    def test_edit_is_superuser_no_permission(self):
182 1
        # Client can't set himself as administrator !
183 1
        self.client.force_authenticate(user=self.user)
184
        user_data = UserSerializer(self.user).data
185 1
        user_data['is_superuser'] = True
186
        response = self.client.put("/user/%d/" % self.user.id, user_data)
187 1
        self.assertFalse(self.user.is_superuser);
188 1
189 1
    def test_edit_email_nonvalid_email(self):
190 1
        # Client wants to change his email with a non valid value
191
        self.client.force_authenticate(user=self.user)
192
        user_data = self.user_data.copy()
193 1
        user_data['email'] = "ThisIsNotAnEmail"
194
        response = self.client.put("/user/%d/" % self.user.id, user_data)
195 1
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
196 1
197
    def test_edit_email_ok(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
198 1
        # Client wants to change his email and succeed in
199
        self.client.force_authenticate(user=self.user)
200 1
        user_data = self.user_data.copy()
201 1
        user_data['email'] = "[email protected]"
202
        response = self.client.put("/user/%d/" % self.user.id, user_data)
203 1
        self.assertEqual(response.status_code, status.HTTP_200_OK)
204
        self.assertEqual(response.data['email'], user_data['email'])
205 1
        # Guarantee that tests are independant
206 1
        self.user.email = self.user_data['email']
207 1
        self.user.save()
208 1
209 1
    def test_edit_profile_wrong_permission(self):
210
        # Client wants to change another user's phone number
211
        self.client.force_authenticate(user=self.user)
212
        user_data = UserSerializer(self.user2).data
213
        user_data['phone'] = "0123456789"
214
        response = self.client.put("/user/%d/" % self.user2.id, user_data)
215
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
216
217
    def test_edit_profile_ok(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
218
        # Client wants to change his phone number
219
        self.client.force_authenticate(user=self.user)
220
        user_data = self.user_data.copy()
221
        user_data['phone'] = "0123456789"
222
        response = self.client.put("/user/%d/" % self.user.id, user_data)
223
        self.assertEqual(response.status_code, status.HTTP_200_OK)
224
        self.assertEqual(response.data['phone'], user_data['phone'])
225
        # Guarantee that tests are independant
226
        self.user.phone = self.user_data['phone']
227
        self.user.save()
228
229
    def test_edit_lastname_wrong_permission(self):
230
        # Client wants to change his lastname
231
        self.client.force_authenticate(user=self.user)
232
        user_data = self.user_data.copy()
233
        user_data['lastname'] = "Daudet"
234
        response = self.client.put("/user/%d/" % self.user.id, user_data)
235
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
236
237
    def test_edit_lastname_ok(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
238
        # Admin wants to change an user's lastname
239
        self.client.force_authenticate(user=self.admin_user)
240
        user_data = self.user_data.copy()
241
        user_data['lastname'] = "Daudet"
242
        response = self.client.put("/user/%d/" % self.user.id, user_data)
243
        self.assertEqual(response.status_code, status.HTTP_200_OK)
244
        self.assertEqual(response.data['lastname'], user_data['lastname'])
245
        # Guarantee that tests are independant
246
        self.user.lastname = self.user_data['lastname']
247
        self.user.save()
248
249
250
#### "Change password" requests
251
    def test_change_pwd_wrong_pwd(self):
252
        # Client gives a wrong old password
253
        self.user.set_password('old_pwd')
254
        self.client.force_authenticate(user=self.user)
255
        response = self.client.put('/user/change_password/', {'old_password': 'wrong', 'password': 'new_pwd'})
256
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
257
258
    def test_change_pwd_no_pwd(self):
259
        # Client gives no new password
260
        self.user.set_password('old_pwd')
261
        self.client.force_authenticate(user=self.user)
262
        response = self.client.put('/user/change_password/', {'old_password': 'old_pwd', 'password': ''})
263
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
264
265
    def test_change_pwd_ok(self):
266
        # Client successfully changes his password
267
        self.user.set_password('old_pwd')
268
        self.client.force_authenticate(user=self.user)
269
        response = self.client.put('/user/change_password/', {'old_password': 'old_pwd', 'password': 'new_strong_pwd'})
270
        self.assertEqual(response.status_code, status.HTTP_200_OK)
271
272
#### "Reset password" requests
273
    def test_reset_pwd_no_email(self):
274
        # Client gives no email
275
        response = self.client.post('/user/reset_password/', {'email': ''})
276
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
277
278
    def test_reset_pwd_no_user(self):
279
        # Client's email is not found
280
        response = self.client.post('/user/reset_password/', {'email': '[email protected]'})
281
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
282
283
    def test_reset_pwd_ok(self):
284
        # Client successfully resets his password
285
        response = self.client.post('/user/reset_password/', {'email': self.user.email})
286
        self.assertEqual(response.status_code, status.HTTP_200_OK)
287
        self.assertEqual(len(mail.outbox), 1)
288
        from sigma_core.views.user import reset_mail
289
        self.assertEqual(mail.outbox[0].subject, reset_mail['subject'])
290
291
#### "Add photo" requests
292
    def test_addphoto_ok(self):
293
        self.client.force_authenticate(user=self.user)
294
        with open("sigma_files/test_img.png", "rb") as img:
295
             response = self.client.post(self.user_url + "addphoto/", {'file': img}, format='multipart')
296
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
297
298
#### Deletion requests
299