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

GroupFieldTests.test_create_group_field_mismatch()   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.group import Group
7
from sigma_core.models.group_member import GroupMember
8
from sigma_core.models.group_member_value import GroupMemberValue
9
from sigma_core.models.group_field import GroupField
10
from sigma_core.models.validator import Validator
11
from sigma_core.tests.factories import AdminUserFactory, UserFactory, GroupFieldFactory, GroupFactory, GroupMemberFactory, GroupMemberValueFactory
12
from sigma_core.serializers.group_member_value import GroupMemberValueSerializer
13
14
15
class GroupFieldTests(APITestCase):
16
    fixtures = ['fixtures_prod.json'] # Import Validators
17
    @classmethod
18
    def setUpTestData(self):
19
        super(APITestCase, self).setUpTestData()
20
21
        # Routes
22
        self.group_field_url = "/group-member-value/"
23
24
        # Create the base Group
25
        self.group = GroupFactory()
26
27
        # Users already in group
28
        # User[0]: Not in Group
29
        # User[1]: Requested join, not accepted
30
        # User[2]: Group member
31
        # User[3]: Group admin
32
        self.users = [UserFactory(), UserFactory(), UserFactory(), UserFactory(), UserFactory(), AdminUserFactory()]
33
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
            GroupMemberFactory(user=self.users[4], group=self.group, perm_rank=0)
41
        ]
42
        # Let's add some custom fields to this Group
43
        self.validator_none = Validator.objects.all().get(html_name=Validator.VALIDATOR_NONE)
44
        self.validator_text = Validator.objects.all().get(html_name=Validator.VALIDATOR_TEXT)
45
        self.group_fields = [
46
            # First field does not require any validation
47
            GroupFieldFactory(group=self.group, validator=self.validator_none, validator_values={}),
48
            # Second field must be in the email format
49
            GroupFieldFactory(group=self.group,
50
                validator=self.validator_text,
51
                validator_values={"regex": "[^@]+@[^@]+\.[^@]+", "message": "Invalid email"}),
52
            GroupFieldFactory(group=self.group, validator=self.validator_none, validator_values={}),
53
        ]
54
55
        # And we need a second group
56
        self.group2 = GroupFactory()
57
        self.group2_user2 = GroupMemberFactory(user=self.users[4], group=self.group2, perm_rank=1)
58
        self.group2_fields = [
59
            # First field does not require any validation
60
            GroupFieldFactory(group=self.group2, validator=self.validator_none, validator_values={}),
61
            # Second field must be in the email format
62
            GroupFieldFactory(group=self.group2,
63
                validator=self.validator_text,
64
                validator_values={"regex": "[^@]+@[^@]+\.[^@]+", "message": "Invalid email"}),
65
            GroupFieldFactory(group=self.group2, validator=self.validator_none, validator_values={}),
66
        ]
67
68
        # Create some values
69
        GroupMemberValueFactory(field=self.group2_fields[0], membership=self.group2_user2, value="TextFieldValue1")
70
        GroupMemberValueFactory(field=self.group2_fields[1], membership=self.group2_user2, value="[email protected]")
71
        GroupMemberValueFactory(field=self.group_fields[2], membership=self.group_member[2], value="Field3Value__user2")
72
        GroupMemberValueFactory(field=self.group_fields[2], membership=self.group_member[3], value="Field3Value__user3")
73
74
75
    #################### TEST GROUP MEMBER VALUE CREATION ######################
76
    def try_create(self, userIdx, membershipIdx, fieldIdx, fieldValue, expectedHttpResponse):
77
        if userIdx >= 0:
78
            self.client.force_authenticate(user=self.users[userIdx])
79
        field_value = {
80
            "membership": membershipIdx,
81
            "field": fieldIdx,
82
            "value": fieldValue
83
        }
84
        resp = self.client.post(self.group_field_url, field_value)
85
        self.assertEqual(resp.status_code, expectedHttpResponse)
86
87
    # Basic permission checks
88
    def test_create_not_authed(self):
89
        self.try_create(-1, -1, self.group_fields[0].id, "ABC", status.HTTP_401_UNAUTHORIZED)
90
91
    def test_create_not_group_member(self):
92
        self.try_create(0, 0, self.group_fields[0].id, "ABC", status.HTTP_400_BAD_REQUEST)
93
94
    # Some possible hack attempts now
95
    def test_create_not_group_member2(self):
96
        self.try_create(0, self.group_member[2].id, self.group_fields[0].id, "ABC", status.HTTP_400_BAD_REQUEST)
97
98
    def test_create_other_user(self):
99
        self.try_create(1, self.group_member[2].id, self.group_fields[0].id, "ABC", status.HTTP_400_BAD_REQUEST)
100
101
    def test_create_group_field_mismatch(self):
102
        self.try_create(2, self.group2_user2.id, self.group_fields[0].id, "ABC", status.HTTP_400_BAD_REQUEST)
103
104
    def test_create_group_field_validation_fail(self):
105
        self.try_create(2, self.group_member[2].id, self.group_fields[1].id, "ABC", status.HTTP_400_BAD_REQUEST)
106
107
    # Create OK cases
108
    def test_create_group_member_not_accepted(self):
109
        self.try_create(1, self.group_member[1].id, self.group_fields[0].id, "ABC", status.HTTP_201_CREATED)
110
111
    def test_create_group_member(self):
112
        self.try_create(2, self.group_member[2].id, self.group_fields[0].id, "ABC", status.HTTP_201_CREATED)
113
114
    def test_create_group_admin(self):
115
        self.try_create(3, self.group_member[3].id, self.group_fields[0].id, "ABC", status.HTTP_201_CREATED)
116
117
    def test_create_sigma_admin(self):
118
        self.try_create(5, self.group_member[3].id, self.group_fields[0].id, "ABC", status.HTTP_201_CREATED)
119
120
    def test_create_group_field_validation_ok(self):
121
        self.try_create(2, self.group_member[2].id, self.group_fields[1].id, "[email protected]", status.HTTP_201_CREATED)
122
123
    def test_create_group_field_duplicate(self):
124
        self.try_create(2, self.group_member[2].id, self.group_fields[1].id, "[email protected]", status.HTTP_201_CREATED)
125
        self.try_create(2, self.group_member[2].id, self.group_fields[1].id, "[email protected]", status.HTTP_400_BAD_REQUEST)
126
127
    #################### TEST GROUP MEMBER VALUE LISTING #######################
128
    def try_list(self, userIdx, expectedHttpResponse):
129
        if userIdx >= 0:
130
            self.client.force_authenticate(user=self.users[userIdx])
131
        resp = self.client.get(self.group_field_url)
132
        self.assertEqual(resp.status_code, expectedHttpResponse)
133
        return resp.data
134
135
    # Basic permission checks
136
    def test_list_not_authed(self):
137
        self.try_list(-1, status.HTTP_401_UNAUTHORIZED)
138
139
    def test_list_not_group_member(self):
140
        r = self.try_list(0, status.HTTP_200_OK)
141
        self.assertEqual(len(r), 0)
142
143
    def test_list_not_accepted(self):
144
        r = self.try_list(1, status.HTTP_200_OK)
145
        self.assertEqual(len(r), GroupMemberValue.objects.all().filter(membership=self.group_member[1]).count())
146
147
    def test_list_group_member(self):
148
        r = self.try_list(2, status.HTTP_200_OK)
149
        #import pdb; pdb.set_trace()
150
        self.assertEqual(len(r), GroupMemberValue.objects.all().filter(membership__group=self.group.id).count())
151
152
    def test_list_group_member2(self):
153
        # User4 is in a different group.
154
        r = self.try_list(4, status.HTTP_200_OK)
155
        self.assertEqual(len(r), GroupMemberValue.objects.all().filter(membership__group=self.group2.id).count())
156
        self.assertEqual(len(r), 2)
157
158
    def test_list_sigma_admin(self):
159
        r = self.try_list(5, status.HTTP_200_OK)
160
        self.assertEqual(len(r), GroupMemberValue.objects.all().count())
161
162
    #################### TEST GROUP MEMBER VALUE LISTING #######################
163
    def try_update(self, userIdx, memberValue, fieldNewValue, expectedHttpResponse):
164
        if userIdx >= 0:
165
            self.client.force_authenticate(user=self.users[userIdx])
166
        memberValue.value = fieldNewValue
167
        field_value = GroupMemberValueSerializer(memberValue).data
168
        resp = self.client.put("%s%d/" % (self.group_field_url, memberValue.id), field_value)
169
        self.assertEqual(resp.status_code, expectedHttpResponse)
170
171
    def test_update_not_authed(self):
172
        self.try_update(-1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), "ABC", status.HTTP_401_UNAUTHORIZED)
173
174
    def test_update_not_group_member(self):
175
        self.try_update(0, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), "ABC", status.HTTP_404_NOT_FOUND)
176
177
    def test_update_self_invalid(self):
178
        self.try_update(1, GroupMemberValueFactory(field=self.group_fields[1], value="[email protected]", membership=self.group_member[1]), "Not_A_Valid_Email", status.HTTP_400_BAD_REQUEST)
179
180
    def test_update_membership(self):
181
        self.client.force_authenticate(user=self.users[1])
182
        memberValue = GroupMemberValueFactory(field=self.group_fields[1], value="[email protected]", membership=self.group_member[1])
183
        memberShip2 = GroupMemberFactory(user=self.users[1], group=self.group2, perm_rank=1)
184
        memberValue.membership = memberShip2
185
        field_value = GroupMemberValueSerializer(memberValue).data
186
        resp = self.client.put("%s%d/" % (self.group_field_url, memberValue.id), field_value)
187
        self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
188
189
    def test_update_self_ok(self):
190
        self.try_update(1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), "ABC", status.HTTP_200_OK)
191
192
    def test_update_sigma_admin(self):
193
        self.try_update(5, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), "ABC", status.HTTP_200_OK)
194
195
    #################### TEST GROUP MEMBER VALUE RETRIEVE ######################
196
    def try_retrieve(self, userIdx, memberValue, expectedHttpResponse):
197
        if userIdx >= 0:
198
            self.client.force_authenticate(user=self.users[userIdx])
199
        resp = self.client.get("%s%d/" % (self.group_field_url, memberValue.id))
200
        self.assertEqual(resp.status_code, expectedHttpResponse)
201
202
    def test_retrieve_not_authed(self):
203
        self.try_retrieve(-1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_401_UNAUTHORIZED)
204
205
    def test_retrieve_not_group_member(self):
206
        self.try_retrieve(0, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_404_NOT_FOUND)
207
208
    def test_retrieve_other_member_but_not_accepted(self):
209
        self.try_retrieve(1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_404_NOT_FOUND)
210
211
    def test_retrieve_self_value_not_accepted(self):
212
        self.try_retrieve(1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_200_OK)
213
214
    def test_retrieve_other_member_ok(self):
215
        self.try_retrieve(2, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_200_OK)
216
217
    def test_retrieve_sigma_admin(self):
218
        self.try_retrieve(5, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_200_OK)
219
220
    #################### TEST GROUP MEMBER VALUE DESTROY #######################
221
    def try_delete(self, userIdx, memberValue, expectedHttpResponse):
222
        if userIdx >= 0:
223
            self.client.force_authenticate(user=self.users[userIdx])
224
        resp = self.client.delete("%s%d/" % (self.group_field_url, memberValue.id))
225
        self.assertEqual(resp.status_code, expectedHttpResponse)
226
227
    def test_delete_not_authed(self):
228
        self.try_delete(-1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_401_UNAUTHORIZED)
229
230
    def test_delete_not_group_member(self):
231
        self.try_delete(0, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_404_NOT_FOUND)
232
233
    def test_delete_other_member_but_not_accepted(self):
234
        self.try_delete(1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_404_NOT_FOUND)
235
236
    def test_delete_other_member(self):
237
        self.try_delete(3, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[2]), status.HTTP_403_FORBIDDEN)
238
239
    def test_delete_self_value_not_accepted(self):
240
        self.try_delete(1, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_204_NO_CONTENT)
241
242
    def test_delete_sigma_admin(self):
243
        self.try_delete(5, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_204_NO_CONTENT)
244
245
    def test_delete_other_member(self):
246
        self.try_delete(2, GroupMemberValueFactory(field=self.group_fields[0], value="Blah", membership=self.group_member[1]), status.HTTP_403_FORBIDDEN)
247