From 8a24a701595406629ab38cc5581318896fccdd82 Mon Sep 17 00:00:00 2001 From: Jana Cupova Date: Mar 16 2021 12:08:57 +0000 Subject: api: createImageBuild non-existing build wrong buildinfo createImageBuild returns an error when build is not existing and buildinfo is not a dict Fixes: https://pagure.io/koji/issue/1106 --- diff --git a/hub/kojihub.py b/hub/kojihub.py index 8d2d284..e3ab06c 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -10771,13 +10771,27 @@ class RootExports(object): def createImageBuild(self, build_info): """ - Associate image metadata with an existing build. The build must not - already have associated image metadata. + Associate image metadata with an existing build. When build isn`t existing, creates a + build. The build must not already have associated image metadata. + + :param build_info: a str (build name) if build is existing + or a dict: + - name: build name + - version: build version + - release: build release + - epoch: build epoch + :raises: GenericError if type for build_info is not dict, when build isn`t existing. + :raises: GenericError if build info doesn't have mandatory keys. """ context.session.assertPerm('image-import') build = get_build(build_info) if not build: - build_id = new_build(dslice(build_info, ('name', 'version', 'release', 'epoch'))) + if not isinstance(build_info, dict): + raise koji.GenericError('Invalid type for build_info: %s' % type(build_info)) + try: + build_id = new_build(dslice(build_info, ('name', 'version', 'release', 'epoch'))) + except KeyError as cm: + raise koji.GenericError("Build info doesn't have mandatory %s key" % cm) build = get_build(build_id, strict=True) new_image_build(build) diff --git a/tests/test_hub/test_create_image_build.py b/tests/test_hub/test_create_image_build.py new file mode 100644 index 0000000..3ccfcd7 --- /dev/null +++ b/tests/test_hub/test_create_image_build.py @@ -0,0 +1,86 @@ +import unittest + +import mock + +import koji +import kojihub + +IP = kojihub.InsertProcessor + + +class TestCreateImageBuild(unittest.TestCase): + + def setUp(self): + self.get_build = mock.patch('kojihub.get_build').start() + self.exports = kojihub.RootExports() + self.InsertProcessor = mock.patch('kojihub.InsertProcessor', + side_effect=self.getInsert).start() + self.inserts = [] + self.insert_execute = mock.MagicMock() + + def getInsert(self, *args, **kwargs): + insert = IP(*args, **kwargs) + insert.execute = self.insert_execute + self.inserts.append(insert) + return insert + + def test_empty_wrong_format_non_exist_build_info(self): + build_info = 'test-build-11-12' + self.get_build.return_value = None + with self.assertRaises(koji.GenericError) as cm: + self.exports.createImageBuild(build_info) + self.assertEqual('Invalid type for build_info: %s' % type(build_info), str(cm.exception)) + self.assertEqual(len(self.inserts), 0) + + def test_build_info_without_some_mandatory_key(self): + # build_info without name + get_build_info = { + 'id': 100, + 'version': 'test_version', + 'release': 'test_release', + 'epoch': 'test_epoch', + } + self.get_build.return_value = None + with self.assertRaises(koji.GenericError) as cm: + self.exports.createImageBuild(get_build_info) + self.assertEqual("Build info doesn't have mandatory 'name' key", str(cm.exception)) + self.assertEqual(len(self.inserts), 0) + + # build_info without version + get_build_info = { + 'id': 100, + 'name': 'test_name', + 'release': 'test_release', + 'epoch': 'test_epoch', + } + self.get_build.return_value = None + with self.assertRaises(koji.GenericError) as cm: + self.exports.createImageBuild(get_build_info) + self.assertEqual("Build info doesn't have mandatory 'version' key", str(cm.exception)) + self.assertEqual(len(self.inserts), 0) + + # build_info without release + get_build_info = { + 'id': 100, + 'name': 'test_name', + 'version': 'test_version', + 'epoch': 'test_epoch', + } + self.get_build.return_value = None + with self.assertRaises(koji.GenericError) as cm: + self.exports.createImageBuild(get_build_info) + self.assertEqual("Build info doesn't have mandatory 'release' key", str(cm.exception)) + self.assertEqual(len(self.inserts), 0) + + # build_info without epoch + get_build_info = { + 'id': 100, + 'name': 'test_name', + 'version': 'test_version', + 'release': 'test_release', + } + self.get_build.return_value = None + with self.assertRaises(koji.GenericError) as cm: + self.exports.createImageBuild(get_build_info) + self.assertEqual("Build info doesn't have mandatory 'epoch' key", str(cm.exception)) + self.assertEqual(len(self.inserts), 0)