Completed
Push — master ( 5f1adf...d1397a )
by
unknown
01:07
created

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