class PickupDateReceiverTests(WSTestCase):
    def setUp(self):
        super().setUp()
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.pickup = PickupDateFactory(place=self.place)

    def test_receive_pickup_changes(self):
        self.client = self.connect_as(self.member)

        # change property
        date = to_range(
            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'][0]), date.start)

        # 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']['collectors'], [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']['collectors'], [])

        self.assertIn('conversations:leave',
                      self.client.messages_by_topic.keys())

    def test_receive_pickup_delete(self):
        self.client = self.connect_as(self.member)

        pickup_id = self.pickup.id
        self.pickup.delete()

        response = self.client.messages_by_topic.get(
            'pickups:pickupdate_deleted')[0]
        self.assertEqual(response['payload']['id'], pickup_id)

        self.assertEqual(len(self.client.messages), 1)
    def test_deletes_pickup_upcoming_notification(self):
        user = UserFactory()
        group = GroupFactory(members=[user])
        place = PlaceFactory(group=group)
        in_one_hour = to_range(timezone.now() + relativedelta(hours=1))
        pickup = PickupDateFactory(place=place,
                                   date=in_one_hour,
                                   collectors=[user])
        Notification.objects.all().delete()

        create_pickup_upcoming_notifications.call_local()
        pickup.remove_collector(user)

        notifications = Notification.objects.filter(
            type=NotificationType.PICKUP_UPCOMING.value)
        self.assertEqual(notifications.count(), 0)
class PickupDateReceiverTests(WSTestCase):
    def setUp(self):
        super().setUp()
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.pickup = PickupDateFactory(place=self.place)

    def test_receive_pickup_changes(self):
        client = self.connect_as(self.member)

        # change property
        date = to_range(
            faker.future_datetime(end_date='+30d', tzinfo=timezone.utc))
        self.pickup.date = date
        self.pickup.save()

        response = client.messages_by_topic.get('pickups:pickupdate')[0]
        self.assertEqual(parse(response['payload']['date'][0]), date.start)

        # join
        client = self.connect_as(self.member)
        self.pickup.add_collector(self.member)

        response = client.messages_by_topic.get('pickups:pickupdate')[0]
        self.assertEqual(response['payload']['collectors'], [self.member.id])

        response = client.messages_by_topic.get(
            'conversations:conversation')[0]
        self.assertEqual(response['payload']['participants'], [self.member.id])

        # leave
        client = self.connect_as(self.member)
        self.pickup.remove_collector(self.member)

        response = client.messages_by_topic.get('pickups:pickupdate')[0]
        self.assertEqual(response['payload']['collectors'], [])

        self.assertIn('conversations:leave', client.messages_by_topic.keys())

    def test_mark_as_done(self):
        self.pickup.add_collector(self.member)
        Notification.objects.all().delete()
        client = self.connect_as(self.member)
        self.pickup.is_done = True
        self.pickup.save()

        messages = client.messages_by_topic
        self.assertEqual(len(messages['status']), 2, messages['status'])
        self.assertEqual(messages['status'][0]['payload'],
                         {'unseen_notification_count': 1})
        self.assertEqual(
            messages['status'][1]['payload'],
            {'groups': {
                self.group.id: {
                    'feedback_possible_count': 1
                }
            }})
        self.assertEqual(len(messages['notifications:notification']), 1,
                         messages['notifications:notification'])
        self.assertEqual(
            messages['notifications:notification'][0]['payload']['type'],
            'feedback_possible')

    def test_receive_pickup_delete(self):
        client = self.connect_as(self.member)

        pickup_id = self.pickup.id
        self.pickup.delete()

        response = client.messages_by_topic.get(
            'pickups:pickupdate_deleted')[0]
        self.assertEqual(response['payload']['id'], pickup_id)

        self.assertEqual(len(client.messages), 1)