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