svthalia/concrexit

View on GitHub
website/pushnotifications/tests/test_pizzas.py

Summary

Maintainability
F
4 days
Test Coverage
from django.test import TestCase
from django.utils import timezone

from events import payables
from events.models import Event, EventRegistration
from members.models import Member, Membership, Profile
from pizzas.models import FoodEvent, FoodOrder, Product
from pushnotifications.models import FoodOrderReminderMessage


class TestFoodEventNotifications(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.time = timezone.now()
        cls.member = Member.objects.create(username="user1")
        Profile.objects.create(user=cls.member)
        Membership.objects.create(
            user=cls.member, type=Membership.MEMBER, since="2000-01-01"
        )

        cls.member2 = Member.objects.create(username="user2")
        Profile.objects.create(user=cls.member2)
        Membership.objects.create(
            user=cls.member2, type=Membership.MEMBER, since="2000-01-01"
        )

        cls.not_current_member = Member.objects.create(username="user3")
        Profile.objects.create(user=cls.not_current_member)

        cls.event = Event.objects.create(
            title="Test event",
            start=cls.time + timezone.timedelta(days=1),
            end=cls.time + timezone.timedelta(days=2),
        )

        cls.product = Product.objects.create(name="Test product", price=10)

    def setUp(self):
        payables.register()

    def test_create_food_event_schedules_notification(self):
        """Creating a food event schedules a notification with the right users."""
        with self.subTest("send_notification=True, registration not required"):
            food_event = FoodEvent.objects.create(
                event=self.event,
                send_notification=True,
                start=self.time + timezone.timedelta(days=1),
                end=self.time + timezone.timedelta(days=2),
            )

            self.assertIsNotNone(food_event.end_reminder)
            self.assertIn(self.member, food_event.end_reminder.users.all())
            self.assertIn(self.member2, food_event.end_reminder.users.all())
            self.assertNotIn(
                self.not_current_member, food_event.end_reminder.users.all()
            )

        food_event.delete()

        with self.subTest("send_notification=False, registration not required"):
            food_event = FoodEvent.objects.create(
                event=self.event,
                send_notification=False,
                start=self.time + timezone.timedelta(days=1),
                end=self.time + timezone.timedelta(days=2),
            )

            self.assertFalse(hasattr(food_event, "end_reminder"))
            self.assertFalse(
                FoodOrderReminderMessage.objects.filter(food_event=food_event).exists()
            )

        food_event.delete()

        self.event.registration_start = self.time - timezone.timedelta(days=1)
        self.event.registration_end = self.time
        self.event.save()

        EventRegistration.objects.create(event=self.event, member=self.member)

        with self.subTest("send_notification=True, registration required"):
            food_event = FoodEvent.objects.create(
                event=self.event,
                send_notification=True,
                start=self.time + timezone.timedelta(days=1),
                end=self.time + timezone.timedelta(days=2),
            )

            self.assertIsNotNone(food_event.end_reminder)
            self.assertIn(self.member, food_event.end_reminder.users.all())
            self.assertNotIn(self.member2, food_event.end_reminder.users.all())
            self.assertNotIn(
                self.not_current_member, food_event.end_reminder.users.all()
            )

        food_event.delete()

        with self.subTest("send_notification=False, registration required"):
            food_event = FoodEvent.objects.create(
                event=self.event,
                send_notification=False,
                start=self.time + timezone.timedelta(days=1),
                end=self.time + timezone.timedelta(days=2),
            )

            self.assertFalse(hasattr(food_event, "end_reminder"))
            self.assertFalse(
                FoodOrderReminderMessage.objects.filter(food_event=food_event).exists()
            )

        food_event.delete()

    def test_update_food_event(self):
        """Updating the event creates or deletes the notification."""
        food_event = FoodEvent.objects.create(
            event=self.event,
            send_notification=False,
            start=self.time + timezone.timedelta(days=1),
            end=self.time + timezone.timedelta(days=2),
        )

        self.assertFalse(hasattr(food_event, "end_reminder"))

        food_event.send_notification = True
        food_event.save()

        self.assertIsNotNone(food_event.end_reminder)

        food_event.send_notification = False
        food_event.save()

        self.assertFalse(hasattr(food_event, "end_reminder"))

        food_event.send_notification = True
        food_event.save()

        food_event.end = self.time
        food_event.save()

        self.assertFalse(hasattr(food_event, "end_reminder"))

    def test_register_updates_message_users(self):
        """Registering for an event updates the notification users."""
        self.event.registration_start = self.time - timezone.timedelta(days=1)
        self.event.registration_end = self.time
        self.event.save()

        food_event = FoodEvent.objects.create(
            event=self.event,
            send_notification=True,
            start=self.time + timezone.timedelta(days=1),
            end=self.time + timezone.timedelta(days=2),
        )

        self.assertIsNotNone(food_event.end_reminder)
        self.assertNotIn(self.member2, food_event.end_reminder.users.all())

        registration = EventRegistration.objects.create(
            event=self.event, member=self.member2
        )

        self.assertIn(self.member2, food_event.end_reminder.users.all())

        registration.date_cancelled = timezone.now()
        registration.save()

        self.assertNotIn(self.member2, food_event.end_reminder.users.all())

    def test_order_updates_message_users(self):
        """Ordering food updates the notification users."""
        food_event = FoodEvent.objects.create(
            event=self.event,
            send_notification=True,
            start=self.time + timezone.timedelta(days=1),
            end=self.time + timezone.timedelta(days=2),
        )

        self.assertIsNotNone(food_event.end_reminder)
        self.assertIn(self.member, food_event.end_reminder.users.all())

        order = FoodOrder.objects.create(
            food_event=food_event, member=self.member, product=self.product
        )

        self.assertNotIn(self.member, food_event.end_reminder.users.all())

        order.delete()

        self.assertIn(self.member, food_event.end_reminder.users.all())