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)
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)
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())
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)
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)