Procházet zdrojové kódy

Refactored base event handler and added some more middleware tests

Nuwan Goonasekera před 7 roky
rodič
revize
3eea00c5b2

+ 14 - 7
cloudbridge/cloud/base/events.py

@@ -10,7 +10,7 @@ from ..interfaces.exceptions import HandlerException
 log = logging.getLogger(__name__)
 
 
-class InterceptingEventHandler(EventHandler):
+class BaseEventHandler(EventHandler):
 
     def __init__(self, event_pattern, priority, callback):
         self.__dispatcher = None
@@ -58,6 +58,17 @@ class InterceptingEventHandler(EventHandler):
     def dispatcher(self, value):
         self.__dispatcher = value
 
+    def unsubscribe(self):
+        if self.dispatcher:
+            self.dispatcher.unsubscribe(self)
+
+
+class InterceptingEventHandler(BaseEventHandler):
+
+    def __init__(self, event_pattern, priority, callback):
+        super(InterceptingEventHandler, self).__init__(event_pattern, priority,
+                                                       callback)
+
     def invoke(self, event_args, *args, **kwargs):
         next_handler = self._get_next_handler(event_args.get('event'))
         event_args['next_handler'] = next_handler
@@ -68,12 +79,8 @@ class InterceptingEventHandler(EventHandler):
         event_args.pop('next_handler', None)
         return result
 
-    def unsubscribe(self):
-        if self.dispatcher:
-            self.dispatcher.unsubscribe(self)
-
 
-class ObservingEventHandler(InterceptingEventHandler):
+class ObservingEventHandler(BaseEventHandler):
 
     def __init__(self, event_pattern, priority, callback):
         super(ObservingEventHandler, self).__init__(event_pattern, priority,
@@ -92,7 +99,7 @@ class ObservingEventHandler(InterceptingEventHandler):
             return None
 
 
-class ImplementingEventHandler(InterceptingEventHandler):
+class ImplementingEventHandler(BaseEventHandler):
 
     def __init__(self, event_pattern, priority, callback):
         super(ImplementingEventHandler, self).__init__(event_pattern, priority,

+ 1 - 1
cloudbridge/cloud/base/middleware.py

@@ -59,7 +59,7 @@ def dispatch_event(event):
     def deco(f):
         @functools.wraps(f)
         def wrapper(self, *args, **kwargs):
-            events = getattr(self, 'events')
+            events = getattr(self, 'events', None)
             if events:
                 # Don't call the wrapped method, just dispatch the event,
                 # and the event handler will get invoked

+ 26 - 0
test/test_middleware_system.py

@@ -10,6 +10,7 @@ from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.middleware import intercept
 from cloudbridge.cloud.base.middleware import observe
 from cloudbridge.cloud.interfaces.exceptions import CloudBridgeBaseException
+from cloudbridge.cloud.interfaces.exceptions import HandlerException
 from cloudbridge.cloud.interfaces.exceptions import \
     InvalidConfigurationException
 from cloudbridge.cloud.interfaces.middleware import Middleware
@@ -273,6 +274,31 @@ class MiddlewareSystemTestCase(unittest.TestCase):
 
         self.assertEqual(result, None)
 
+    def test_event_decorator_no_event_property(self):
+        EVENT_NAME = "some.event.occurred"
+
+        class SomeDummyClass(object):
+
+            @dispatch_event(EVENT_NAME)
+            def my_callback_impl(self, *args, **kwargs):
+                assert 'first_pos_arg' in args
+                assert kwargs.get('a_keyword_arg') == "something"
+                return "hello"
+
+        obj = SomeDummyClass()
+        events = SimpleEventDispatcher()
+        manager = SimpleMiddlewareManager(events)
+        manager.add(obj)
+
+        # calling my_implementation should raise an exception
+        with self.assertRaises(HandlerException):
+            obj.my_callback_impl('first_pos_arg', a_keyword_arg='something')
+
+        obj.events = events
+        result = obj.my_callback_impl('first_pos_arg',
+                                      a_keyword_arg='something')
+        self.assertEqual(result, "hello")
+
 
 class ExceptionWrappingMiddlewareTestCase(unittest.TestCase):