Completed
Pull Request — master (#16)
by
unknown
53s
created

test_validate_route_not_authed()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 2
rs 10
1
import json
2
3
from django.core import mail
4
5
from rest_framework import status
6
from rest_framework.test import APITestCase
7
8
from sigma_core.models.user import User
9
from sigma_core.models.group import Group
10
from sigma_core.models.group_member import GroupMember
11
from sigma_core.models.group_field import GroupField
12
from sigma_core.models.validator import Validator
13
from sigma_core.tests.factories import UserFactory, GroupFieldFactory, GroupFactory, GroupMemberFactory
14
15
16
class GroupFieldTests(APITestCase):
17
    fixtures = ['fixtures_prod.json']
18
    @classmethod
19
    def setUpTestData(self):
20
        super(APITestCase, self).setUpTestData()
21
22
        # Routes
23
        self.group_field_url = "/group-field/"
24
25
        # Group open to anyone
26
        self.group = GroupFactory()
27
28
        # Users already in group
29
        # User[0]: Not in Group
30
        # User[1]: Requested join, not accepted
31
        # User[2]: Group member
32
        # User[3]: Group admin
33
        self.users = [UserFactory(), UserFactory(), UserFactory(), UserFactory()]
34
        # Associated GroupMember
35
        self.group_member = [
36
                None,
37
                GroupMemberFactory(user=self.users[1], group=self.group, perm_rank=0),
38
                GroupMemberFactory(user=self.users[2], group=self.group, perm_rank=1),
39
                GroupMemberFactory(user=self.users[3], group=self.group, perm_rank=Group.ADMINISTRATOR_RANK)
40
            ]
41
        self.validator_none = Validator.objects.all().get(html_name=Validator.VALIDATOR_NONE)
42
        self.validator_text = Validator.objects.all().get(html_name=Validator.VALIDATOR_TEXT)
43
        self.group_field = GroupFieldFactory(group=self.group, validator=self.validator_none, validator_values={})
44
45
        # Misc
46
        # If you need to test validators more in deep, see test_validators.py
47
        self.new_field_data = {"group": self.group.id,
48
            "name": "Example Group Field",
49
            "validator": Validator.VALIDATOR_NONE,
50
            "validator_values": {}}
51
        self.new_field_data_invalid = {"group": self.group.id,
52
            "name": "I am invaliiiid !",
53
            "validator": Validator.VALIDATOR_TEXT,
54
            "validator_values": {"regex": "zek$er$z$)!~", "message": ""}}
55
        self.new_field_data_email_validator = {"group": self.group.id,
56
            "name": "Email verification",
57
            "validator": Validator.VALIDATOR_TEXT,
58
            "validator_values": {"regex": "[^@]+@[^@]+\.[^@]+", "message": "Invalid email"}}
59
60
    def test_imported_validators(self):
61
        self.assertTrue(Validator.objects.all().filter(html_name=Validator.VALIDATOR_NONE).exists())
62
63
    #################### TEST GROUP FIELD CREATION ########################
64
    def try_create(self, user, data=None):
65
        if data is None:
66
            data = self.new_field_data
67
        self.client.force_authenticate(user=user)
68
        resp = self.client.post(self.group_field_url, data)
69
        return resp.status_code
70
71
    def test_create_not_authed(self):
72
        self.assertEqual(self.try_create(None), status.HTTP_401_UNAUTHORIZED)
73
74
    def test_create_not_group_member(self):
75
        self.assertEqual(self.try_create(self.users[0]), status.HTTP_403_FORBIDDEN)
76
77
    def test_create_not_group_accepted(self):
78
        self.assertEqual(self.try_create(self.users[1]), status.HTTP_403_FORBIDDEN)
79
80
    def test_create_not_group_admin(self):
81
        self.assertEqual(self.try_create(self.users[2]), status.HTTP_403_FORBIDDEN)
82
83
    def test_create_ok(self):
84
        self.assertEqual(self.try_create(self.users[3]), status.HTTP_201_CREATED)
85
86
    #################### TEST GROUP FIELD DELETION ########################
87
    def try_delete(self, user):
88
        self.client.force_authenticate(user=user)
89
        resp = self.client.delete(self.group_field_url + str(self.group_field.id) + "/")
90
        return resp.status_code
91
92
    def test_delete_not_authed(self):
93
        self.assertEqual(self.try_delete(None), status.HTTP_401_UNAUTHORIZED)
94
        self.assertTrue(GroupField.objects.all().filter(id=self.group_field.id).exists())
95
96
    def test_delete_not_group_member(self):
97
        self.assertEqual(self.try_delete(self.users[0]), status.HTTP_404_NOT_FOUND)
98
        self.assertTrue(GroupField.objects.all().filter(id=self.group_field.id).exists())
99
100
    def test_delete_not_group_accepted(self):
101
        self.assertEqual(self.try_delete(self.users[1]), status.HTTP_403_FORBIDDEN)
102
        self.assertTrue(GroupField.objects.all().filter(id=self.group_field.id).exists())
103
104
    def test_delete_not_group_admin(self):
105
        self.assertEqual(self.try_delete(self.users[2]), status.HTTP_403_FORBIDDEN)
106
        self.assertTrue(GroupField.objects.all().filter(id=self.group_field.id).exists())
107
108
    def test_delete_ok(self):
109
        self.assertEqual(self.try_delete(self.users[3]), status.HTTP_204_NO_CONTENT)
110
        self.assertFalse(GroupField.objects.all().filter(id=self.group_field.id).exists())
111
112
    #################### TEST GROUP FIELD LIST    ########################
113
    def test_list_not_authed(self):
114
        resp = self.client.get(self.group_field_url)
115
        self.assertEqual(resp.status_code, status.HTTP_401_UNAUTHORIZED)
116
117
    def test_list_no_group(self):
118
        self.client.force_authenticate(user=self.users[0])
119
        resp = self.client.get(self.group_field_url)
120
        self.assertEqual(resp.status_code, status.HTTP_200_OK)
121
        self.assertFalse(any(resp.data))
122
123
    def test_list_in_group_not_accepted(self):
124
        from sigma_core.serializers.group_field import GroupFieldSerializer
125
        self.client.force_authenticate(user=self.users[1])
126
        resp = self.client.get(self.group_field_url)
127
        self.assertEqual(resp.status_code, status.HTTP_200_OK)
128
        self.assertEqual(len(resp.data), 1)
129
        self.assertEqual(resp.data[0], GroupFieldSerializer(self.group_field).data)
130
131
    def test_list_in_group(self):
132
        from sigma_core.serializers.group_field import GroupFieldSerializer
133
        self.client.force_authenticate(user=self.users[2])
134
        resp = self.client.get(self.group_field_url)
135
        self.assertEqual(resp.status_code, status.HTTP_200_OK)
136
        self.assertEqual(len(resp.data), 1)
137
        self.assertEqual(resp.data[0], GroupFieldSerializer(self.group_field).data)
138
139
    #################### TEST GROUP FIELD UPDATE ########################
140
    def try_update(self, user, allow):
141
        from sigma_core.serializers.group_field import GroupFieldSerializer
142
        group_field = GroupFieldFactory(group=self.group, validator=self.validator_none, validator_values={}, name="AAA")
143
        group_field_old = GroupFieldSerializer(group_field).data
144
        group_field_new = GroupFieldSerializer(group_field).data
145
        group_field_new["name"] = "BBB"
146
147
        self.client.force_authenticate(user=user)
148
        resp = self.client.put("%s%d/" % (self.group_field_url, group_field.id), group_field_new)
149
        group_field = GroupField.objects.all().get(id=group_field.id)
150
        if allow:
151
            self.assertEqual(GroupFieldSerializer(group_field).data, group_field_new)
152
        else:
153
            self.assertEqual(GroupFieldSerializer(group_field).data, group_field_old)
154
        return resp
155
156
    def test_update_not_authed(self):
157
        r = self.try_update(None, False)
158
        self.assertEqual(r.status_code, status.HTTP_401_UNAUTHORIZED)
159
160
    def test_update_not_group_member(self):
161
        r = self.try_update(self.users[0], False)
162
        self.assertEqual(r.status_code, status.HTTP_404_NOT_FOUND)
163
164
    def test_update_not_accepted(self):
165
        r = self.try_update(self.users[1], False)
166
        self.assertEqual(r.status_code, status.HTTP_403_FORBIDDEN)
167
168
    def test_update_not_admin(self):
169
        r = self.try_update(self.users[2], False)
170
        self.assertEqual(r.status_code, status.HTTP_403_FORBIDDEN)
171
172
    def test_update_ok(self):
173
        r = self.try_update(self.users[3], True)
174
        self.assertEqual(r.status_code, status.HTTP_200_OK)
175
176
177
    #################### A FEW TESTS FOR VALIDATION ########################
178
    def test_create_invalid_regex(self):
179
        self.assertEqual(self.try_create(self.users[3], self.new_field_data_invalid),
180
            status.HTTP_400_BAD_REQUEST)
181
182
    def test_create_valid_regex(self):
183
        self.assertEqual(self.try_create(self.users[3], self.new_field_data_email_validator),
184
            status.HTTP_201_CREATED)
185
186
187
class GroupFieldValidatorTests(APITestCase):
188
    fixtures = ['fixtures_prod.json']
189
    @classmethod
190
    def setUpTestData(self):
191
        super(APITestCase, self).setUpTestData()
192
193
        # Routes
194
        self.group_field_url = "/group-field/"
195
196
        # Group open to anyone
197
        self.group = GroupFactory()
198
199
        # Users already in group
200
        # User[0]: Not in Group
201
        # User[1]: Requested join, not accepted
202
        # User[2]: Group member
203
        # User[3]: Group admin
204
        self.users = [UserFactory(), UserFactory(), UserFactory(), UserFactory()]
205
        # Associated GroupMember
206
        self.group_member = [
207
                None,
208
                GroupMemberFactory(user=self.users[1], group=self.group, perm_rank=0),
209
                GroupMemberFactory(user=self.users[2], group=self.group, perm_rank=1),
210
                GroupMemberFactory(user=self.users[3], group=self.group, perm_rank=Group.ADMINISTRATOR_RANK)
211
            ]
212
        self.validator_none = Validator.objects.all().get(html_name=Validator.VALIDATOR_NONE)
213
214
        # If you need to test validators more in deep, see test_validators.py
215
        self.validator_text = Validator.objects.all().get(html_name=Validator.VALIDATOR_TEXT)
216
        self.email_vdtor = GroupFieldFactory(group=self.group,
217
                validator=self.validator_text,
218
                validator_values={"regex": "[a-z0-9]*@[a-z0-9]*.[a-z]{2,3}", "message": "Invalid email"})
219
220
    #################### ../{pk}/validate ########################
221
    def _test_validate_input(self, user, validatorId, input, expectHttp, isInputValid):
222
        self.client.force_authenticate(user=user)
223
        resp = self.client.post("%s%d/validate/" % (self.group_field_url, validatorId), {"value": input})
224
        self.assertEqual(resp.status_code, expectHttp)
225
        if resp.status_code == status.HTTP_200_OK:
226
            if isInputValid:
227
                self.assertEqual(resp.data['status'], "ok")
228
            else:
229
                self.assertEqual(resp.data['status'], "ko")
230
231
    def test_validate_route_not_authed(self):
232
        self._test_validate_input(None, self.email_vdtor.id, "[email protected]", status.HTTP_401_UNAUTHORIZED, True)
233
234
    def test_validate_route_not_group_member(self):
235
        self._test_validate_input(self.users[0], self.email_vdtor.id, "[email protected]", status.HTTP_404_NOT_FOUND, True)
236
237
    def test_validate_route_not_accepted_ok(self):
238
        self._test_validate_input(self.users[1], self.email_vdtor.id, "[email protected]", status.HTTP_200_OK, True)
239
240
    def test_validate_route_not_admin_ok(self):
241
        self._test_validate_input(self.users[2], self.email_vdtor.id, "[email protected]", status.HTTP_200_OK, True)
242
243
    def test_validate_route_admin_ok(self):
244
        self._test_validate_input(self.users[3], self.email_vdtor.id, "[email protected]", status.HTTP_200_OK, True)
245
246
    def test_validate_route_bad_email(self):
247
        self._test_validate_input(self.users[3], self.email_vdtor.id, "ThisIsNoAnEmail", status.HTTP_200_OK, False)
248
249
    def test_validate_route_bad_validator(self):
250
        self._test_validate_input(self.users[3], -1, "[email protected]", status.HTTP_404_NOT_FOUND, True)
251