3 # Copyright (c) 2016 Orange and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 """Define the class required to fully cover testcase."""
15 from functest.core import testcase
20 __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
23 class TestCaseTesting(unittest.TestCase):
24 """The class testing TestCase."""
26 # pylint: disable=missing-docstring,too-many-public-methods
29 _project_name = "functest"
30 _published_result = "PASS"
33 self.test = testcase.TestCase(case_name=self._case_name,
34 project_name=self._project_name)
35 self.test.start_time = "1"
36 self.test.stop_time = "2"
37 self.test.result = 100
38 self.test.details = {"Hello": "World"}
40 def test_run_unimplemented(self):
41 self.assertEqual(self.test.run(),
42 testcase.TestCase.EX_RUN_ERROR)
44 @mock.patch('functest.utils.functest_utils.push_results_to_db',
46 def _test_missing_attribute(self, mock_function=None):
47 self.assertEqual(self.test.push_to_db(),
48 testcase.TestCase.EX_PUSH_TO_DB_ERROR)
49 mock_function.assert_not_called()
51 def test_missing_project_name(self):
52 self.test.project_name = None
53 self._test_missing_attribute()
55 def test_missing_case_name(self):
56 self.test.case_name = None
57 self._test_missing_attribute()
59 def test_missing_start_time(self):
60 self.test.start_time = None
61 self._test_missing_attribute()
63 def test_missing_stop_time(self):
64 self.test.stop_time = None
65 self._test_missing_attribute()
67 @mock.patch('functest.utils.functest_utils.push_results_to_db',
69 def test_missing_details(self, mock_function=None):
70 self.test.details = None
71 self.assertEqual(self.test.push_to_db(),
72 testcase.TestCase.EX_OK)
73 mock_function.assert_called_once_with(
74 self._project_name, self._case_name, self.test.start_time,
75 self.test.stop_time, self._published_result, self.test.details)
77 @mock.patch('functest.utils.functest_utils.push_results_to_db',
79 def test_push_to_db_failed(self, mock_function=None):
80 self.assertEqual(self.test.push_to_db(),
81 testcase.TestCase.EX_PUSH_TO_DB_ERROR)
82 mock_function.assert_called_once_with(
83 self._project_name, self._case_name, self.test.start_time,
84 self.test.stop_time, self._published_result, self.test.details)
86 @mock.patch('functest.utils.functest_utils.push_results_to_db',
88 def test_push_to_db(self, mock_function=None):
89 self.assertEqual(self.test.push_to_db(),
90 testcase.TestCase.EX_OK)
91 mock_function.assert_called_once_with(
92 self._project_name, self._case_name, self.test.start_time,
93 self.test.stop_time, self._published_result, self.test.details)
95 @mock.patch('functest.utils.functest_utils.push_results_to_db',
97 def test_push_to_db_res_ko(self, mock_function=None):
99 self.assertEqual(self.test.push_to_db(),
100 testcase.TestCase.EX_OK)
101 mock_function.assert_called_once_with(
102 self._project_name, self._case_name, self.test.start_time,
103 self.test.stop_time, 'FAIL', self.test.details)
105 @mock.patch('functest.utils.functest_utils.push_results_to_db',
107 def test_push_to_db_both_ko(self, mock_function=None):
109 self.test.criteria = 0
110 self.assertEqual(self.test.push_to_db(),
111 testcase.TestCase.EX_OK)
112 mock_function.assert_called_once_with(
113 self._project_name, self._case_name, self.test.start_time,
114 self.test.stop_time, 'FAIL', self.test.details)
116 def test_check_criteria_missing(self):
117 self.test.criteria = None
118 self.assertEqual(self.test.is_successful(),
119 testcase.TestCase.EX_TESTCASE_FAILED)
121 def test_check_result_missing(self):
122 self.test.result = None
123 self.assertEqual(self.test.is_successful(),
124 testcase.TestCase.EX_TESTCASE_FAILED)
126 def test_check_result_failed(self):
127 # Backward compatibility
128 # It must be removed as soon as TestCase subclasses
129 # stop setting result = 'PASS' or 'FAIL'.
130 self.test.result = 'FAIL'
131 self.assertEqual(self.test.is_successful(),
132 testcase.TestCase.EX_TESTCASE_FAILED)
134 def test_check_result_pass(self):
135 # Backward compatibility
136 # It must be removed as soon as TestCase subclasses
137 # stop setting result = 'PASS' or 'FAIL'.
138 self.test.result = 'PASS'
139 self.assertEqual(self.test.is_successful(),
140 testcase.TestCase.EX_OK)
142 def test_check_result_lt(self):
143 self.test.result = 50
144 self.assertEqual(self.test.is_successful(),
145 testcase.TestCase.EX_TESTCASE_FAILED)
147 def test_check_result_eq(self):
148 self.test.result = 100
149 self.assertEqual(self.test.is_successful(),
150 testcase.TestCase.EX_OK)
152 def test_check_result_gt(self):
153 self.test.criteria = 50
154 self.test.result = 100
155 self.assertEqual(self.test.is_successful(),
156 testcase.TestCase.EX_OK)
158 def test_check_result_zero(self):
159 self.test.criteria = 0
161 self.assertEqual(self.test.is_successful(),
162 testcase.TestCase.EX_TESTCASE_FAILED)
164 def test_get_duration_start_ko(self):
165 self.test.start_time = None
166 self.assertEqual(self.test.get_duration(), "XX:XX")
167 self.test.start_time = 0
168 self.assertEqual(self.test.get_duration(), "XX:XX")
170 def test_get_duration_end_ko(self):
171 self.test.stop_time = None
172 self.assertEqual(self.test.get_duration(), "XX:XX")
173 self.test.stop_time = 0
174 self.assertEqual(self.test.get_duration(), "XX:XX")
176 def test_get_invalid_duration(self):
177 self.test.start_time = 2
178 self.test.stop_time = 1
179 self.assertEqual(self.test.get_duration(), "XX:XX")
181 def test_get_zero_duration(self):
182 self.test.start_time = 2
183 self.test.stop_time = 2
184 self.assertEqual(self.test.get_duration(), "00:00")
186 def test_get_duration(self):
187 self.test.start_time = 1
188 self.test.stop_time = 180
189 self.assertEqual(self.test.get_duration(), "02:59")
191 def test_str_project_name_ko(self):
192 self.test.project_name = None
193 self.assertIn("<functest.core.testcase.TestCase object at",
196 def test_str_case_name_ko(self):
197 self.test.case_name = None
198 self.assertIn("<functest.core.testcase.TestCase object at",
201 def test_str_pass(self):
203 with mock.patch.object(self.test, 'get_duration',
204 return_value=duration), \
205 mock.patch.object(self.test, 'is_successful',
206 return_value=testcase.TestCase.EX_OK):
207 message = str(self.test)
208 self.assertIn(self._project_name, message)
209 self.assertIn(self._case_name, message)
210 self.assertIn(duration, message)
211 self.assertIn('PASS', message)
213 def test_str_fail(self):
215 with mock.patch.object(self.test, 'get_duration',
216 return_value=duration), \
218 self.test, 'is_successful',
219 return_value=testcase.TestCase.EX_TESTCASE_FAILED):
220 message = str(self.test)
221 self.assertIn(self._project_name, message)
222 self.assertIn(self._case_name, message)
223 self.assertIn(duration, message)
224 self.assertIn('FAIL', message)
226 def test_create_snapshot(self):
227 self.assertEqual(self.test.create_snapshot(),
228 testcase.TestCase.EX_OK)
230 def test_clean(self):
231 self.assertEqual(self.test.clean(), None)
234 if __name__ == "__main__":
235 logging.disable(logging.CRITICAL)
236 unittest.main(verbosity=2)