Merge "Read env vars instead of using CONST in API"
[functest.git] / functest / tests / unit / core / test_feature.py
index 0ed178a..3219c72 100644 (file)
@@ -16,92 +16,101 @@ import mock
 
 from functest.core import feature
 from functest.core import testcase
-from functest.utils import constants
 
 
-class FeatureInitTesting(unittest.TestCase):
+class FeatureTestingBase(unittest.TestCase):
 
-    logging.disable(logging.CRITICAL)
+    _case_name = "foo"
+    _project_name = "bar"
+    _repo = "dir_repo_bar"
+    _cmd = "run_bar_tests.py"
+    _output_file = '/home/opnfv/functest/results/foo.log'
+    feature = None
 
-    @unittest.skip("JIRA: FUNCTEST-780")
-    def test_init_with_wrong_repo(self):
-        with self.assertRaises(ValueError):
-            feature.Feature(repo='foo')
+    @mock.patch('time.time', side_effect=[1, 2])
+    def _test_run(self, status, mock_method=None):
+        self.assertEqual(self.feature.run(cmd=self._cmd), status)
+        if status == testcase.TestCase.EX_OK:
+            self.assertEqual(self.feature.result, 100)
+        else:
+            self.assertEqual(self.feature.result, 0)
+        mock_method.assert_has_calls([mock.call(), mock.call()])
+        self.assertEqual(self.feature.start_time, 1)
+        self.assertEqual(self.feature.stop_time, 2)
 
-    def test_init(self):
-        barometer = feature.Feature(repo='dir_repo_barometer')
-        self.assertEqual(barometer.project_name, "functest")
-        self.assertEqual(barometer.case_name, "")
-        self.assertEqual(
-            barometer.repo,
-            constants.CONST.__getattribute__('dir_repo_barometer'))
+    def test_logger_module_ko(self):
+        with mock.patch('six.moves.builtins.open'):
+            self.feature = feature.Feature(
+                project_name=self._project_name, case_name=self._case_name)
+            self.assertEqual(self.feature.logger.name, self._case_name)
 
+    def test_logger_module(self):
+        with mock.patch('six.moves.builtins.open'):
+            self.feature = feature.Feature(
+                project_name=self._project_name, case_name=self._case_name,
+                run={'module': 'bar'})
+            self.assertEqual(self.feature.logger.name, 'bar')
 
-class FeatureTesting(unittest.TestCase):
 
-    logging.disable(logging.CRITICAL)
+class FeatureTesting(FeatureTestingBase):
 
     def setUp(self):
-        self.feature = feature.Feature(repo='dir_repo_barometer')
-
-    @unittest.skip("JIRA: FUNCTEST-781")
-    def test_prepare_ko(self):
+        # logging must be disabled else it calls time.time()
+        # what will break these unit tests.
+        logging.disable(logging.CRITICAL)
+        with mock.patch('six.moves.builtins.open'):
+            self.feature = feature.Feature(
+                project_name=self._project_name, case_name=self._case_name)
+
+    def test_run_exc(self):
         # pylint: disable=bad-continuation
         with mock.patch.object(
-                self.feature, 'prepare',
-                return_value=testcase.TestCase.EX_RUN_ERROR) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
-
-    @unittest.skip("JIRA: FUNCTEST-781")
-    def test_prepare_exc(self):
-        with mock.patch.object(self.feature, 'prepare',
-                               side_effect=Exception) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
-
-    @unittest.skip("JIRA: FUNCTEST-781")
-    def test_post_ko(self):
-        # pylint: disable=bad-continuation
-        with mock.patch.object(
-                self.feature, 'post',
-                return_value=testcase.TestCase.EX_RUN_ERROR) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
-
-    @unittest.skip("JIRA: FUNCTEST-781")
-    def test_post_exc(self):
-        with mock.patch.object(self.feature, 'post',
-                               side_effect=Exception) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
-
-    @unittest.skip("JIRA: FUNCTEST-778")
-    def test_execute_ko(self):
-        with mock.patch.object(self.feature, 'execute',
-                               return_value=1) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
-
-    @unittest.skip("JIRA: FUNCTEST-778")
-    def test_execute_exc(self):
-        with mock.patch.object(self.feature, 'execute',
-                               side_effect=Exception) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_RUN_ERROR)
-            mock_object.assert_called_once_with()
+                self.feature, 'execute',
+                side_effect=Exception) as mock_method:
+            self._test_run(testcase.TestCase.EX_RUN_ERROR)
+            mock_method.assert_called_once_with(cmd=self._cmd)
 
     def test_run(self):
-        with mock.patch.object(self.feature, 'execute',
-                               return_value=0) as mock_object:
-            self.assertEqual(self.feature.run(),
-                             testcase.TestCase.EX_OK)
-            mock_object.assert_called_once_with()
+        self._test_run(testcase.TestCase.EX_RUN_ERROR)
+
+
+class BashFeatureTesting(FeatureTestingBase):
+
+    def setUp(self):
+        # logging must be disabled else it calls time.time()
+        # what will break these unit tests.
+        logging.disable(logging.CRITICAL)
+        with mock.patch('six.moves.builtins.open'):
+            self.feature = feature.BashFeature(
+                project_name=self._project_name, case_name=self._case_name)
+
+    @mock.patch('subprocess.Popen')
+    def test_run_no_cmd(self, mock_subproc):
+        self.assertEqual(
+            self.feature.run(), testcase.TestCase.EX_RUN_ERROR)
+        mock_subproc.assert_not_called()
+
+    @mock.patch('subprocess.Popen')
+    def test_run_ko(self, mock_subproc):
+        with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
+            mock_obj = mock.Mock()
+            attrs = {'wait.return_value': 1}
+            mock_obj.configure_mock(**attrs)
+
+            mock_subproc.return_value = mock_obj
+            self._test_run(testcase.TestCase.EX_RUN_ERROR)
+            mopen.assert_called_once_with(self._output_file, "w+")
+
+    @mock.patch('subprocess.Popen')
+    def test_run(self, mock_subproc):
+        with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
+            mock_obj = mock.Mock()
+            attrs = {'wait.return_value': 0}
+            mock_obj.configure_mock(**attrs)
+
+            mock_subproc.return_value = mock_obj
+            self._test_run(testcase.TestCase.EX_OK)
+            mopen.assert_called_once_with(self._output_file, "w+")
 
 
 if __name__ == "__main__":