Ejemplo n.º 1
0
 def test_reaction_create(self):
     user = UserFactory()
     conversation = ConversationFactory()
     conversation.sync_users([user])
     message = conversation.messages.create(author=user, content='hello')
     message.reactions.create(message=message, user=user, name='tada')
     self.assertEqual(ConversationMessageReaction.objects.filter(message=message, user=user).count(), 1)
Ejemplo n.º 2
0
 def test_reaction_remove(self):
     # setup
     user = UserFactory()
     conversation = ConversationFactory()
     conversation.sync_users([user])
     message = conversation.messages.create(author=user, content='hello')
     # creating reaction
     message.reactions.create(message=message, user=user, name='tada')
     instance = ConversationMessageReaction.objects.get(message=message, user=user, name='tada')
     # remove reaction
     instance.delete()
     self.assertEqual(ConversationMessageReaction.objects.filter(message=message, user=user).count(), 0)
Ejemplo n.º 3
0
 def test_sync_users(self):
     user1 = UserFactory()
     user2 = UserFactory()
     user3 = UserFactory()
     user4 = UserFactory()
     users = [user1, user2, user3]
     conversation = ConversationFactory()
     conversation.join(user1)  # should not be added again
     conversation.join(user4)  # should be removed
     conversation.sync_users(users)
     self.assertEqual(conversation.participants.count(), 3)
     self.assertIn(user1, conversation.participants.all())
     self.assertIn(user2, conversation.participants.all())
     self.assertIn(user3, conversation.participants.all())
     self.assertNotIn(user4, conversation.participants.all())
Ejemplo n.º 4
0
class TestConversationsAPI(APITestCase):
    def setUp(self):
        self.participant1 = UserFactory()
        self.participant2 = UserFactory()
        self.participant3 = UserFactory()
        self.not_participant1 = UserFactory()
        self.not_participant2 = UserFactory()
        self.not_participant3 = UserFactory()
        self.conversation1 = ConversationFactory()
        self.conversation1.sync_users(
            [self.participant1, self.participant2, self.participant3])
        self.conversation1.messages.create(author=self.participant1,
                                           content='hello')
        self.conversation2 = ConversationFactory()
        self.conversation2.sync_users([self.participant1])
        self.conversation2.messages.create(author=self.participant1,
                                           content='hello2')
        self.conversation3 = ConversationFactory()  # conversation noone is in

    def test_get_messages(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/?conversation={}'.format(
            self.conversation1.id),
                                   format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 1)
        self.assertEqual(response.data['results'][0]['content'], 'hello')

    def test_can_get_messages_for_all_conversations(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/', format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 2)
        self.assertEqual(response.data['results'][0]['content'], 'hello2')
        self.assertEqual(response.data['results'][1]['content'], 'hello')

    def test_cannot_get_messages_if_not_in_conversation(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/?conversation={}'.format(
            self.conversation3.id),
                                   format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_same_error_if_conversation_does_not_exist_as_if_you_are_just_not_in_it(
            self):
        self.client.force_login(user=self.participant1)
        response = self.client.get(
            '/api/messages/?conversation={}'.format(982398723), format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_create_message(self):
        conversation = ConversationFactory()
        conversation.join(self.participant1)
        self.client.force_login(user=self.participant1)
        data = {'conversation': conversation.id, 'content': 'a nice message'}
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                         response.data)
        self.assertEqual(response.data['content'], data['content'])
        self.assertEqual(conversation.messages.first().content,
                         data['content'])
        self.assertEqual(conversation.messages.first().created_at,
                         parse(response.data['created_at']), response.data)
        self.assertEqual(conversation.messages.first().id, response.data['id'])
        self.assertEqual(conversation.messages.first().author.id,
                         response.data['author'])

    def test_cannot_create_message_without_specifying_conversation(self):
        self.client.force_login(user=self.participant1)
        data = {'content': 'a nice message'}
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

    def test_cannot_create_message_if_not_in_conversation(self):
        self.client.force_login(user=self.participant1)
        data = {
            'conversation': self.conversation3.id,
            'content': 'a nice message'
        }
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
Ejemplo n.º 5
0
class TestConversationsAPI(APITestCase):
    def setUp(self):
        self.participant1 = UserFactory()
        self.participant2 = UserFactory()
        self.participant3 = UserFactory()
        self.not_participant1 = UserFactory()
        self.not_participant2 = UserFactory()
        self.not_participant3 = UserFactory()
        self.conversation1 = ConversationFactory()
        self.conversation1.sync_users(
            [self.participant1, self.participant2, self.participant3])
        self.conversation1.messages.create(author=self.participant1,
                                           content='hello')
        self.conversation2 = ConversationFactory()
        self.conversation2.sync_users([self.participant1])
        self.conversation2.messages.create(author=self.participant1,
                                           content='hello2')
        self.conversation3 = ConversationFactory()  # conversation noone is in

    def test_conversations_list(self):
        self.conversation1.messages.create(author=self.participant1,
                                           content='yay')
        self.conversation1.messages.create(author=self.participant1,
                                           content='second!')
        conversation2 = ConversationFactory(
            participants=[self.participant1, self.participant2])
        conversation2.messages.create(author=self.participant1, content='yay')
        self.client.force_login(user=self.participant1)

        response = self.client.get('/api/conversations/', format='json')
        response_conversations = response.data['results']['conversations']
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        # is ordered by latest message first
        self.assertEqual(
            [conversation['id'] for conversation in response_conversations],
            [conversation2.id, self.conversation1.id, self.conversation2.id],
        )

    def test_list_conversations_with_related_data_efficiently(self):
        user = UserFactory()
        group = GroupFactory(members=[user])
        store = StoreFactory(group=group)
        pickup = PickupDateFactory(store=store)
        application = GroupApplicationFactory(user=UserFactory(), group=group)

        conversations = [
            Conversation.objects.get_or_create_for_target(t)
            for t in (group, pickup, application)
        ]
        [c.sync_users([user]) for c in conversations]
        [c.messages.create(content='hey', author=user) for c in conversations]

        self.client.force_login(user=user)
        with self.assertNumQueries(9):
            response = self.client.get('/api/conversations/',
                                       {'group': group.id},
                                       format='json')
        results = response.data['results']

        self.assertEqual(len(results['conversations']), len(conversations))
        self.assertEqual(results['pickups'][0]['id'], pickup.id)
        self.assertEqual(results['applications'][0]['id'], application.id)

    def test_list_only_unread_conversations(self):
        self.conversation1.messages.create(author=self.participant2,
                                           content='unread')
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/conversations/?exclude_read=True',
                                   format='json')
        conversations = response.data['results']['conversations']
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(conversations[0]['id'], self.conversation1.id)
        self.assertEqual(len(conversations), 1)

    def test_list_messages(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/?conversation={}'.format(
            self.conversation1.id),
                                   format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 1)
        self.assertEqual(response.data['results'][0]['content'], 'hello')

    def test_get_message(self):
        self.client.force_login(user=self.participant1)
        message_id = self.conversation1.messages.first().id
        response = self.client.get('/api/messages/{}/'.format(message_id),
                                   format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['id'], message_id)

    def test_can_get_messages_for_all_conversations(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/', format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 2)
        self.assertEqual(response.data['results'][0]['content'], 'hello2')
        self.assertEqual(response.data['results'][1]['content'], 'hello')

    def test_cannot_get_messages_if_not_in_conversation(self):
        self.client.force_login(user=self.participant1)
        response = self.client.get('/api/messages/?conversation={}'.format(
            self.conversation3.id),
                                   format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_same_error_if_conversation_does_not_exist_as_if_you_are_just_not_in_it(
            self):
        self.client.force_login(user=self.participant1)
        response = self.client.get(
            '/api/messages/?conversation={}'.format(982398723), format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_create_message(self):
        conversation = ConversationFactory(participants=[self.participant1])

        self.client.force_login(user=self.participant1)
        data = {'conversation': conversation.id, 'content': 'a nice message'}
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                         response.data)
        self.assertEqual(response.data['content'], data['content'])
        self.assertEqual(conversation.messages.first().content,
                         data['content'])
        self.assertEqual(conversation.messages.first().created_at,
                         parse(response.data['created_at']), response.data)
        self.assertEqual(conversation.messages.first().id, response.data['id'])
        self.assertEqual(conversation.messages.first().author.id,
                         response.data['author'])

    def test_cannot_create_message_without_specifying_conversation(self):
        self.client.force_login(user=self.participant1)
        data = {'content': 'a nice message'}
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

    def test_cannot_create_message_if_not_in_conversation(self):
        self.client.force_login(user=self.participant1)
        data = {
            'conversation': self.conversation3.id,
            'content': 'a nice message'
        }
        response = self.client.post('/api/messages/', data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)