Ejemplo n.º 1
0
    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        exchange = Exchange(failing_logger)
        ts_error = TestSubscriber(exchange)
        ts_after_error = TestSubscriber(exchange)

        event = Event("bong")
        exchange.subscribe("bong",ts_error.bad_call)
        exchange.subscribe("bong",ts_after_error.callme)

        exchange.publish(event)

        failing_logger.error.assert_has_calls([call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"),1)
Ejemplo n.º 2
0
    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(
            self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        exchange = Exchange(failing_logger)
        ts_error = TestSubscriber(exchange)
        ts_after_error = TestSubscriber(exchange)

        event = Event("bong")
        exchange.subscribe("bong", ts_error.bad_call)
        exchange.subscribe("bong", ts_after_error.callme)

        exchange.publish(event)

        failing_logger.error.assert_has_calls(
            [call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"), 1)
Ejemplo n.º 3
0
class EventTestCase(unittest.TestCase):
    def setUp(self):
        self.last_event = Event("None")
        self.events = {}
        self.exchange = Exchange(test_logger(logging.ERROR))

    def event_recorder(self, event):
        self.last_event = event
        self.events[event.name].append(event)

    def listen(self, event_name):
        self.events[event_name] = []
        self.exchange.subscribe(event_name, self.event_recorder)

    def event_count(self, event_name):
        if event_name in self.events:
            return len(self.events[event_name])
        else:
            return 0
Ejemplo n.º 4
0
class EventTestCase(unittest.TestCase):

    def setUp(self):
        self.last_event = Event("None")
        self.events = {}
        self.exchange = Exchange(test_logger(logging.ERROR))

    def event_recorder(self,event):
        self.last_event = event
        self.events[event.name].append(event)

    def listen(self,event_name):
        self.events[event_name] = []
        self.exchange.subscribe(event_name,self.event_recorder)

    def event_count(self,event_name):
        if event_name in self.events:
            return len(self.events[event_name])
        else:
            return 0
Ejemplo n.º 5
0
class TestEventSource(unittest.TestCase):
    def setUp(self):
        self.mock_logger = Mock()
        self.exchange = Exchange(self.mock_logger)
        self.timer = Mock()
        self.last_event = None

    def event_recorder(self, event):
        self.last_listened_event = event
        self.event_count += 1

    def intercept_publish(self, event):
        self.exchange.original_publish(event)
        if event.name == EventName.tick:
            raise RuntimeError("oops")

    def listen(self, event_name):
        self.event_count = 0
        self.exchange.subscribe(event_name, self.event_recorder)

    def after(self, times, event_name):
        self.ticks_left = times
        self.end_event_name = event_name

    def count_down_ticks(self, args):
        self.ticks_left -= 1
        if self.ticks_left <= 0:
            self.exchange.publish(Event(self.end_event_name))

    def finish(self, args):
        self.exchange.publish(Event(EventName.end))

    def test_should_publish_start_navigation_event(self):
        self.listen(EventName.start)
        self.timer.wait_for = Mock(side_effect=self.finish)

        event_source = EventSource(self.exchange, self.timer, self.mock_logger,
                                   CONFIG)
        event_source.start()

        self.assertEqual(self.last_listened_event.name, EventName.start)

    def test_should_publish_a_tick_event(self):
        self.listen(EventName.tick)
        self.timer.wait_for = Mock(side_effect=self.finish)

        event_source = EventSource(self.exchange, self.timer, self.mock_logger,
                                   CONFIG)
        event_source.start()

        self.assertEqual(self.last_listened_event.name, EventName.tick)

    def test_should_publish_multiple_events_until_nav_complete(self):
        self.listen(EventName.tick)
        self.after(5, EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        event_source = EventSource(self.exchange, self.timer, self.mock_logger,
                                   CONFIG)
        event_source.start()

        self.assertEqual(self.event_count, 5)

    def test_errors_should_be_logged_and_events_continue(self):
        self.listen(EventName.tick)
        self.after(2, EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        self.exchange.original_publish = self.exchange.publish
        self.exchange.publish = self.intercept_publish

        event_source = EventSource(self.exchange, self.timer, self.mock_logger,
                                   CONFIG)
        event_source.start()

        self.mock_logger.error.assert_has_calls(
            [call('EventSource, RuntimeError: oops')])
        self.assertEqual(self.event_count, 2)

    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(
            self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        self.listen(EventName.tick)
        self.after(2, EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        self.exchange.original_publish = self.exchange.publish
        self.exchange.publish = self.intercept_publish

        event_source = EventSource(self.exchange, self.timer, failing_logger,
                                   CONFIG)
        event_source.start()

        failing_logger.error.assert_has_calls(
            [call('EventSource, RuntimeError: oops')])
        self.assertEqual(self.event_count, 2)
Ejemplo n.º 6
0
class TestEvents(unittest.TestCase):
    def setUp(self):
        self.mock_logger = Mock()
        self.exchange = Exchange(self.mock_logger)

    def test_should_return_nil_event_if_not_called(self):
        ts = TestSubscriber()
        self.assertEqual(ts.last_event_called.name, "nil")

    def test_should_call_back(self):
        ts = TestSubscriber(self.exchange)

        self.exchange.subscribe("thing", ts.callme)
        self.exchange.publish(Event("thing"))

    def test_should_ignore_events_with_no_subscribers_and_log_warning(self):
        self.exchange.publish(Event("doesnotexist"))
        self.mock_logger.warn.assert_called_with(
            "Event(doesnotexist) published but no subscribers")

    def test_should_be_able_to_unsubscribe(self):
        ts1 = TestSubscriber(self.exchange)
        self.exchange.subscribe("never", ts1.callme)
        self.exchange.unsubscribe("never", ts1.callme)
        self.exchange.publish(Event("never"))

        self.assertEqual(ts1.last_event_called.name, "nil")
        self.mock_logger.warn.assert_called_with(
            "Event(never) published but no subscribers")

    def test_should_accept_unsubscribe_without_subscribe(self):
        ts1 = TestSubscriber(self.exchange)
        self.exchange.unsubscribe("never", ts1.callme)
        self.exchange.publish(Event("never"))

        self.assertEqual(ts1.last_event_called.name, "nil")
        self.mock_logger.warn.assert_called_with(
            "Event(never) published but no subscribers")

    def test_should_signal_events_to_multiple_subscribers(self):
        ts1 = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("boo", ts1.callme)
        self.exchange.subscribe("boo", ts2.callme)
        self.exchange.publish(Event("boo"))

        self.assertEqual(ts1.last_event_called.name, "boo")
        self.assertEqual(ts2.last_event_called.name, "boo")

    def test_should_be_able_to_chain_events(self):
        ts1 = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("chain", ts1.callme)
        self.exchange.subscribe("secondevent", ts2.callme)
        self.exchange.publish(Event("chain"))

        self.assertEqual(ts2.last_event_called.name, "secondevent")

    def test_should_chain_a_few_events(self):
        ts = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("chain", ts.callme)
        self.exchange.subscribe("secondevent", ts.callme)
        self.exchange.subscribe("secondevent", ts2.callme)
        self.exchange.publish(Event("chain"))

        self.assertEqual(ts.event_call_count("secondevent"), 1)
        self.assertEqual(ts2.event_call_count("secondevent"), 1)

    def test_should_call_events_again_if_we_signal_primary_event_again(self):
        ts = TestSubscriber(self.exchange)
        event = Event("bing")
        self.exchange.subscribe("bing", ts.callme)
        self.exchange.publish(event)
        self.exchange.publish(event)
        self.exchange.publish(event)

        self.assertEqual(ts.event_call_count("bing"), 3)

    def test_errors_should_be_logged_and_event_processing_continues(self):
        ts_error = TestSubscriber(self.exchange)
        ts_after_error = TestSubscriber(self.exchange)
        event = Event("bong")
        self.exchange.subscribe("bong", ts_error.bad_call)
        self.exchange.subscribe("bong", ts_after_error.callme)

        self.exchange.publish(event)

        self.mock_logger.error.assert_has_calls(
            [call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"), 1)

    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(
            self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        exchange = Exchange(failing_logger)
        ts_error = TestSubscriber(exchange)
        ts_after_error = TestSubscriber(exchange)

        event = Event("bong")
        exchange.subscribe("bong", ts_error.bad_call)
        exchange.subscribe("bong", ts_after_error.callme)

        exchange.publish(event)

        failing_logger.error.assert_has_calls(
            [call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"), 1)
Ejemplo n.º 7
0
class TestEvents(unittest.TestCase):
    def setUp(self):
        self.mock_logger = Mock()
        self.exchange = Exchange(self.mock_logger)

    def test_should_return_nil_event_if_not_called(self):
        ts = TestSubscriber()
        self.assertEqual(ts.last_event_called.name,"nil")

    def test_should_call_back(self):
        ts = TestSubscriber(self.exchange)

        self.exchange.subscribe("thing",ts.callme)
        self.exchange.publish(Event("thing"))

    def test_should_ignore_events_with_no_subscribers_and_log_warning(self):
        self.exchange.publish(Event("doesnotexist"))
        self.mock_logger.warn.assert_called_with("Event(doesnotexist) published but no subscribers")

    def test_should_be_able_to_unsubscribe(self):
        ts1 = TestSubscriber(self.exchange)
        self.exchange.subscribe("never",ts1.callme)
        self.exchange.unsubscribe("never",ts1.callme)
        self.exchange.publish(Event("never"))

        self.assertEqual(ts1.last_event_called.name,"nil")
        self.mock_logger.warn.assert_called_with("Event(never) published but no subscribers")

    def test_should_accept_unsubscribe_without_subscribe(self):
        ts1 = TestSubscriber(self.exchange)
        self.exchange.unsubscribe("never",ts1.callme)
        self.exchange.publish(Event("never"))

        self.assertEqual(ts1.last_event_called.name,"nil")
        self.mock_logger.warn.assert_called_with("Event(never) published but no subscribers")

    def test_should_signal_events_to_multiple_subscribers(self):
        ts1 = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("boo",ts1.callme)
        self.exchange.subscribe("boo",ts2.callme)
        self.exchange.publish(Event("boo"))

        self.assertEqual(ts1.last_event_called.name,"boo")
        self.assertEqual(ts2.last_event_called.name,"boo")

    def test_should_be_able_to_chain_events(self):
        ts1 = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("chain",ts1.callme)
        self.exchange.subscribe("secondevent",ts2.callme)
        self.exchange.publish(Event("chain"))

        self.assertEqual(ts2.last_event_called.name,"secondevent")

    def test_should_chain_a_few_events(self):
        ts = TestSubscriber(self.exchange)
        ts2 = TestSubscriber(self.exchange)

        self.exchange.subscribe("chain",ts.callme)
        self.exchange.subscribe("secondevent",ts.callme)
        self.exchange.subscribe("secondevent",ts2.callme)
        self.exchange.publish(Event("chain"))

        self.assertEqual(ts.event_call_count("secondevent"),1)
        self.assertEqual(ts2.event_call_count("secondevent"),1)

    def test_should_call_events_again_if_we_signal_primary_event_again(self):
        ts = TestSubscriber(self.exchange)
        event = Event("bing")
        self.exchange.subscribe("bing",ts.callme)
        self.exchange.publish(event)
        self.exchange.publish(event)
        self.exchange.publish(event)

        self.assertEqual(ts.event_call_count("bing"),3)

    def test_errors_should_be_logged_and_event_processing_continues(self):
        ts_error = TestSubscriber(self.exchange)
        ts_after_error = TestSubscriber(self.exchange)
        event = Event("bong")
        self.exchange.subscribe("bong",ts_error.bad_call)
        self.exchange.subscribe("bong",ts_after_error.callme)

        self.exchange.publish(event)

        self.mock_logger.error.assert_has_calls([call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"),1)

    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        exchange = Exchange(failing_logger)
        ts_error = TestSubscriber(exchange)
        ts_after_error = TestSubscriber(exchange)

        event = Event("bong")
        exchange.subscribe("bong",ts_error.bad_call)
        exchange.subscribe("bong",ts_after_error.callme)

        exchange.publish(event)

        failing_logger.error.assert_has_calls([call('Exchange, RuntimeError: oops')])
        self.assertEqual(ts_after_error.event_call_count("bong"),1)
Ejemplo n.º 8
0
class TestEventSource(unittest.TestCase):

    def setUp(self):
        self.mock_logger = Mock()
        self.exchange = Exchange(self.mock_logger)
        self.timer = Mock()
        self.last_event = None

    def event_recorder(self,event):
        self.last_listened_event = event
        self.event_count += 1

    def intercept_publish(self,event):
        self.exchange.original_publish(event)
        if event.name == EventName.tick:
            raise RuntimeError("oops")

    def listen(self,event_name):
        self.event_count = 0
        self.exchange.subscribe(event_name,self.event_recorder)

    def after(self,times,event_name):
        self.ticks_left = times
        self.end_event_name = event_name

    def count_down_ticks(self,args):
        self.ticks_left -= 1
        if self.ticks_left <= 0:
            self.exchange.publish(Event(self.end_event_name))

    def finish(self,args):
        self.exchange.publish(Event(EventName.end))

    def test_should_publish_start_navigation_event(self):
        self.listen(EventName.start)
        self.timer.wait_for = Mock(side_effect=self.finish)

        event_source = EventSource(self.exchange,self.timer, self.mock_logger,CONFIG)
        event_source.start()

        self.assertEqual(self.last_listened_event.name,EventName.start)

    def test_should_publish_a_tick_event(self):
        self.listen(EventName.tick)
        self.timer.wait_for = Mock(side_effect=self.finish)

        event_source = EventSource(self.exchange, self.timer, self.mock_logger, CONFIG)
        event_source.start()

        self.assertEqual(self.last_listened_event.name,EventName.tick)

    def test_should_publish_multiple_events_until_nav_complete(self):
        self.listen(EventName.tick)
        self.after(5,EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        event_source = EventSource(self.exchange,self.timer, self.mock_logger,CONFIG)
        event_source.start()

        self.assertEqual(self.event_count,5)

    def test_errors_should_be_logged_and_events_continue(self):
        self.listen(EventName.tick)
        self.after(2,EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        self.exchange.original_publish = self.exchange.publish
        self.exchange.publish = self.intercept_publish

        event_source = EventSource(self.exchange,self.timer, self.mock_logger,CONFIG)
        event_source.start()

        self.mock_logger.error.assert_has_calls([call('EventSource, RuntimeError: oops')])
        self.assertEqual(self.event_count,2)

    def test_errors_during_logging_should_be_ignored_and_event_processing_continues(self):
        failing_logger = Mock()
        failing_logger.configure_mock(**{'error.side_effect': RuntimeError})

        self.listen(EventName.tick)
        self.after(2,EventName.end)
        self.timer.wait_for = Mock(side_effect=self.count_down_ticks)

        self.exchange.original_publish = self.exchange.publish
        self.exchange.publish = self.intercept_publish

        event_source = EventSource(self.exchange,self.timer, failing_logger,CONFIG)
        event_source.start()

        failing_logger.error.assert_has_calls([call('EventSource, RuntimeError: oops')])
        self.assertEqual(self.event_count,2)