Prechádzať zdrojové kódy

Add unit tests for the `exception.py` module

Signed-off-by: Mihaela Balutoiu <mbalutoiu@cloudbasesolutions.com>
Mihaela Balutoiu 2 rokov pred
rodič
commit
fe241ed145
1 zmenil súbory, kde vykonal 124 pridanie a 0 odobranie
  1. 124 0
      coriolis/tests/test_exception.py

+ 124 - 0
coriolis/tests/test_exception.py

@@ -0,0 +1,124 @@
+# Copyright 2023 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+from unittest import mock
+
+from coriolis import exception
+from coriolis.tests import test_base
+
+
+class ConvertedExceptionTestCase(test_base.CoriolisBaseTestCase):
+    """Test suite for the Coriolis ConvertedException class."""
+
+    def test__init__(self):
+        result = exception.ConvertedException(
+            code=403, title='Forbidden', explanation='test')
+
+        self.assertEqual(result.code, 403)
+        self.assertEqual(result.title, 'Forbidden')
+        self.assertEqual(result.explanation, 'test')
+
+    def test__init__without_title(self):
+        result = exception.ConvertedException(code=403, explanation='test')
+
+        self.assertEqual(result.code, 403)
+        self.assertEqual(result.title, 'Forbidden')
+        self.assertEqual(result.explanation, 'test')
+
+    def test__init__with_code_not_in_status_reasons(self):
+        result = exception.ConvertedException(code=450, explanation='test')
+
+        self.assertEqual(result.code, 450)
+        self.assertEqual(result.title, 'Unknown Client Error')
+        self.assertEqual(result.explanation, 'test')
+
+
+class CoriolisTestException(exception.CoriolisException):
+    message = "Test message with missing placeholder: %(missing_key)s"
+
+
+class CoriolisExceptionTestCase(test_base.CoriolisBaseTestCase):
+    """Test suite for the Coriolis CoriolisException class."""
+
+    def test__init__(self):
+        result = exception.CoriolisException()
+
+        self.assertEqual(result.message, 'An unknown exception occurred.')
+        self.assertEqual(result.code, 500)
+        self.assertEqual(result.headers, {})
+        self.assertEqual(result.safe, False)
+
+    def test__init__with_exception_in_kwargs_items(self):
+        kwargs = {'test_key': 'test_value', 'code': 500}
+        kwargs['exc'] = ValueError('Test exception message')
+
+        result = exception.CoriolisException(**kwargs)
+
+        kwargs['exc'] = str(kwargs['exc'])
+
+        self.assertEqual(result.msg, 'An unknown exception occurred.')
+        self.assertEqual(result.kwargs, kwargs)
+
+    def test__init__custom_message_and_kwargs(self):
+        custom_message = 'test-message'
+        kwargs = {'test-key': 'test-value'}
+        result = exception.CoriolisException(custom_message, **kwargs)
+
+        expected_message = custom_message % kwargs
+        expected_kwargs = {'test-key': 'test-value', 'code': 500}
+
+        self.assertEqual(result.msg, expected_message)
+        self.assertEqual(result.kwargs, expected_kwargs)
+
+    @mock.patch.object(exception, 'LOG')
+    @mock.patch.object(exception, 'CONF')
+    def test__init__with_exception_in_string_format(self, mock_conf, mock_log):
+        mock_conf.fatal_exception_format_errors = False
+        kwargs = {'some_key': 'some_value'}
+
+        result = CoriolisTestException(**kwargs)
+
+        self.assertEqual(result.msg, CoriolisTestException.message)
+        mock_log.exception.assert_called_once_with(
+            'Exception in string format operation')
+        expected_calls = [
+            mock.call("%(name)s: %(value)s",
+                      {'name': 'some_key', 'value': 'some_value'}),
+            mock.call("%(name)s: %(value)s", {'name': 'code', 'value': 500})
+        ]
+        mock_log.error.assert_has_calls(expected_calls)
+        self.assertEqual(mock_log.error.call_count, 2)
+
+    @mock.patch.object(exception, 'CONF')
+    def test__init__with_fatal_exception_format_errors(self, mock_conf):
+        mock_conf.fatal_exception_format_errors = True
+        kwargs = {'some_key': 'some_value'}
+
+        self.assertRaises(KeyError, CoriolisTestException, **kwargs)
+
+    def test__init__with_exception_message(self):
+        message = ValueError('Test exception message')
+        result = exception.CoriolisException(message)
+        self.assertEqual(str(result), 'Test exception message')
+
+    @mock.patch.object(exception, 'CONF')
+    def test__unicode__(self, mock_conf):
+        mock_conf.fatal_exception_format_errors = False
+        kwargs = {'missing_key': 'some_value'}
+
+        exception_instance = CoriolisTestException(**kwargs)
+        result = exception_instance.__unicode__()
+        self.assertEqual(
+            result, "Test message with missing placeholder: some_value")
+
+
+class APIExceptionTestCase(test_base.CoriolisBaseTestCase):
+    """Test suite for the Coriolis APIException class."""
+
+    def test__init__(self):
+        result = exception.APIException(service='test_service')
+        self.assertEqual(result.kwargs['service'], 'test_service')
+
+    def test__init__no_service(self):
+        result = exception.APIException()
+        self.assertEqual(result.kwargs['service'], 'unknown')