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

GroupFieldTests.test_list_group_member2()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

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