def test_event_restrictions(self): dispatcher = Dispatcher(( 1, 2 )) handler = mock.Mock(return_value=None) self.assertTrue(dispatcher.register(1, handler)) dispatcher.dispatch(1, 'arg', kw='kw') handler.assert_called_once_with(1, 'arg', kw='kw') self.assertTrue(dispatcher.unregister(1, handler)) handler.reset_mock() self.assertFalse(dispatcher.register(-1, handler)) dispatcher.dispatch(-1, 'arg', kw='kw') handler.assert_not_called() self.assertFalse(dispatcher.unregister(-1, handler))
def test_registration(self): results = None def _handler(_i, _event): try: l = results[_i] except KeyError: l = results[_i] = [] l.append(_event) _handler1 = functools.partial(_handler, 1) _handler2 = functools.partial(_handler, 2) results = {} dispatcher = Dispatcher() self.assertTrue(dispatcher.register('a', _handler1)) self.assertFalse(dispatcher.unregister('a', _handler1, once=True)) self.assertTrue(dispatcher.unregister('a', _handler1)) dispatcher.dispatch('a') self.assertEqual(len(results), 0) results = {} dispatcher = Dispatcher() self.assertTrue(dispatcher.once('a', _handler1)) self.assertFalse(dispatcher.unregister('a', _handler1)) self.assertTrue(dispatcher.unregister('a', _handler1, once=True)) dispatcher.dispatch('a') self.assertEqual(len(results), 0) results = {} dispatcher = Dispatcher() self.assertTrue(dispatcher.on('a', _handler1)) self.assertTrue(dispatcher.on('a', _handler1)) self.assertTrue(dispatcher.once('a', _handler2)) dispatcher.dispatch('a') expected = { 1: [ 'a', 'a' ], 2: [ 'a' ], } self.assertEqual(results, expected) self.assertFalse(dispatcher.unregister('a', _handler2, once=True)) dispatcher.dispatch('a') expected[1].extend([ 'a', 'a' ]) self.assertEqual(results, expected) self.assertTrue(dispatcher.unregister('a', _handler1)) dispatcher.dispatch('a') expected[1].append('a') self.assertEqual(results, expected) self.assertTrue(dispatcher.unregister('a', _handler1)) dispatcher.dispatch('a') self.assertEqual(results, expected)
def test_dispatch_exception(self, _LOGGER): # pylint: disable=redefined-outer-name dispatcher = Dispatcher() raising_handler = mock.Mock(return_value=None) dispatcher.register('bingo', raising_handler) def _raise(_err, _event, *_args, **_kw): # pylint: disable=unused-argument raise _err(_event + ' no-go') for e in ( TypeError, ValueError, WeirdoError ): raise_e = functools.partial(_raise, e) raising_handler.side_effect = raise_e dispatcher.dispatch('bingo', 'arg', kw='kw') raising_handler.assert_called_once_with('bingo', 'arg', kw='kw') self.assertEqual(_LOGGER.warning.call_count, 1) self.assertIsNotNone(_LOGGER.warning.call_args) warning_args, warning_kw = _LOGGER.warning.call_args self.assertEqual(len(warning_args), 1) self.assertTrue(warning_args[0].startswith('exception raised from event callback ')) self.assertEqual(len(warning_kw), 1) self.assertIs(warning_kw.get('exc_info', False), True) raising_handler.reset_mock() raising_handler.side_effect = None _LOGGER.reset_mock()