예제 #1
0
    class Tester(unittest.TestCase):
        def setUp(self):
            user = User(username="******", first_name="Foo", last_name="Bar", email="*****@*****.**")
            user.save()
            self.player1 = Player(user=user, cell_phone="07123 4567890", other_phone="01234 567890")
            self.player1.save()
            user = User(username="******", first_name="Foo", last_name="Baz", email="*****@*****.**")
            user.save()
            self.player2 = Player(user=user)
            self.player2.save()

        def tearDown(self):
            self.player1.user.delete()
            self.player2.user.delete()
            self.player1.delete()
            self.player2.delete()

        @staticmethod
        def create_filter(player, earliest, latest, notice, days):
            filter = EventFilter(player=player, earliest=earliest, latest=latest, notice_period_minutes=notice)
            filter.save()
            for day in days:
                filter.days.add(day)

        def test_GIVEN_db_WHEN_deserializing_THEN_expected_config_returned(self):
            Tester.create_filter(self.player1, "09:00", "09:30", 270, [6])  # 9-9:30 on saturdays
            Tester.create_filter(self.player1, "19:00", "20:30", 360, [1, 2, 3, 4, 5])  # 7-8:30pm weekdays

            notifier = TestNotifier(datetime.datetime(1999, 1, 1))
            filters = notifier.userfilters.get(self.player1.id)
            self.assertIsNotNone(filters)

            def get_instance_from_list(lst, cls, count=1):
                ntimes = 0
                for i in lst:
                    if isinstance(i, cls):
                        ntimes += 1
                        if ntimes == count:
                            return i
                self.fail("could not find instance of {cls} in list".format(**locals()))

            self.assertIsInstance(filters, evt_filters.And)
            lst1 = filters.filters
            self.assertEqual(3, len(lst1))

            not_user = get_instance_from_list(lst1, evt_filters.Not)
            self.assertIsInstance(not_user.filter, evt_filters.IsPerson)
            self.assertEqual(not_user.filter.person, self.player1.user.get_full_name())

            cuttoff = get_instance_from_list(lst1, evt_filters.Not, 2)
            self.assertIsInstance(cuttoff.filter, evt_filters.IsFutureEvent)
            self.assertEqual(FUTURE_CUTTOFF, cuttoff.filter.delay)

            event_filters = get_instance_from_list(lst1, evt_filters.Or)
            event_filters = event_filters.filters
            self.assertEqual(2, len(event_filters))

            def test_filter(filter, player, start_time, end_time, notice, days):
                self.assertIsInstance(filter, evt_filters.And)
                filter_lst = filter.filters
                self.assertEqual(3, len(filter_lst))
                timefilt = get_instance_from_list(filter_lst, evt_filters.TimeOfDay)
                self.assertEqual(datetime.datetime.strptime(start_time, "%H:%M").time(), timefilt.starttime)
                self.assertEqual(datetime.datetime.strptime(end_time, "%H:%M").time(), timefilt.endtime)
                dayfilt = get_instance_from_list(filter_lst, evt_filters.DaysOfWeek)
                self.assertEqual(days, dayfilt.days)
                noticfilt = get_instance_from_list(filter_lst, evt_filters.IsFutureEvent)
                self.assertEqual(datetime.timedelta(minutes=notice), noticfilt.delay)

            test_filter(event_filters[0], self.player1, "09:00", "09:30", 270, [6])
            test_filter(event_filters[1], self.player1, "19:00", "20:30", 360, [1, 2, 3, 4, 5])

        def test_GIVEN_time_range_WHEN_filtering_events_THEN_only_events_within_time_range_returned(self):
            Tester.create_filter(self.player1, "09:00", "10:30", 0, [6])  # 9-10:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 6, 0))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 8, 59), name="Baz Baz", court=1
            )  # saturday 8:59
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 31), name="Baz Baz", court=1
            )  # saturday 10:31
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 0), name="Baz Baz", court=1
            )  # saturday 9:00
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

            notifier.recorder.clear()

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 30), name="Baz Baz", court=1
            )  # saturday 10:30
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_day_filter_WHEN_filtering_events_THEN_only_events_on_given_days_returned(self):
            Tester.create_filter(self.player1, "09:00", "10:30", 0, [6])  # 9-10:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 6, 0))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 3, 9, 15), name="Baz Baz", court=1
            )  # sunday 9:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNone(evt_list)

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_notice_period_WHEN_filtering_events_THEN_only_events_with_enough_notice_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 180, [6])  # 9-12:30 on saturdays, 3hrs notice
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 8, 0))  # saturday 8am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 12, 15), name="Baz Baz", court=1
            )  # saturday 12:15
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_zero_notice_period_WHEN_filtering_events_THEN_only_future_events_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 0, [6])  # 9-12:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 10, 0))  # saturday 10am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 9, 15), name="Baz Baz", court=1
            )  # saturday 9:15
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 0), name="Baz Baz", court=1
            )  # saturday 10:00
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 2, 10, 1), name="Baz Baz", court=1
            )  # saturday 10:01
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_event_WHEN_filtering_events_THEN_only_events_within_one_week_returned(self):
            Tester.create_filter(self.player1, "09:00", "12:30", 0, [6])  # 9-12:30 on saturdays
            notifier = TestNotifier(datetime.datetime(1999, 1, 2, 10, 0))  # saturday 10am

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 10, 01), name="Baz Baz", court=1
            )  # next saturday 10:01
            notifier.process_removed_events([removed_event])
            self.assertIsNone(notifier.recorder.get(self.player1.id))

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 10, 0), name="Baz Baz", court=1
            )  # next saturday 10:00
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)
            notifier.recorder.clear()

            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(1999, 1, 9, 9, 59), name="Baz Baz", court=1
            )  # next saturday 09:59
            notifier.process_removed_events([removed_event])
            evt_list = notifier.recorder.get(self.player1.id)
            self.assertIsNotNone(evt_list)
            self.assertEqual([removed_event], evt_list)

        def test_GIVEN_eventlist_WHEN_composing_email_THEN_expected_content_returned(self):
            removed_event = BookingSystemEvent(
                start_time=datetime.datetime(2099, 2, 3, 20, 00), name="Foo Bar", court=2
            )
            notifier = Notifier(datetime.datetime(2099, 2, 3))

            def send_email(subject, text_body, html_body, from_address, to_list):
                expected_link = "http://booking.wokingsquashclub.org/edit_entry_fixed.php?room=2&area=1&hour=20&minute=00&year=2099&month=2&day=3"
                self.assertTrue(expected_link in text_body)
                self.assertTrue(expected_link in html_body)
                self.assertEqual("Court Cancellation", subject)
                self.assertEqual("*****@*****.**", from_address)
                self.assertEqual([self.player1.user.email], to_list)

            notifier.send_email = send_email
            notifier.notify(removed_event, [self.player1.id])