unit tests

This commit is contained in:
Mike McLean 2026-05-13 15:36:22 -04:00 committed by Tomas Kopecek
commit dec25644da

View file

@ -2,7 +2,7 @@ from unittest import mock
import unittest
import koji
import kojihub
from kojihub import kojihub
IP = kojihub.InsertProcessor
@ -27,6 +27,7 @@ class TestNewBuild(unittest.TestCase):
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()
self.get_old_draft_build = mock.patch("kojihub.kojihub._get_old_draft_build").start()
def tearDown(self):
mock.patch.stopall()
@ -197,6 +198,7 @@ class TestNewBuild(unittest.TestCase):
self.get_user.return_value = {"id": 123}
self.get_build.side_effect = [None, mock.ANY]
self.find_build_id.return_value = None
self.get_old_draft_build.return_value = None
kojihub.new_build(data)
@ -236,3 +238,140 @@ class TestNewBuild(unittest.TestCase):
"release": "test_release,draft_108",
}
)
def test_draft_exists(self):
data = {
"owner": 123456,
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"draft": True,
}
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 = 101010
self.get_old_draft_build.return_value = None
self.nextval.return_value = 108
with self.assertRaises(koji.GenericError) as ex:
kojihub.new_build(data)
assert str(ex.exception).startswith('The build already exists')
self.assertEqual(len(self.inserts), 0)
self.find_build_id.assert_called_once_with(
{
"name": "test_name",
"version": "test_version",
"release": "test_release,draft_108",
}
)
def test_recycle(self):
self.get_build.return_value = {'id': 456, 'nvr': 'N-V-R'}
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"},
}
# shouldn't recycle if strict is True
with self.assertRaises(koji.GenericError) as ex:
kojihub.new_build(data, strict=True)
assert str(ex.exception).startswith('Existing build found')
self.assertEqual(len(self.inserts), 0)
# but should work if not
result = kojihub.new_build(data) # strict is off by default
self.assertEqual(len(self.inserts), 0)
self.assertEqual(result, 456)
def test_recycle_draft(self):
self.get_user.return_value = {"id": 123}
data = {
"name": "test_name",
"version": "test_version",
"release": "test_release",
"epoch": "test_epoch",
"owner": "test_owner",
"draft": True,
"extra": {"extra_key": "extra_value"},
}
# shouldn't recycle if non-draft build exists
self.get_build.return_value = {'id': 456, 'nvr': 'N-V-R'}
with self.assertRaises(koji.GenericError) as ex:
kojihub.new_build(data, strict=True)
assert str(ex.exception).startswith('Target build already exists')
self.recycle_build.assert_not_called()
self.assertEqual(len(self.inserts), 0)
# but should work if not
self.get_build.return_value = None
self.get_old_draft_build.return_value = {'id': 455, 'nvr': 'N-V-R,draft_455'}
result = kojihub.new_build(data)
self.assertEqual(len(self.inserts), 0)
self.recycle_build.assert_called_once()
self.assertEqual(result, 455)
class TestGetOldDraft(unittest.TestCase):
def setUp(self):
self.QueryProcessor = mock.patch("kojihub.kojihub.QueryProcessor").start()
self.get_build = mock.patch("kojihub.kojihub.get_build").start()
def tearDown(self):
mock.patch.stopall()
def test_query_skipped(self):
# cases where the function doesn't even query
# not a draft
data = {'draft': False, 'task_id': 1234, 'state': koji.BUILD_STATES['BUILDING']}
result = kojihub._get_old_draft_build(data)
self.assertEqual(result, None)
# no task id
data = {'draft': True, 'task_id': None, 'state': koji.BUILD_STATES['BUILDING']}
result = kojihub._get_old_draft_build(data)
self.assertEqual(result, None)
# wrong state
data = {'draft': True, 'task_id': 1234, 'state': koji.BUILD_STATES['COMPLETE']}
result = kojihub._get_old_draft_build(data)
self.assertEqual(result, None)
# none of these should have resulted in a query
self.QueryProcessor.assert_not_called()
def test_no_match(self):
# the function queries and gets no match
data = {
'name': 'foo', 'version': '1.2', 'release': '55',
'draft': True, 'task_id': 1234, 'state': koji.BUILD_STATES['BUILDING']}
self.QueryProcessor.return_value.execute.return_value = [] # no match
result = kojihub._get_old_draft_build(data)
self.assertEqual(result, None)
def test_match(self):
# the function queries and gets no match
data = {
'name': 'foo', 'version': '1.2', 'release': '55',
'draft': True, 'task_id': 1234, 'state': koji.BUILD_STATES['BUILDING']}
row = {'build.id': 5678}
self.QueryProcessor.return_value.execute.return_value = [row]
self.get_build.return_value = mock.sentinel.binfo
result = kojihub._get_old_draft_build(data)
self.assertEqual(result, mock.sentinel.binfo)
self.get_build.assert_called_with(5678)
# the end