2adf4a6dc1899471ebac86a8af7cdfce6f8f4db5
[functest.git] / functest / tests / unit / core / test_testcase.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2016 Orange and others.
4 #
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
9
10 """Define the class required to fully cover testcase."""
11
12 import logging
13 import unittest
14
15 import mock
16
17 from functest.core import testcase
18
19 __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
20
21
22 class TestCaseTesting(unittest.TestCase):
23     """The class testing TestCase."""
24     # pylint: disable=missing-docstring,too-many-public-methods
25
26     logging.disable(logging.CRITICAL)
27
28     _case_name = "base"
29     _project_name = "functest"
30     _published_result = "PASS"
31
32     def setUp(self):
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"}
39
40     def test_run_unimplemented(self):
41         self.assertEqual(self.test.run(),
42                          testcase.TestCase.EX_RUN_ERROR)
43
44     @mock.patch('functest.utils.functest_utils.push_results_to_db',
45                 return_value=False)
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()
50
51     def test_missing_project_name(self):
52         self.test.project_name = None
53         self._test_missing_attribute()
54
55     def test_missing_case_name(self):
56         self.test.case_name = None
57         self._test_missing_attribute()
58
59     def test_missing_start_time(self):
60         self.test.start_time = None
61         self._test_missing_attribute()
62
63     def test_missing_stop_time(self):
64         self.test.stop_time = None
65         self._test_missing_attribute()
66
67     @mock.patch('functest.utils.functest_utils.push_results_to_db',
68                 return_value=True)
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)
76
77     @mock.patch('functest.utils.functest_utils.push_results_to_db',
78                 return_value=False)
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)
85
86     @mock.patch('functest.utils.functest_utils.push_results_to_db',
87                 return_value=True)
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)
94
95     @mock.patch('functest.utils.functest_utils.push_results_to_db',
96                 return_value=True)
97     def test_push_to_db_res_ko(self, mock_function=None):
98         self.test.result = 0
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)
104
105     @mock.patch('functest.utils.functest_utils.push_results_to_db',
106                 return_value=True)
107     def test_push_to_db_both_ko(self, mock_function=None):
108         self.test.result = 0
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)
115
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)
120
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)
125
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)
133
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)
141
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)
146
147     def test_check_result_eq(self):
148         self.test.result = 100
149         self.assertEqual(self.test.is_successful(),
150                          testcase.TestCase.EX_OK)
151
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)
157
158     def test_check_result_zero(self):
159         self.test.criteria = 0
160         self.test.result = 0
161         self.assertEqual(self.test.is_successful(),
162                          testcase.TestCase.EX_TESTCASE_FAILED)
163
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")
169
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")
175
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")
180
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")
185
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")
190
191     def test_str_project_name_ko(self):
192         self.test.project_name = None
193         self.assertIn("<functest.core.testcase.TestCase object at",
194                       str(self.test))
195
196     def test_str_case_name_ko(self):
197         self.test.case_name = None
198         self.assertIn("<functest.core.testcase.TestCase object at",
199                       str(self.test))
200
201     def test_str_pass(self):
202         duration = '01:01'
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)
212
213     def test_str_fail(self):
214         duration = '00:59'
215         with mock.patch.object(self.test, 'get_duration',
216                                return_value=duration), \
217                 mock.patch.object(
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)
225
226
227 if __name__ == "__main__":
228     unittest.main(verbosity=2)