Przeglądaj źródła

tests: import assertNotRaises() from core-admin

Marek Marczykowski-Górecki 7 lat temu
rodzic
commit
09acf4729b
1 zmienionych plików z 63 dodań i 0 usunięć
  1. 63 0
      qubesmgmt/tests/__init__.py

+ 63 - 0
qubesmgmt/tests/__init__.py

@@ -17,6 +17,7 @@
 #
 # You should have received a copy of the GNU Lesser General Public License along
 # with this program; if not, see <http://www.gnu.org/licenses/>.
+import traceback
 import unittest
 
 import io
@@ -73,6 +74,39 @@ class TestProcess(object):
         self.stdin_close()
         return 0
 
+class _AssertNotRaisesContext(object):
+    """A context manager used to implement TestCase.assertNotRaises methods.
+
+    Stolen from unittest and hacked. Regexp support stripped.
+    """ # pylint: disable=too-few-public-methods
+
+    def __init__(self, expected, test_case, expected_regexp=None):
+        if expected_regexp is not None:
+            raise NotImplementedError('expected_regexp is unsupported')
+
+        self.expected = expected
+        self.exception = None
+
+        self.failureException = test_case.failureException
+
+
+    def __enter__(self):
+        return self
+
+
+    def __exit__(self, exc_type, exc_value, tb):
+        if exc_type is None:
+            return True
+
+        if issubclass(exc_type, self.expected):
+            raise self.failureException(
+                "{!r} raised, traceback:\n{!s}".format(
+                    exc_value, ''.join(traceback.format_tb(tb))))
+        else:
+            # pass through
+            return False
+
+
 class QubesTest(qubesmgmt.app.QubesBase):
     expected_calls = None
     actual_calls = None
@@ -110,3 +144,32 @@ class QubesTestCase(unittest.TestCase):
         self.assertEqual(
             set(self.app.expected_calls.keys()),
             set(self.app.actual_calls))
+
+    def assertNotRaises(self, excClass, callableObj=None, *args, **kwargs):
+        """Fail if an exception of class excClass is raised
+           by callableObj when invoked with arguments args and keyword
+           arguments kwargs. If a different type of exception is
+           raised, it will not be caught, and the test case will be
+           deemed to have suffered an error, exactly as for an
+           unexpected exception.
+
+           If called with callableObj omitted or None, will return a
+           context object used like this::
+
+                with self.assertRaises(SomeException):
+                    do_something()
+
+           The context manager keeps a reference to the exception as
+           the 'exception' attribute. This allows you to inspect the
+           exception after the assertion::
+
+               with self.assertRaises(SomeException) as cm:
+                   do_something()
+               the_exception = cm.exception
+               self.assertEqual(the_exception.error_code, 3)
+        """
+        context = _AssertNotRaisesContext(excClass, self)
+        if callableObj is None:
+            return context
+        with context:
+            callableObj(*args, **kwargs)