class TestHistoryAPIWithDonePickup(APITestCase, ExtractPaginationMixin): def setUp(self): self.member = UserFactory() self.group = GroupFactory(members=[self.member]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store, date=timezone.now() - relativedelta(days=1)) self.pickup.add_collector(self.member) PickupDate.objects.process_finished_pickup_dates() def test_pickup_done(self): self.client.force_login(self.member) response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'PICKUP_DONE') self.assertLess(parse(response.data[0]['date']), timezone.now() - relativedelta(hours=22)) def test_filter_pickup_done(self): self.client.force_login(self.member) response = self.get_results(history_url, {'typus': 'PICKUP_DONE'}) self.assertEqual(response.data[0]['typus'], 'PICKUP_DONE') response = self.get_results( history_url, {'typus': 'GROUP_JOIN'}) # unrelated event should give no result self.assertEqual(len(response.data), 0)
class PickupDateReceiverTests(WSTestCase): def setUp(self): super().setUp() self.member = UserFactory() self.group = GroupFactory(members=[self.member]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store) def test_receive_pickup_changes(self): self.client = self.connect_as(self.member) # change property date = faker.future_datetime(end_date='+30d', tzinfo=timezone.utc) self.pickup.date = date self.pickup.save() response = self.client.messages_by_topic.get('pickups:pickupdate')[0] self.assertEqual(parse(response['payload']['date']), date) # join self.client = self.connect_as(self.member) self.pickup.add_collector(self.member) response = self.client.messages_by_topic.get('pickups:pickupdate')[0] self.assertEqual(response['payload']['collector_ids'], [self.member.id]) response = self.client.messages_by_topic.get( 'conversations:conversation')[0] self.assertEqual(response['payload']['participants'], [self.member.id]) # leave self.client = self.connect_as(self.member) self.pickup.remove_collector(self.member) response = self.client.messages_by_topic.get('pickups:pickupdate')[0] self.assertEqual(response['payload']['collector_ids'], []) self.assertIn('conversations:leave', self.client.messages_by_topic.keys()) def test_receive_pickup_delete(self): self.client = self.connect_as(self.member) self.pickup.deleted = True self.pickup.save() response = self.client.messages_by_topic.get( 'pickups:pickupdate_deleted')[0] self.assertEqual(response['payload']['id'], self.pickup.id) self.assertEqual(len(self.client.messages), 1)
def test_creates_feedback_possible_notification(self): member = UserFactory() group = GroupFactory(members=[member]) store = StoreFactory(group=group) pickup = PickupDateFactory(store=store) pickup.add_collector(member) pickup.done_and_processed = True pickup.save() notification = Notification.objects.filter(user=member, type=NotificationType.FEEDBACK_POSSIBLE.value) self.assertEqual(notification.count(), 1) self.assertLessEqual( notification[0].expires_at, pickup.date + relativedelta(days=settings.FEEDBACK_POSSIBLE_DAYS) )
class TestHistoryAPIPickupForInactiveStore(APITestCase, ExtractPaginationMixin): def setUp(self): self.member = UserFactory() self.group = GroupFactory(members=[self.member]) self.store = StoreFactory(group=self.group, status='archived') self.pickup = PickupDateFactory(store=self.store, date=timezone.now() - relativedelta(days=1)) self.pickup.add_collector(self.member) PickupDateFactory(store=self.store, date=timezone.now() - relativedelta(days=1)) PickupDate.objects.process_finished_pickup_dates() def test_no_pickup_done_for_inactive_store(self): self.client.force_login(self.member) response = self.get_results(history_url, {'typus': 'PICKUP_DONE'}) self.assertEqual(len(response.data), 0) def test_no_pickup_missed_for_inactive_store(self): self.client.force_login(self.member) response = self.get_results(history_url, {'typus': 'PICKUP_MISSED'}) self.assertEqual(len(response.data), 0)
class TestPickupConversations(TestCase): def setUp(self): self.user = VerifiedUserFactory() self.group = GroupFactory(members=[self.user]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store, collectors=[self.user]) self.conversation = self.pickup.conversation def test_send_email_notifications(self): users = [VerifiedUserFactory() for _ in range(2)] [self.pickup.add_collector(u) for u in users] mail.outbox = [] ConversationMessage.objects.create(author=self.user, conversation=self.conversation, content='asdf') actual_recipients = set(m.to[0] for m in mail.outbox) expected_recipients = set(u.email for u in users) self.assertEqual(actual_recipients, expected_recipients) self.assertEqual(len(mail.outbox), 2)
class TestPickupDatesAPI(APITestCase, ExtractPaginationMixin): def setUp(self): self.url = '/api/pickup-dates/' # pickup date for group with one member and one store self.member = UserFactory() self.group = GroupFactory(members=[self.member]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store) self.pickup_url = self.url + str(self.pickup.id) + '/' self.join_url = self.pickup_url + 'add/' self.leave_url = self.pickup_url + 'remove/' self.conversation_url = self.pickup_url + 'conversation/' # not a member of the group self.user = UserFactory() # another pickup date for above store self.pickup_data = { 'date': timezone.now() + relativedelta(days=2), 'max_collectors': 5, 'store': self.store.id } # past pickup date self.past_pickup_data = { 'date': timezone.now() - relativedelta(days=1), 'max_collectors': 5, 'store': self.store.id } self.past_pickup = PickupDateFactory(store=self.store, date=timezone.now() - relativedelta(days=1)) self.past_pickup_url = self.url + str(self.past_pickup.id) + '/' self.past_join_url = self.past_pickup_url + 'add/' self.past_leave_url = self.past_pickup_url + 'remove/' def test_create_pickup(self): response = self.client.post(self.url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_create_pickup_as_user(self): self.client.force_login(user=self.user) response = self.client.post(self.url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_create_pickup_as_group_member(self): self.client.force_login(user=self.member) response = self.client.post(self.url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) def test_create_pickup_as_group_member_activates_group(self): self.client.force_login(user=self.member) self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.post(self.url, self.pickup_data, format='json') self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_create_past_pickup_date_fails(self): self.client.force_login(user=self.member) response = self.client.post(self.url, self.past_pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) def test_create_pickup_as_newcomer_fails(self): newcomer = UserFactory() self.group.groupmembership_set.create(user=newcomer) self.client.force_login(user=newcomer) response = self.client.post(self.url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_list_pickups(self): response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_list_pickups_as_user(self): self.client.force_login(user=self.user) response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(len(response.data), 0) def test_list_pickups_as_group_member(self): self.client.force_login(user=self.member) response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(len(response.data), 2) def test_retrieve_pickups(self): response = self.client.get(self.pickup_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_retrieve_pickups_as_user(self): self.client.force_login(user=self.user) response = self.client.get(self.pickup_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_retrieve_pickups_as_group_member(self): self.client.force_login(user=self.member) response = self.client.get(self.pickup_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_patch_pickup(self): response = self.client.patch(self.pickup_url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_patch_pickup_as_user(self): self.client.force_login(user=self.user) response = self.client.patch(self.pickup_url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_patch_pickup_as_group_member(self): self.client.force_login(user=self.member) response = self.client.patch(self.pickup_url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_patch_pickup_as_group_member_activates_group(self): self.client.force_login(user=self.member) self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.patch(self.pickup_url, self.pickup_data, format='json') self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_patch_max_collectors_to_negative_value_fails(self): self.client.force_login(user=self.member) response = self.client.patch(self.pickup_url, {'max_collectors': -1}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) def test_patch_past_pickup_fails(self): self.client.force_login(user=self.member) response = self.client.patch(self.past_pickup_url, self.pickup_data, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_patch_as_newcomer_fails(self): newcomer = UserFactory() self.group.groupmembership_set.create(user=newcomer) self.client.force_login(user=newcomer) response = self.client.patch(self.pickup_url, {'max_collectors': 1}, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_join_pickup(self): response = self.client.post(self.join_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_join_pickup_as_user(self): self.client.force_login(user=self.user) response = self.client.post(self.join_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_join_pickup_as_member(self): self.client.force_login(user=self.member) response = self.client.post(self.join_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) # should have access to chat response = self.client.get(self.conversation_url) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_join_pickup_as_newcomer(self): newcomer = UserFactory() self.group.groupmembership_set.create(user=newcomer) self.client.force_login(user=newcomer) response = self.client.post(self.join_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_join_pickup_as_member_activates_group(self): self.client.force_login(user=self.member) self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.post(self.join_url) self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_join_pickup_without_max_collectors_as_member(self): self.client.force_login(user=self.member) p = PickupDateFactory(max_collectors=None, store=self.store) response = self.client.post('/api/pickup-dates/{}/add/'.format(p.id)) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_join_full_pickup_fails(self): self.client.force_login(user=self.member) self.pickup.max_collectors = 1 self.pickup.save() u2 = UserFactory() GroupMembership.objects.create(group=self.group, user=u2) self.pickup.add_collector(u2) response = self.client.post(self.join_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) self.assertEqual(response.data['detail'], 'Pickup date is already full.') def test_join_past_pickup_fails(self): self.client.force_login(user=self.member) response = self.client.post(self.past_join_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_leave_pickup(self): response = self.client.post(self.leave_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_leave_pickup_as_user(self): self.client.force_login(user=self.user) response = self.client.post(self.leave_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_leave_pickup_as_member(self): self.client.force_login(user=self.member) self.pickup.add_collector(self.member) response = self.client.post(self.leave_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) # should be removed from chat response = self.client.get(self.conversation_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) def test_leave_pickup_as_newcomer(self): newcomer = UserFactory() self.group.groupmembership_set.create(user=newcomer) self.pickup.add_collector(newcomer) self.client.force_login(user=newcomer) response = self.client.post(self.leave_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_leave_pickup_activates_group(self): self.client.force_login(user=self.member) self.pickup.add_collector(self.member) self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.post(self.leave_url) self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_leave_past_pickup_fails(self): self.client.force_login(user=self.member) self.past_pickup.add_collector(self.member) response = self.client.post(self.past_leave_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_get_conversation_not_as_collector(self): self.client.force_login(user=self.member) response = self.client.get(self.conversation_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.data['detail'], 'You are not in this conversation') def test_get_conversation_as_collector(self): self.client.force_login(user=self.member) self.pickup.add_collector(self.member) response = self.client.get(self.conversation_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertIn(self.member.id, response.data['participants']) self.assertEqual(response.data['type'], 'pickup')
class FeedbackTest(APITestCase, ExtractPaginationMixin): def setUp(self): self.url = '/api/feedback/' self.member = UserFactory() self.collector = UserFactory() self.collector2 = UserFactory() self.collector3 = UserFactory() self.evil_collector = UserFactory() self.group = GroupFactory(members=[ self.member, self.collector, self.evil_collector, self.collector2, self.collector3 ]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory( store=self.store, date=timezone.now() + relativedelta(days=1), collectors=[self.collector, self.collector2, self.collector3], ) # not a member of the group self.user = UserFactory() # past pickup date self.past_pickup = PickupDateFactory( store=self.store, date=timezone.now() - relativedelta(days=1), collectors=[ self.collector, self.evil_collector, self.collector2, self.collector3 ], ) # old pickup date with feedback self.old_pickup = PickupDateFactory( store=self.store, date=timezone.now() - relativedelta(days=settings.FEEDBACK_POSSIBLE_DAYS + 2), collectors=[ self.collector3, ]) self.old_feedback = FeedbackFactory(about=self.old_pickup, given_by=self.collector3) # create feedback for POST method self.feedback_post = { 'about': self.past_pickup.id, 'weight': 2, 'comment': 'asfjk' } # create feedback for POST method without weight and comment self.feedback_without_weight_comment = { 'about': self.past_pickup.id, } # create feedback to future pickup self.future_feedback_post = { 'about': self.pickup.id, 'weight': 2, 'comment': 'asfjk' } # create feedback for an old pickup self.feedback_for_old_pickup = { 'about': self.old_pickup.id, 'weight': 5, 'comment': 'this is long ago' } # create feedback for GET method self.feedback_get = { 'given_by': self.collector, 'about': self.past_pickup, 'weight': 2, 'comment': 'asfjk2' } self.feedback_get_2 = { 'given_by': self.collector2, 'about': self.past_pickup, 'weight': 2, 'comment': 'asfjk' } # create 2 instances of feedback for GET method self.feedback = Feedback.objects.create(**self.feedback_get) Feedback.objects.create(**self.feedback_get_2) self.feedback_url = self.url + str(self.feedback.id) + '/' self.old_feedback_url = self.url + str(self.old_feedback.id) + '/' def test_create_feedback_fails_as_non_user(self): """ Non-User is not allowed to give feedback. """ response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_create_feedback_fails_as_non_group_member(self): """ User is not allowed to give feedback when not a member of the store's group. """ self.client.force_login(user=self.user) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, {'about': ['You are not member of the store\'s group.']}) def test_create_feedback_fails_as_non_collector(self): """ Group Member is not allowed to give feedback when he is not assigned to the pickup. """ self.client.force_login(user=self.member) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual(response.data, {'about': ['You aren\'t assigned to the pickup.']}) def test_create_feedback_works_as_collector(self): """ Editor is allowed to give feedback when he is assigned to the Pickup. """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) def test_create_feedback_as_newcomer_collector(self): """ Newcomer is allowed to give feedback when he is assigned to the Pickup. """ newcomer = UserFactory() self.group.groupmembership_set.create(user=newcomer) self.past_pickup.add_collector(newcomer) self.client.force_login(user=newcomer) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) def test_create_feedback_activates_group(self): self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.force_login(user=self.collector3) self.client.post(self.url, self.feedback_post, format='json') self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_create_feedback_twice_fails_for_one_pickup(self): """ Collector is not allowed to give feedback more than one time to the Pickup. """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) response = self.client.post(self.url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, { 'non_field_errors': ['The fields about, given_by must make a unique set.'] }) def test_create_feedback_fails_for_old_pickup(self): """ Collector is not allowed to give feedback for old Pickups. """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, self.feedback_for_old_pickup, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, { 'about': [ 'You can\'t give feedback for pickups more than {} days ago.' .format(settings.FEEDBACK_POSSIBLE_DAYS) ] }) def test_create_feedback_without_weight(self): """ Weight field can be empty """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, { k: v for (k, v) in self.feedback_post.items() if k is not 'weight' }) self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) self.assertIsNone(response.data['weight']) def test_create_feedback_without_comment(self): """ Comment field can be empty """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, { k: v for (k, v) in self.feedback_post.items() if k is not 'comment' }) self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data) self.assertEqual(response.data['comment'], '') def test_weight_and_comment_is_null_fails(self): """ Both comment and weight cannot be empty """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, self.feedback_without_weight_comment, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, {'non_field_errors': ['Both comment and weight cannot be blank.']}) def test_list_feedback_fails_as_non_user(self): """ Non-User is NOT allowed to see list of feedback """ response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_list_feedback_works_as_non_group_member(self): """ Non-Member doesn't see feedback but an empty list """ self.client.force_login(user=self.user) response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(len(response.data['feedback']), 0) def test_list_feedback_works_as_group_member(self): """ Member is allowed to see list of feedback """ self.client.force_login(user=self.member) with self.assertNumQueries(3): response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) feedback = response.data['feedback'] self.assertEqual(len(feedback), 3) # check related data pickup_ids = set(f['about'] for f in feedback) self.assertEqual(len(response.data['pickups']), len(pickup_ids)) self.assertEqual(set(p['id'] for p in response.data['pickups']), pickup_ids) def test_list_feedback_works_as_collector(self): """ Collector is allowed to see list of feedback """ self.client.force_login(user=self.collector) response = self.get_results(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(len(response.data['feedback']), 3) def test_retrieve_feedback_fails_as_non_user(self): """ Non-User is NOT allowed to see single feedback """ response = self.get_results(self.feedback_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_retrieve_feedback_fails_as_non_group_member(self): """ Non-Member is NOT allowed to see single feedback """ self.client.force_login(user=self.user) response = self.get_results(self.feedback_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_retrieve_feedback_works_as_group_member(self): """ Member is allowed to see single feedback """ self.client.force_login(user=self.member) response = self.get_results(self.feedback_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_retrieve_feedback_works_as_collector(self): """ Collector is allowed to see list of feedback """ self.client.force_login(user=self.collector) response = self.get_results(self.feedback_url) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) def test_create_future_feedback_fails_as_collector(self): """ Collector is NOT allowed to leave feedback for future pickup """ self.client.force_login(user=self.collector3) response = self.client.post(self.url, self.future_feedback_post) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual(response.data, {'about': ['The pickup is not done yet']}) def test_patch_feedback_fails_as_non_user(self): """ Non-user is not allowed to change feedback """ response = self.client.patch(self.feedback_url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_patch_feedback_fails_as_user(self): """ User is not allowed to change feedback """ self.client.force_login(user=self.user) response = self.client.patch(self.feedback_url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) def test_patch_feedback_fails_as_group_member(self): """ Group member is not allowed to change feedback """ self.client.force_login(user=self.member) response = self.client.patch(self.feedback_url, self.feedback_post, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_patch_feedback_fails_as_evil_collector(self): """ A collector is not allowed to change feedback if he didn't created it """ self.client.force_login(user=self.evil_collector) response = self.client.patch(self.feedback_url, {'weight': 3}, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) def test_patch_feedback_works_as_collector(self): """ Collector is allowed to change feedback """ self.client.force_login(user=self.collector) response = self.client.patch(self.feedback_url, {'weight': 3}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(response.data['weight'], 3) def test_patch_feedback_activates_group(self): self.group.status = GroupStatus.INACTIVE.value self.group.save() self.client.force_login(user=self.collector) self.client.patch(self.feedback_url, {'weight': 3}, format='json') self.group.refresh_from_db() self.assertEqual(self.group.status, GroupStatus.ACTIVE.value) def test_patch_weight_to_negative_value_fails(self): """ Collector cannot change weight to negative value """ self.client.force_login(user=self.collector) response = self.client.patch(self.feedback_url, {'weight': -1}, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) def test_patch_feedback_fails_if_pickup_too_old(self): self.client.force_login(user=self.collector3) response = self.client.patch(self.old_feedback_url, {'weight': 499}, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN, response.data) self.assertEqual( response.data['detail'], 'You can\'t give feedback for pickups more than {} days ago.'. format(settings.FEEDBACK_POSSIBLE_DAYS)) def test_patch_feedback_to_remove_weight(self): self.client.force_login(user=self.collector) response = self.client.patch(self.feedback_url, {'weight': None}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(response.data['weight'], None) def test_patch_feedback_to_remove_weight_fails_if_comment_is_empty(self): self.client.force_login(user=self.collector) self.feedback.comment = '' self.feedback.save() response = self.client.patch(self.feedback_url, {'weight': None}, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, {'non_field_errors': ['Both comment and weight cannot be blank.']}) def test_patch_feedback_to_remove_comment(self): self.client.force_login(user=self.collector) response = self.client.patch(self.feedback_url, {'comment': ''}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) self.assertEqual(response.data['comment'], '') def test_patch_feedback_to_remove_comment_fails_if_weight_is_empty(self): self.client.force_login(user=self.collector) self.feedback.weight = None self.feedback.save() response = self.client.patch(self.feedback_url, {'comment': ''}, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, {'non_field_errors': ['Both comment and weight cannot be blank.']}) def test_patch_feedback_to_remove_comment_and_weight_fails(self): self.client.force_login(user=self.collector) response = self.client.patch(self.feedback_url, { 'comment': '', 'weight': None }, format='json') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) self.assertEqual( response.data, {'non_field_errors': ['Both comment and weight cannot be blank.']})
class TestHistoryAPIWithExistingPickups(APITestCase, ExtractPaginationMixin): def setUp(self): self.member = UserFactory() self.group = GroupFactory(members=[self.member]) self.store = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store) self.pickup_url = '/api/pickup-dates/{}/'.format(self.pickup.id) self.series = PickupDateSeriesFactory(store=self.store) self.series_url = '/api/pickup-date-series/{}/'.format(self.series.id) def test_modify_pickup(self): self.client.force_login(self.member) self.client.patch(self.pickup_url, {'max_collectors': '11'}) response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'PICKUP_MODIFY') self.assertEqual(response.data[0]['payload']['max_collectors'], '11') def test_dont_modify_pickup(self): self.client.force_login(self.member) self.client.patch(self.pickup_url, {'date': self.pickup.date}) response = self.get_results(history_url) self.assertEqual(len(response.data), 0) def test_delete_pickup(self): self.client.force_login(self.member) self.client.delete(self.pickup_url) response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'PICKUP_DELETE') def test_modify_series(self): self.client.force_login(self.member) self.client.patch(self.series_url, {'max_collectors': '11'}) response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'SERIES_MODIFY') self.assertEqual(response.data[0]['payload']['max_collectors'], '11') def test_dont_modify_series(self): self.client.force_login(self.member) self.client.patch(self.series_url, {'rule': self.series.rule}) response = self.get_results(history_url) self.assertEqual(len(response.data), 0) def test_delete_series(self): self.client.force_login(self.member) self.client.delete(self.series_url) response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'SERIES_DELETE') self.assertEqual(response.data[0]['payload']['rule'], self.series.rule) def test_join_pickup(self): self.client.force_login(self.member) self.client.post(self.pickup_url + 'add/') response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'PICKUP_JOIN') self.assertEqual(parse(response.data[0]['payload']['date']), self.pickup.date) def test_leave_pickup(self): self.client.force_login(self.member) self.pickup.add_collector(self.member) self.client.post(self.pickup_url + 'remove/') response = self.get_results(history_url) self.assertEqual(response.data[0]['typus'], 'PICKUP_LEAVE') self.assertEqual(parse(response.data[0]['payload']['date']), self.pickup.date)
class TestFeedbackAPIFilter(APITestCase, ExtractPaginationMixin): def setUp(self): self.url = '/api/feedback/' # create a group with a user and two stores self.collector = UserFactory() self.collector2 = UserFactory() self.group = GroupFactory(members=[self.collector, self.collector2]) self.group2 = GroupFactory(members=[self.collector, self.collector2]) self.store = StoreFactory(group=self.group) self.store2 = StoreFactory(group=self.group) self.pickup = PickupDateFactory(store=self.store, date=timezone.now() - relativedelta(days=1)) self.pickup2 = PickupDateFactory(store=self.store2, date=timezone.now() - relativedelta(days=1)) # create a feedback data self.feedback_get = { 'given_by': self.collector, 'about': self.pickup, 'weight': 1, 'comment': 'asfjk' } self.feedback_get2 = { 'given_by': self.collector2, 'about': self.pickup2, 'weight': 2, 'comment': 'bsfjk' } # create 2 instances of feedback self.feedback = Feedback.objects.create(**self.feedback_get) self.feedback2 = Feedback.objects.create(**self.feedback_get2) # transforms the user into a collector self.pickup.add_collector(self.collector) self.pickup2.add_collector(self.collector) self.pickup2.add_collector(self.collector2) def test_filter_by_about(self): """ Filter the two feedbacks and return the one that is about 'pickup' """ self.client.force_login(user=self.collector) response = self.get_results(self.url, {'about': self.pickup.id}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['feedback'][0]['about'], self.pickup.id, response.data) self.assertEqual(len(response.data['feedback']), 1) def test_filter_by_given_by(self): """ Filter the two feedbacks and return the one that is given_by 'collector' """ self.client.force_login(user=self.collector) response = self.get_results(self.url, {'given_by': self.collector.id}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['feedback'][0]['given_by'], self.collector.id) self.assertEqual(len(response.data['feedback']), 1) def test_filter_by_store(self): """ Filter the two feedbacks and return the one that is about the pickup at 'store' """ self.client.force_login(user=self.collector) response = self.get_results(self.url, {'store': self.store.id}) self.assertEqual(response.data['feedback'][0]['id'], self.feedback.id) self.assertEqual(response.data['feedback'][0]['about'], self.pickup.id) self.assertEqual(len(response.data['feedback']), 1) def test_filter_by_store_2(self): """ Filter the two feedbacks and return the one that is about the pickup at 'store2' """ self.client.force_login(user=self.collector) response = self.get_results(self.url, {'store': self.store2.id}) self.assertEqual(response.data['feedback'][0]['id'], self.feedback2.id) self.assertEqual(response.data['feedback'][0]['about'], self.pickup2.id) self.assertEqual(len(response.data['feedback']), 1) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_filter_by_group(self): """ Filter the two feedbacks by the stores' group """ self.client.force_login(user=self.collector) response = self.get_results(self.url, {'group': self.group.id}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data['feedback']), 2) response = self.get_results(self.url, {'group': self.group2.id}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data['feedback']), 0) def test_filter_by_created_at(self): """ Filter the two feedbacks by creation date """ self.client.force_login(user=self.collector) # self.feedback is older than self.feedback2 # first, get all that are newer than self.feedback response = self.get_results( self.url, {'created_at_min': self.feedback.created_at}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data['feedback']), 2) self.assertEqual(response.data['feedback'][0]['id'], self.feedback2.id) # second, get all that are older than self.feedback response = self.get_results( self.url, {'created_at_max': self.feedback.created_at}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data['feedback']), 1) self.assertEqual(response.data['feedback'][0]['id'], self.feedback.id)