Completed
Push — master ( 275057...223d4e )
by
unknown
10s
created

MessageTests.test_update_wrong_way()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 6
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 6
loc 6
rs 9.4285
cc 1
1
from django.core.files.uploadedfile import SimpleUploadedFile
2
3
from rest_framework import status
4
from rest_framework.test import APITestCase, force_authenticate
5
6
from sigma_core.tests.factories import UserFactory, AdminUserFactory
7
8
from sigma_chat.tests.factories import ChatFactory, ChatMemberFactory, MessageFactory
9
10
from sigma_chat.models.message import Message
11
12
13
def reload(obj):
14
    return obj.__class__.objects.get(pk=obj.pk)
15
16
17
class MessageTests(APITestCase):
18
    def setUp(self):
19
        # Summary: 4 users + 1 admin, 2 chats
20
        # User #5 is Sigma admin
21
        # User #1 is creator of and sent 1 message to chat #1, User #3 is member of, and sent 1 message to chat#1
22
        # User #2 is creator of, and sent 1 message to chat #2, User #1 is member of, and sent 1 message to chat #2
23
24
        super(MessageTests, self).setUp()
25
        self.users = UserFactory.create_batch(4) + [AdminUserFactory()]
26
        self.chats = ChatFactory.create_batch(2)
27
        self.chatmembers = [
28
            ChatMemberFactory(is_creator=True, is_admin=True, chat=self.chats[0], user=self.users[0]),
29
            ChatMemberFactory(is_creator=False, is_admin=False, chat=self.chats[1], user=self.users[0]),
30
            ChatMemberFactory(is_creator=True, is_admin=True, chat=self.chats[1], user=self.users[1]),
31
            ChatMemberFactory(is_creator=False, is_admin=False, chat=self.chats[0], user=self.users[2])
32
        ]
33
        self.messages = [
34
            MessageFactory(chat_id=self.chats[0], chatmember_id=self.chatmembers[0]),
35
            MessageFactory(chat_id=self.chats[1], chatmember_id=self.chatmembers[1]),
36
            MessageFactory(chat_id=self.chats[1], chatmember_id=self.chatmembers[2]),
37
            MessageFactory(chat_id=self.chats[0], chatmember_id=self.chatmembers[3]),
38
        ]
39
40
        self.messages_url = "/message/"
41
        self.message_url = self.messages_url + "%d/"
42
        self.create_message_url = "/chatmember/{0}/send_message/"
43
44
        f = SimpleUploadedFile("file.txt", b"file_content")
45
        self.new_message_data = {"chatmember_id": self.chatmembers[0].id, "chat_id": self.chats[0].id, "text": "text", 'attachment': f}
46
        self.new_message_data_right_way = {"text": "text", "attachment": f}
47
48
49
#### Model methods test
50
    def test_model_message(self):
51
        self.assertEqual(len(self.messages), 4)
52
        self.assertEqual(len(self.chats[0].message.all()), 2)
53
        self.assertEqual(len(self.chats[1].message.all()), 2)
54
        # Test that user 1 is sender of message 1
55
        self.assertEqual(self.messages[0].chatmember_id.id,self.chatmembers[0].id)
56
        self.assertEqual(self.messages[0].chat_id.id, self.chats[0].id)
57
        # Test that user 1 is sender of message 2
58
        self.assertEqual(self.messages[1].chatmember_id.id,self.chatmembers[1].id)
59
        self.assertEqual(self.messages[1].chat_id.id, self.chats[1].id)
60
        # Test that user 2 is sender of message 3
61
        self.assertEqual(self.messages[2].chatmember_id.id,self.chatmembers[2].id)
62
        self.assertEqual(self.messages[2].chat_id.id, self.chats[1].id)
63
        # Test that user 3 is sender of message 4
64
        self.assertEqual(self.messages[3].chatmember_id.id,self.chatmembers[3].id)
65
        self.assertEqual(self.messages[3].chat_id.id, self.chats[0].id)
66
67
#### List requests
68
    def test_get_messages_list_unauthed(self):
69
        # Client not authenticated
70
        response = self.client.get(self.messages_url)
71
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
72
73
    def test_get_messages_list_limited(self):
74
        # Client authenticated and can see limited list of messages
75
        self.client.force_authenticate(user=self.users[0])
76
        response = self.client.get(self.messages_url)
77
        self.assertEqual(response.status_code, status.HTTP_200_OK)
78
        self.assertEqual(len(response.data), 4)
79
80
    def test_get_messages_list_limited2(self):
81
        # Client authenticated and can see limited list of messages
82
        self.client.force_authenticate(user=self.users[1])
83
        response = self.client.get(self.messages_url)
84
        self.assertEqual(response.status_code, status.HTTP_200_OK)
85
        self.assertEqual(len(response.data), 2)
86
87
    def test_get_messages_list_limited3(self):
88
        # Client authenticated and can see limited list of messages
89
        self.client.force_authenticate(user=self.users[2])
90
        response = self.client.get(self.messages_url)
91
        self.assertEqual(response.status_code, status.HTTP_200_OK)
92
        self.assertEqual(len(response.data), 2)
93
94
    def test_get_messages_list_limited4(self):
95
        # Client authenticated and can see limited list of messages
96
        self.client.force_authenticate(user=self.users[3])
97
        response = self.client.get(self.messages_url)
98
        self.assertEqual(response.status_code, status.HTTP_200_OK)
99
        self.assertEqual(len(response.data), 0)
100
101
    def test_get_messages_list_admin(self):
102
        # Admin authenticated and can see limited list of messages
103
        self.client.force_authenticate(user=self.users[-1])
104
        response = self.client.get(self.messages_url)
105
        self.assertEqual(response.status_code, status.HTTP_200_OK)
106
        self.assertEqual(len(response.data), 0)
107
108
#### Get requests
109
    def test_get_message_unauthed(self):
110
        # Client is not authenticated
111
        response = self.client.get(self.message_url % self.messages[0].id)
112
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
113
114
    def test_get_message_member(self):
115
        # Client can see its messages
116
        self.client.force_authenticate(user=self.users[0])
117
        response = self.client.get(self.message_url % self.messages[0].id)
118
        self.assertEqual(response.status_code, status.HTTP_200_OK)
119
        self.assertEqual(len(response.data), 6) # Message has 6 fields
120
121
    def test_get_message_not_member(self):
122
        # Client cannot see messages if he's not a member of the chat it belongs to
123
        self.client.force_authenticate(user=self.users[1])
124
        response = self.client.get(self.message_url % self.messages[0].id)
125
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
126
127
#### Create requests
128
    def test_create_unauthed(self):
129
        # Client is not authenticated
130
        response = self.client.post(self.messages_url, self.new_message_data, format='multipart')
131
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
132
        self.assertEqual(Message.objects.all().count(), len(self.messages))
133
134
    # Only members of the chat can create a message for this chat, but on the chatmember's page
135
    def test_create_message_wrong_way(self):
136
        self.client.force_authenticate(user=self.users[0])
137
        response = self.client.post(self.messages_url, self.new_message_data, format='multipart')
138
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
139
        self.assertEqual(Message.objects.all().count(), len(self.messages))
140
141
142
    def test_create_message_wrong_method(self):
143
        self.client.force_authenticate(user=self.users[0])
144
        response = self.client.get(self.create_message_url.format(self.messages[0].id))
145
        self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
146
        self.assertEqual(Message.objects.all().count(), len(self.messages))
147
148
    def test_create_message_non_existent_chatmember(self):
149
        self.client.force_authenticate(user=self.users[0])
150
        response = self.client.post(self.create_message_url.format(10), self.new_message_data_right_way, format='multipart')
151
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
152
        self.assertEqual(Message.objects.all().count(), len(self.messages))
153
154 View Code Duplication
    def test_create_message_not_self(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
155
        self.client.force_authenticate(user=self.users[2])
156
        response = self.client.post(self.create_message_url.format(self.chatmembers[0].id), self.new_message_data_right_way, format='multipart')
157
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
158
        self.assertEqual(Message.objects.all().count(), len(self.messages))
159
160 View Code Duplication
    def test_create_message_member(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
161
        self.client.force_authenticate(user=self.users[0])
162
        response = self.client.post(self.create_message_url.format(self.chatmembers[0].id), self.new_message_data_right_way, format='multipart')
163
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
164
        self.assertEqual(Message.objects.all().count(), len(self.messages) + 1)
165
166 View Code Duplication
    def test_create_message_no_content(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
167
        self.client.force_authenticate(user=self.users[0])
168
        response = self.client.post(self.create_message_url.format(self.chatmembers[0].id), {'text':""})
169
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
170
        self.assertEqual(Message.objects.all().count(), len(self.messages))
171
172
#### Modification requests
173 View Code Duplication
    def test_update_wrong_way(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
174
        # Cannot change a message
175
        self.client.force_authenticate(user=self.users[0])
176
        response = self.client.put(self.message_url % self.messages[0].id, {'text': "new_text"})
177
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
178
        self.assertEqual(reload(self.messages[0]), self.messages[0])
179