| |
@@ -2,46 +2,51 @@
|
| |
import unittest
|
| |
|
| |
import kojihub
|
| |
+ import kojihub.db
|
| |
|
| |
- QP = kojihub.QueryProcessor
|
| |
+
|
| |
+ def get_qp_init(testcase):
|
| |
+ orig_qp_init = kojihub.db.QueryProcessor.__init__
|
| |
+
|
| |
+ def my_qp_init(_query, *a, **kw):
|
| |
+ _query.execute = mock.MagicMock()
|
| |
+ _query.execute.return_value = testcase.qp_execute_return_value
|
| |
+ _query.execute.side_effect = testcase.qp_execute_side_effect
|
| |
+ _query.executeOne = mock.MagicMock()
|
| |
+ _query.executeOne.return_value = testcase.qp_execute_one_return_value
|
| |
+ _query.executeOne.side_effect = testcase.qp_execute_one_side_effect
|
| |
+ _query.singleValue = mock.MagicMock()
|
| |
+ _query.singleValue.return_value = testcase.qp_single_value_return_value
|
| |
+ _query.iterate = mock.MagicMock()
|
| |
+ _query.iterate.return_value = testcase.qp_iterate_return_value
|
| |
+ testcase.queries.append(_query)
|
| |
+ return orig_qp_init(_query, *a, **kw)
|
| |
+
|
| |
+ return my_qp_init
|
| |
|
| |
|
| |
class DBQueryTestCase(unittest.TestCase):
|
| |
|
| |
def setUp(self):
|
| |
- mock.patch.stopall()
|
| |
self.qp_execute_return_value = []
|
| |
self.qp_execute_side_effect = None
|
| |
self.qp_execute_one_return_value = []
|
| |
self.qp_execute_one_side_effect = None
|
| |
self.qp_single_value_return_value = None
|
| |
self.qp_iterate_return_value = None
|
| |
- self.QueryProcessor = mock.patch('kojihub.kojihub.QueryProcessor',
|
| |
- side_effect=self.get_query).start()
|
| |
+
|
| |
+ # patch init to catch queries regardless of how QP is imported
|
| |
+ new_init = get_qp_init(self)
|
| |
+ self.qp_init = mock.patch('kojihub.db.QueryProcessor.__init__', new=new_init).start()
|
| |
+
|
| |
self.queries = []
|
| |
|
| |
def tearDown(self):
|
| |
mock.patch.stopall()
|
| |
- self.reset_query()
|
| |
|
| |
def reset_query(self):
|
| |
del self.queries[:]
|
| |
|
| |
- def get_query(self, *args, **kwargs):
|
| |
- query = QP(*args, **kwargs)
|
| |
- query.execute = mock.MagicMock()
|
| |
- query.execute.return_value = self.qp_execute_return_value
|
| |
- query.execute.side_effect = self.qp_execute_side_effect
|
| |
- query.executeOne = mock.MagicMock()
|
| |
- query.executeOne.return_value = self.qp_execute_one_return_value
|
| |
- query.executeOne.side_effect = self.qp_execute_one_side_effect
|
| |
- query.singleValue = mock.MagicMock()
|
| |
- query.singleValue.return_value = self.qp_single_value_return_value
|
| |
- query.iterate = mock.MagicMock()
|
| |
- query.iterate.return_value = self.qp_iterate_return_value
|
| |
- self.queries.append(query)
|
| |
- return query
|
| |
-
|
| |
def assertQueryEqual(self, query, **kwargs):
|
| |
for k, v in kwargs.items():
|
| |
self.assertEqual(getattr(query, k, None), v)
|
| |
The previous only worked for code from kojihub.py. Any hub module that imported QueryProcessor differently would not see the mock. This approach mocks the class in place so that all imports will see it.
While here, I noticed this bit of test code:
It makes no sense to stop mock patches in setUp. At this point, there should be no active patches unless other tests are misbehaving. As it turns out, a great many of our tests were failing to properly clean up. Removing the above
stopall
broke several tests, which was probably what prompted #2758.Having stray mocks lingering after a unit test is completed could potentially mask a later unit test, or as seen here break one in a hard to debug way.
Fixes: https://pagure.io/koji/issue/4071
Related: https://pagure.io/koji/issue/2758