From 62d7dfcfe37cfc11ef47b6d24d062dea7e40c8ef Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Wed, 9 Aug 2017 18:35:10 +0100
Subject: [PATCH] Test coverage

---
 .../dummy_notification_listener.py            |  6 +-
 .../tests/__init__.py                         |  0
 .../tests/test_dummy_notification_listener.py | 34 ++++++++++
 ...est_dummy_notification_listener_factory.py | 23 +++++++
 .../test_dummy_notification_listener_model.py | 22 +++++++
 .../dummy/ui_notification/tests/__init__.py   |  0
 .../tests/test_ui_notification.py             | 65 +++++++++++++++++++
 .../dummy/ui_notification/ui_notification.py  | 39 ++++++-----
 force_bdss/tests/utils.py                     | 13 ++++
 9 files changed, 182 insertions(+), 20 deletions(-)
 create mode 100644 force_bdss/core_plugins/dummy/dummy_notification_listener/tests/__init__.py
 create mode 100644 force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener.py
 create mode 100644 force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_factory.py
 create mode 100644 force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_model.py
 create mode 100644 force_bdss/core_plugins/dummy/ui_notification/tests/__init__.py
 create mode 100644 force_bdss/core_plugins/dummy/ui_notification/tests/test_ui_notification.py
 create mode 100644 force_bdss/tests/utils.py

diff --git a/force_bdss/core_plugins/dummy/dummy_notification_listener/dummy_notification_listener.py b/force_bdss/core_plugins/dummy/dummy_notification_listener/dummy_notification_listener.py
index 77d96ae..c40f567 100644
--- a/force_bdss/core_plugins/dummy/dummy_notification_listener/dummy_notification_listener.py
+++ b/force_bdss/core_plugins/dummy/dummy_notification_listener/dummy_notification_listener.py
@@ -12,9 +12,11 @@ class DummyNotificationListener(BaseNotificationListener):
             print(event.__class__.__name__)
         elif isinstance(event, MCOProgressEvent):
             print(event.__class__.__name__, event.input, event.output)
+        else:
+            print(event.__class__.__name__)
 
     def initialize(self, model):
-        print("Initializing persistent state")
+        print("Initializing")
 
     def finalize(self, model):
-        print("Finalizing persistent state")
+        print("Finalizing")
diff --git a/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/__init__.py b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener.py b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener.py
new file mode 100644
index 0000000..eff062c
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener.py
@@ -0,0 +1,34 @@
+import unittest
+
+from force_bdss.api import BaseMCOEvent
+from force_bdss.notification_listeners.base_notification_listener_factory \
+    import \
+    BaseNotificationListenerFactory
+from force_bdss.notification_listeners.base_notification_listener_model \
+    import \
+    BaseNotificationListenerModel
+from force_bdss.tests.utils import captured_output
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.core_plugins.dummy.dummy_notification_listener \
+    .dummy_notification_listener import \
+    DummyNotificationListener
+
+
+class TestDummyNotificationListener(unittest.TestCase):
+    def test_initialization(self):
+        listener = DummyNotificationListener(
+            mock.Mock(spec=BaseNotificationListenerFactory))
+        model = mock.Mock(spec=BaseNotificationListenerModel)
+        event = mock.Mock(spec=BaseMCOEvent)
+        with captured_output() as (out, err):
+            listener.initialize(model)
+            listener.deliver(model, event)
+            listener.finalize(model)
+
+        self.assertEqual(out.getvalue(),
+                         "Initializing\nBaseMCOEvent\nFinalizing\n")
diff --git a/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_factory.py b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_factory.py
new file mode 100644
index 0000000..2df47b1
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_factory.py
@@ -0,0 +1,23 @@
+
+import unittest
+
+from envisage.plugin import Plugin
+
+from force_bdss.core_plugins.dummy.dummy_notification_listener\
+    .dummy_notification_listener_factory import \
+    DummyNotificationListenerFactory
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class TestDummyNotificationListenerFactory(unittest.TestCase):
+    def test_create_methods(self):
+        factory = DummyNotificationListenerFactory(mock.Mock(spec=Plugin))
+        model = factory.create_model()
+        self.assertEqual(model.factory, factory)
+
+        listener = factory.create_listener()
+        self.assertEqual(listener.factory, factory)
diff --git a/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_model.py b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_model.py
new file mode 100644
index 0000000..5200f61
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_notification_listener/tests/test_dummy_notification_listener_model.py
@@ -0,0 +1,22 @@
+import unittest
+
+from envisage.plugin import Plugin
+
+from force_bdss.core_plugins.dummy.dummy_notification_listener\
+    .dummy_notification_listener_factory import \
+    DummyNotificationListenerFactory
+from force_bdss.core_plugins.dummy.dummy_notification_listener\
+    .dummy_notification_listener_model import \
+    DummyNotificationListenerModel
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class TestDummyNotificationListenerModel(unittest.TestCase):
+    def test_initialization(self):
+        factory = mock.Mock(spec=DummyNotificationListenerFactory)
+        model = DummyNotificationListenerModel(factory)
+        self.assertEqual(model.factory, factory)
diff --git a/force_bdss/core_plugins/dummy/ui_notification/tests/__init__.py b/force_bdss/core_plugins/dummy/ui_notification/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/force_bdss/core_plugins/dummy/ui_notification/tests/test_ui_notification.py b/force_bdss/core_plugins/dummy/ui_notification/tests/test_ui_notification.py
new file mode 100644
index 0000000..159a371
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/ui_notification/tests/test_ui_notification.py
@@ -0,0 +1,65 @@
+import unittest
+
+from force_bdss.core_plugins.dummy.ui_notification.ui_notification import \
+    UINotification
+from force_bdss.core_plugins.dummy.ui_notification.ui_notification_factory \
+    import \
+    UINotificationFactory
+from force_bdss.core_plugins.dummy.ui_notification.ui_notification_model \
+    import \
+    UINotificationModel
+from force_bdss.mco.events import MCOStartEvent
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+import zmq
+
+
+class TestUINotification(unittest.TestCase):
+    def setUp(self):
+        self.context = mock.Mock(spec=zmq.Context)
+        self.rep_socket = mock.Mock(spec=zmq.Socket)
+        self.pub_socket = mock.Mock(spec=zmq.Socket)
+
+        listener = UINotification(
+            mock.Mock(spec=UINotificationFactory)
+        )
+        listener._context = self.context
+        listener._rep_socket = self.rep_socket
+        listener._pub_socket = self.pub_socket
+        listener._rep_socket.recv.return_value = "SYNC".encode("utf-8")
+        self.listener = listener
+
+    def test_deliver(self):
+        listener = self.listener
+        listener.deliver(mock.Mock(spec=UINotificationModel), MCOStartEvent())
+        self.assertEqual(
+            listener._rep_socket.send_multipart.call_args[0][0],
+            ['EVENT\nMCO_START'.encode('utf-8')])
+        self.assertEqual(
+            listener._pub_socket.send.call_args[0][0],
+            'EVENT\nMCO_START'.encode('utf-8'))
+
+    def test_finalize(self):
+        listener = self.listener
+        listener.finalize(mock.Mock())
+        self.assertTrue(self.context.term.called)
+        self.assertTrue(self.rep_socket.close.called)
+        self.assertTrue(self.pub_socket.close.called)
+        self.assertIsNone(listener._context)
+        self.assertIsNone(listener._rep_socket)
+        self.assertIsNone(listener._pub_socket)
+
+    def test_initialize(self):
+        with mock.patch('force_bdss.core_plugins.dummy.ui_notification.'
+                        'ui_notification.zmq') as mock_zmq:
+            mock_zmq.Context.return_value = self.context
+            self.context.socket.return_value = self.rep_socket
+            listener = UINotification(
+                mock.Mock(spec=UINotificationFactory)
+            )
+            listener.initialize(mock.Mock())
+            self.assertTrue(listener._pub_socket.bind.called)
diff --git a/force_bdss/core_plugins/dummy/ui_notification/ui_notification.py b/force_bdss/core_plugins/dummy/ui_notification/ui_notification.py
index fa80783..37fb532 100644
--- a/force_bdss/core_plugins/dummy/ui_notification/ui_notification.py
+++ b/force_bdss/core_plugins/dummy/ui_notification/ui_notification.py
@@ -1,6 +1,6 @@
 import errno
 import logging
-from traits.api import Any, List
+from traits.api import List, Instance
 
 from force_bdss.api import (
     BaseNotificationListener,
@@ -17,14 +17,14 @@ class UINotification(BaseNotificationListener):
     Notification engine for the UI. Uses zeromq for the traffic handling.
     """
     #: The ZMQ context.
-    _context = Any()
+    _context = Instance(zmq.Context)
 
     #: The pubsub socket.
-    _pub_socket = Any()
+    _pub_socket = Instance(zmq.Socket)
 
     #: The synchronization socket to recover already sent information at a
     #: later stage
-    _rep_socket = Any()
+    _rep_socket = Instance(zmq.Socket)
 
     #: The cache of messages as they are sent out.
     _msg_cache = List()
@@ -42,12 +42,13 @@ class UINotification(BaseNotificationListener):
         if data and data[0:4] == "SYNC".encode("utf-8"):
             self._rep_socket.send_multipart(self._msg_cache)
 
-        msg = self._format_event(event)
+        msg = _format_event(event)
         if msg is not None:
             self._msg_cache.append(msg)
             self._pub_socket.send(msg)
 
     def initialize(self, model):
+        print("XX")
         self._context = zmq.Context()
         self._pub_socket = self._context.socket(zmq.PUB)
         self._pub_socket.bind("tcp://*:12345")
@@ -64,17 +65,19 @@ class UINotification(BaseNotificationListener):
         self._rep_socket = None
         self._context = None
 
-    def _format_event(self, event):
-        if isinstance(event, MCOStartEvent):
-            data = "MCO_START"
-        elif isinstance(event, MCOFinishEvent):
-            data = "MCO_FINISH"
-        elif isinstance(event, MCOProgressEvent):
-            data = "MCO_PROGRESS\n{}\n{}".format(
-                " ".join([str(x) for x in event.input]),
-                " ".join([str(x) for x in event.output]))
-        else:
-            return None
-
-        return ("EVENT\n{}".format(data)).encode("utf-8")
+
+def _format_event(event):
+    """Converts the event into a byte sequence to be transferred via zmq"""
+    if isinstance(event, MCOStartEvent):
+        data = "MCO_START"
+    elif isinstance(event, MCOFinishEvent):
+        data = "MCO_FINISH"
+    elif isinstance(event, MCOProgressEvent):
+        data = "MCO_PROGRESS\n{}\n{}".format(
+            " ".join([str(x) for x in event.input]),
+            " ".join([str(x) for x in event.output]))
+    else:
+        return None
+
+    return ("EVENT\n{}".format(data)).encode("utf-8")
 
diff --git a/force_bdss/tests/utils.py b/force_bdss/tests/utils.py
new file mode 100644
index 0000000..cba62e4
--- /dev/null
+++ b/force_bdss/tests/utils.py
@@ -0,0 +1,13 @@
+import sys
+from contextlib import contextmanager
+from six import StringIO
+
+@contextmanager
+def captured_output():
+    new_out, new_err = StringIO(), StringIO()
+    old_out, old_err = sys.stdout, sys.stderr
+    try:
+        sys.stdout, sys.stderr = new_out, new_err
+        yield sys.stdout, sys.stderr
+    finally:
+        sys.stdout, sys.stderr = old_out, old_err
-- 
GitLab