summaryrefslogtreecommitdiff
path: root/tests/test_utils/test_simpletestcase.py
diff options
context:
space:
mode:
authorPavel Savchenko <asfaltboy@gmail.com>2019-10-18 10:27:48 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-10-18 11:11:34 +0200
commitdc8cd2fefd028913e3273927342374f5259cc566 (patch)
treedf9f10d7f705a2109f620510b52f011731c3aa47 /tests/test_utils/test_simpletestcase.py
parent46e74a525671f2eef09021c06933c45b49f9d421 (diff)
Refs #27391 -- Added more tests for SimpleTestCase.
Diffstat (limited to 'tests/test_utils/test_simpletestcase.py')
-rw-r--r--tests/test_utils/test_simpletestcase.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/test_utils/test_simpletestcase.py b/tests/test_utils/test_simpletestcase.py
new file mode 100644
index 0000000000..eb1e0017d2
--- /dev/null
+++ b/tests/test_utils/test_simpletestcase.py
@@ -0,0 +1,90 @@
+import unittest
+from io import StringIO
+from unittest import mock
+from unittest.suite import _DebugResult
+
+from django.test import SimpleTestCase
+
+
+class ErrorTestCase(SimpleTestCase):
+ def raising_test(self):
+ self._pre_setup.assert_called_once_with()
+ raise Exception('debug() bubbles up exceptions before cleanup.')
+
+ def simple_test(self):
+ self._pre_setup.assert_called_once_with()
+
+ @unittest.skip('Skip condition.')
+ def skipped_test(self):
+ pass
+
+
+@mock.patch.object(ErrorTestCase, '_post_teardown')
+@mock.patch.object(ErrorTestCase, '_pre_setup')
+class DebugInvocationTests(SimpleTestCase):
+ def get_runner(self):
+ return unittest.TextTestRunner(stream=StringIO())
+
+ def test_run_cleanup(self, _pre_setup, _post_teardown):
+ """Simple test run: catches errors and runs cleanup."""
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(ErrorTestCase('raising_test'))
+ result = self.get_runner()._makeResult()
+ self.assertEqual(result.errors, [])
+ test_suite.run(result)
+ self.assertEqual(len(result.errors), 1)
+ _, traceback = result.errors[0]
+ self.assertIn('Exception: debug() bubbles up exceptions before cleanup.', traceback)
+ _pre_setup.assert_called_once_with()
+ _post_teardown.assert_called_once_with()
+
+ def test_run_pre_setup_error(self, _pre_setup, _post_teardown):
+ _pre_setup.side_effect = Exception('Exception in _pre_setup.')
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(ErrorTestCase('simple_test'))
+ result = self.get_runner()._makeResult()
+ self.assertEqual(result.errors, [])
+ test_suite.run(result)
+ self.assertEqual(len(result.errors), 1)
+ _, traceback = result.errors[0]
+ self.assertIn('Exception: Exception in _pre_setup.', traceback)
+ # pre-setup is called but not post-teardown.
+ _pre_setup.assert_called_once_with()
+ self.assertFalse(_post_teardown.called)
+
+ def test_run_post_teardown_error(self, _pre_setup, _post_teardown):
+ _post_teardown.side_effect = Exception('Exception in _post_teardown.')
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(ErrorTestCase('simple_test'))
+ result = self.get_runner()._makeResult()
+ self.assertEqual(result.errors, [])
+ test_suite.run(result)
+ self.assertEqual(len(result.errors), 1)
+ _, traceback = result.errors[0]
+ self.assertIn('Exception: Exception in _post_teardown.', traceback)
+ # pre-setup and post-teardwn are called.
+ _pre_setup.assert_called_once_with()
+ _post_teardown.assert_called_once_with()
+
+ def test_run_skipped_test_no_cleanup(self, _pre_setup, _post_teardown):
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(ErrorTestCase('skipped_test'))
+ try:
+ test_suite.run(self.get_runner()._makeResult())
+ except unittest.SkipTest:
+ self.fail('SkipTest should not be raised at this stage.')
+ self.assertFalse(_post_teardown.called)
+ self.assertFalse(_pre_setup.called)
+
+ def test_debug_skipped_test_no_cleanup(self, _pre_setup, _post_teardown):
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(ErrorTestCase('skipped_test'))
+ with self.assertRaisesMessage(unittest.SkipTest, 'Skip condition.'):
+ # This is the same as test_suite.debug().
+ result = _DebugResult()
+ test_suite.run(result, debug=True)
+ self.assertFalse(_post_teardown.called)
+ self.assertFalse(_pre_setup.called)
+ # Suite teardown needs to be manually called to isolate failure.
+ test_suite._tearDownPreviousClass(None, result)
+ test_suite._handleModuleTearDown(result)