debian-koji/tests/test_hub/test_task_wait_results.py
Yuming Zhu ca05418fb5 unittest: use unittest.mock instead of mock
because the absence of unittest.mock on python2.7, we still fallback to
mock
2024-10-23 16:35:30 +00:00

110 lines
4.1 KiB
Python

from unittest import mock
import xmlrpc.client
import unittest
import koji
import kojihub
QP = kojihub.QueryProcessor
class TestTaskWaitResults(unittest.TestCase):
def setUp(self):
self.context = mock.patch('kojihub.kojihub.context').start()
self.host_id = 99
self.context.session.getHostId.return_value = self.host_id
self.host_exports = kojihub.Host(self.host_id)
self.host_exports.taskUnwait = mock.MagicMock()
self.Task = mock.patch('kojihub.kojihub.Task', side_effect=self.getTask).start()
self.tasks = {}
self.queries = []
self.execute = mock.MagicMock()
self.QueryProcessor = mock.patch('kojihub.kojihub.QueryProcessor',
side_effect=self.get_query).start()
def tearDown(self):
mock.patch.stopall()
def getTask(self, task_id):
if task_id in self.tasks:
return self.tasks[task_id]
task = mock.MagicMock()
task.id = task_id
self.tasks[task_id] = task
return task
def get_query(self, *args, **kwargs):
query = QP(*args, **kwargs)
query.execute = self.execute
self.queries.append(query)
return query
def test_basic(self):
parent = 1
task_ids = [5, 6, 7]
for t in task_ids:
task = self.getTask(t)
task.getResult.return_value = "OK"
task.isCanceled.return_value = False
results = self.host_exports.taskWaitResults(parent, task_ids)
expect = [[t, "OK"] for t in task_ids]
self.assertEqual(results, expect)
self.assertEqual(self.queries, [])
self.host_exports.taskUnwait.assert_called_with(parent)
def test_error(self):
"""Ensure that errors is propagated when they should be"""
parent = 1
task_ids = [5, 6, 7]
for t in task_ids:
task = self.getTask(t)
task.getResult.return_value = "OK"
task.isCanceled.return_value = False
self.tasks[6].getResult.side_effect = xmlrpc.client.Fault(1, "error")
with self.assertRaises(xmlrpc.client.Fault):
results = self.host_exports.taskWaitResults(parent, task_ids)
self.assertEqual(results, [])
self.tasks[6].getResult.side_effect = koji.GenericError('problem')
with self.assertRaises(koji.GenericError):
results = self.host_exports.taskWaitResults(parent, task_ids)
self.assertEqual(results, [])
self.assertEqual(self.queries, [])
def test_canfail_canceled(self):
"""Canceled canfail tasks should not raise exceptions"""
parent = 1
task_ids = [5, 6, 7]
canfail = [7]
for t in task_ids:
task = self.getTask(t)
task.getResult.return_value = "OK"
task.isCanceled.return_value = False
self.tasks[7].getResult.side_effect = koji.GenericError('canceled')
self.tasks[7].isCanceled.return_value = True
results = self.host_exports.taskWaitResults(parent, task_ids, canfail=canfail)
expect_f = {'faultCode': koji.GenericError.faultCode,
'faultString': 'canceled'}
expect = [[5, "OK"], [6, "OK"], [7, expect_f]]
self.assertEqual(results, expect)
self.host_exports.taskUnwait.assert_called_with(parent)
self.assertEqual(self.queries, [])
def test_all_tasks(self):
"""Canceled canfail tasks should not raise exceptions"""
parent = 1
task_ids = [5, 6, 7]
self.execute.return_value = [[t] for t in task_ids]
for t in task_ids:
task = self.getTask(t)
task.getResult.return_value = "OK"
task.isCanceled.return_value = False
results = self.host_exports.taskWaitResults(parent, None)
expect = [[t, "OK"] for t in task_ids]
self.assertEqual(results, expect)
self.host_exports.taskUnwait.assert_called_with(parent)
self.assertEqual(len(self.queries), 1)
query = self.queries[0]
self.assertEqual(query.tables, ['task'])
self.assertEqual(query.columns, ['id'])