debian-koji/tests/test_hub/test_new_build.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

238 lines
7.6 KiB
Python

from unittest import mock
import unittest
import koji
import kojihub
IP = kojihub.InsertProcessor
class TestNewBuild(unittest.TestCase):
def setUp(self):
self.get_rpm = mock.patch("kojihub.kojihub.get_rpm").start()
self.get_external_repo_id = mock.patch(
"kojihub.kojihub.get_external_repo_id"
).start()
self.nextval = mock.patch("kojihub.kojihub.nextval").start()
self.Savepoint = mock.patch("kojihub.kojihub.Savepoint").start()
self.InsertProcessor = mock.patch(
"kojihub.kojihub.InsertProcessor", side_effect=self.getInsert
).start()
self.inserts = []
self.insert_execute = mock.MagicMock()
self.lookup_package = mock.patch("kojihub.kojihub.lookup_package").start()
self.new_package = mock.patch("kojihub.kojihub.new_package").start()
self.get_user = mock.patch("kojihub.kojihub.get_user").start()
self.get_build = mock.patch("kojihub.kojihub.get_build").start()
self.recycle_build = mock.patch("kojihub.kojihub.recycle_build").start()
self.context = mock.patch("kojihub.kojihub.context").start()
self.find_build_id = mock.patch("kojihub.kojihub.find_build_id").start()
def tearDown(self):
mock.patch.stopall()
def getInsert(self, *args, **kwargs):
insert = IP(*args, **kwargs)
insert.execute = self.insert_execute
self.inserts.append(insert)
return insert
def test_valid(self):
self.get_build.return_value = None
self.nextval.return_value = 65 # free build id
self.new_package.return_value = 54
self.get_user.return_value = {"id": 123}
data = {
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"owner": "test_owner",
"extra": {"extra_key": "extra_value"},
}
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 1)
insert = self.inserts[0]
self.assertEqual(insert.table, "build")
self.assertEqual(
insert.data,
{
"completion_time": "NOW",
"epoch": "test_epoch",
"extra": '{"extra_key": "extra_value"}',
"id": 65,
"owner": 123,
"pkg_id": 54,
"release": "test_release",
"source": None,
"start_time": "NOW",
"state": 1,
"task_id": None,
"draft": False,
"version": "test_version",
"volume_id": 0,
},
)
def test_empty_data(self):
with self.assertRaises(koji.GenericError):
kojihub.new_build({})
self.assertEqual(len(self.inserts), 0)
def test_wrong_pkg_id(self):
self.lookup_package.side_effect = koji.GenericError
data = {
"pkg_id": 444,
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"owner": "test_owner",
"extra": {"extra_key": "extra_value"},
}
with self.assertRaises(koji.GenericError):
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 0)
def test_missing_pkg_id_name(self):
data = {
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"owner": "test_owner",
"extra": {"extra_key": "extra_value"},
}
with self.assertRaises(koji.GenericError) as cm:
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 0)
self.assertEqual("No name or package id provided for build", str(cm.exception))
def test_wrong_owner(self):
self.get_user.side_effect = koji.GenericError
data = {
"owner": 123456,
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"extra": {"extra_key": "extra_value"},
}
with self.assertRaises(koji.GenericError):
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 0)
def test_missing_vre(self):
data = {
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
}
for item in ("version", "release", "epoch"):
d = data.copy()
del d[item]
with self.assertRaises(koji.GenericError):
kojihub.new_build(d)
self.assertEqual(len(self.inserts), 0)
def test_wrong_extra(self):
# extra dict contains unserializable data
class CantDoJSON(object):
pass
data = {
"owner": 123456,
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"extra": {"extra_key": CantDoJSON()},
}
with self.assertRaises(koji.GenericError) as cm:
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 0)
self.assertEqual(
"No such build extra data: %(extra)r" % data, str(cm.exception)
)
def test_draft(self):
data = {
"owner": 123456,
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"draft": True,
}
insert_data = {
"completion_time": "NOW",
"epoch": "test_epoch",
"id": 108,
"extra": None,
"owner": 123,
"pkg_id": 54,
"release": "test_release,draft_108",
"source": None,
"start_time": "NOW",
"state": 1,
"task_id": None,
"draft": True,
"version": "test_version",
"volume_id": 0,
}
self.nextval.return_value = 108
self.new_package.return_value = 54
self.get_user.return_value = {"id": 123}
self.get_build.side_effect = [None, mock.ANY]
self.find_build_id.return_value = None
kojihub.new_build(data)
self.assertEqual(len(self.inserts), 1)
insert = self.inserts[0]
self.assertEqual(insert.table, "build")
self.assertEqual(insert.data, insert_data)
self.get_build.assert_has_calls(
[
mock.call(
# it looks like a "draft build" because we use the "data" reference
{
"owner": 123,
"name": "test_name",
"version": "test_version",
"release": "test_release,draft_108",
"epoch": "test_epoch",
"draft": True,
"pkg_id": 54,
"extra": None,
"state": 1,
"start_time": "NOW",
"completion_time": "NOW",
"source": None,
"task_id": None,
"volume_id": 0,
"id": 108,
}
),
mock.call(108, strict=True),
]
)
self.find_build_id.assert_called_once_with(
{
"name": "test_name",
"version": "test_version",
"release": "test_release,draft_108",
}
)