parse target_release from draft release instead of extra.draft.target_release

This commit is contained in:
Yu Ming Zhu 2023-11-14 10:25:44 +00:00
parent d3ac45ca60
commit f29e5e143e
6 changed files with 161 additions and 98 deletions

View file

@ -1,9 +1,11 @@
from __future__ import absolute_import
import mock
import os
import six
import unittest
import mock
import six
import koji
from koji_cli.commands import handle_import
from . import utils
@ -111,22 +113,24 @@ class TestImport(utils.CliTestCase):
# check mock calls
activate_session_mock.assert_called_with(session, options)
get_header_fields_calls = [
mock.call(arguments[i],
('name', 'version', 'release', 'epoch',
'arch', 'sigmd5', 'sourcepackage', 'sourcerpm')
) for i in range(len(rpm_headers) - 1)
]
]
get_header_fields_mock.assert_has_calls(get_header_fields_calls)
if getrpm_calls:
session.getRPM.assert_has_calls(getrpm_calls)
elif getrpm_called:
session.getRPM.assert_called_with(
dict((k, rpm_header.get(k, ''))
for k in ['release', 'version', 'arch', 'name'])
dict(
(k, rpm_header.get(k, ''))
for k in ['release', 'version', 'arch', 'name']
)
)
else:
session.getRPM.assert_not_called()
@ -174,8 +178,10 @@ class TestImport(utils.CliTestCase):
)
if getrpm_called:
session.getRPM.assert_called_with(
dict((k, rpm_header.get(k, ''))
for k in ['release', 'version', 'arch', 'name'])
dict(
(k, rpm_header.get(k, ''))
for k in ['release', 'version', 'arch', 'name']
)
)
else:
session.getRPM.assert_not_called()
@ -821,17 +827,13 @@ class TestImport(utils.CliTestCase):
'version': '4.4.12',
'release': '5.fc26#draft_123',
'nvr': 'bash-4.4.12-5.fc26',
'id': '123',
'draft': True,
'extra': {
'draft': {
'target_release': '5.fc26'
}
},
'state': self.bstate['COMPLETE']
}
session.getBuild.return_value = build
# Case 1. import src rpm with --draft-build
# Case 1. import src rpm with --draft-build
# result: success
expected = "uploading %s... done\n" % arguments[0]
expected += "importing %s... done\n" % arguments[0]
@ -859,25 +861,21 @@ class TestImport(utils.CliTestCase):
session = mock.MagicMock()
session.getRPM.return_value = None
build = {
'id': '123',
'name': 'bash',
'version': '4.4.12',
'release': '5.fc26#draft_123',
'nvr': 'bash-4.4.12-5.fc26',
'draft': True,
'extra': {
'draft': {
'target_release': '5.fc26'
}
},
'state': self.bstate['COMPLETE']
}
session.getBuild.return_value = build
# Case 1. import bin rpm with --draft-build
# Case 1. import bin rpm with --draft-build
# result: success
expected = "uploading %s... done\n" % arguments[0]
expected += "importing %s... done\n" % arguments[0]
self.__do_import_test(
options, session, arguments,
rpm_header=self.rpm_header,
@ -892,32 +890,55 @@ class TestImport(utils.CliTestCase):
arguments = ['/path/to/bash-4.4.12-5.fc26.rpm', '--draft-build', '286']
options = mock.MagicMock()
session = mock.MagicMock()
cases = [
# build, stderr
# build, stderr
(None, "No such build: 286"),
({'draft': False, 'nvr': 'a-bad-draft'}, "a-bad-draft is not a draft build"),
({'draft': True, 'nvr': 'a-bad-draft', 'state': koji.BUILD_STATES['DELETED']},
"draft build a-bad-draft is expected as COMPLETE, got DELETED"),
({'draft': True, 'nvr': 'a-bad-draft', 'state': koji.BUILD_STATES['COMPLETE'],
'extra': {'draft': {'no_target_release': 'omg'}}},
"Invalid draft build: a-bad-draft, no draft.target_release found in extra")
"draft build a-bad-draft is expected as COMPLETE, got DELETED")
]
for build, expected in cases:
session.getBuild.return_value = build
# result: error
expected += "\n"
self.assert_system_exit(
handle_import,
options,
session,
arguments,
stderr=expected,
activate_session=None,
exit_code=1)
handle_import,
options,
session,
arguments,
stderr=expected,
activate_session=None,
exit_code=1)
options.reset_mock()
session.reset_mock()
def test_handle_import_specified_draft_build_invalid_target_release(self):
"""Test handle_import RPM import with --draft-build case.
Invalid target_release parsing
"""
arguments = ['/path/to/bash-4.4.12-5.fc26.rpm', '--draft-build', '286']
options = mock.MagicMock()
session = mock.MagicMock()
cases = [
# build, stderr
({'draft': True, 'nvr': 'a-bad-draft', 'state': koji.BUILD_STATES['COMPLETE'],
'release': 'no_id'},
"'id' not found in"
" {'draft': True, 'nvr': 'a-bad-draft', 'state': 1, 'release': 'no_id'}"),
({'draft': True, 'nvr': 'a-bad-draft', 'state': koji.BUILD_STATES['COMPLETE'],
'id': 123, 'release': 'tgt#draft_234'},
"buildinfo.id: 123 doesn't match build id part: 234"
" in buildinfo.release: tgt#draft_234")
]
for build, expected in cases:
session.getBuild.return_value = build
# result: error
with self.assertRaises(koji.GenericError) as cm:
handle_import(options, session, arguments)
self.assertEqual(str(cm.exception), expected)
def test_handle_import_help(self):
"""Test handle_import function help message"""
self.assert_help(

View file

@ -78,7 +78,6 @@ class TestImportRPM(unittest.TestCase):
kojihub.import_rpm(self.filename)
self.assertEqual("Build is FAILED: name-version-release", str(cm.exception))
self.assertEqual(len(self.inserts), 0)
def test_import_rpm_completed_build(self):
self.os_path_basename.return_value = 'name-version-release.arch.rpm'
@ -212,14 +211,13 @@ class TestImportRPM(unittest.TestCase):
self.assertEqual(insert.data, data)
self.assertEqual(insert.rawdata, {})
def test_import_draft_conflict(self):
with self.assertRaises(koji.GenericError) as cm:
kojihub.import_rpm(self.filename, buildinfo={'id': 1024, 'draft': False}, draft=True)
self.assertEqual("draft property: False of build: 1024 mismatch, True is expected",
str(cm.exception))
self.assertEqual(len(self.inserts), 0)
def test_import_draft_rpm_without_buildinfo(self):
self.os_path_basename.return_value = 'name-version-release.arch.rpm'
self.get_rpm_header.return_value = self.rpm_header_retval
@ -229,8 +227,8 @@ class TestImportRPM(unittest.TestCase):
self.assertEqual(f"Cannot import draft rpm: {self.os_path_basename.return_value}"
" without specifying a build", str(cm.exception))
self.assertEqual(len(self.inserts), 0)
def test_import_draft_rpm_non_extra_target_release(self):
def test_import_draft_rpm_invalid_release(self):
self.os_path_basename.return_value = 'name-version-release.arch.rpm'
self.get_rpm_header.return_value = self.rpm_header_retval
@ -238,7 +236,7 @@ class TestImportRPM(unittest.TestCase):
'state': koji.BUILD_STATES['DELETED'],
'name': 'name',
'version': 'version',
'release': 'release',
'release': 'badrelease',
'id': 12345,
'draft': True
}
@ -246,11 +244,11 @@ class TestImportRPM(unittest.TestCase):
with self.assertRaises(koji.GenericError) as cm:
kojihub.import_rpm(self.filename, buildinfo=buildinfo, draft=True)
self.assertEqual(
f'target release of draft build not found in extra of build: {buildinfo}',
'draft release: badrelease is not in valid format',
str(cm.exception)
)
self.assertEqual(len(self.inserts), 0)
def test_import_draft_rpm_valid(self):
self.os_path_basename.return_value = 'name-version-release.arch.rpm'
self.get_rpm_header.return_value = self.rpm_header_retval
@ -259,7 +257,7 @@ class TestImportRPM(unittest.TestCase):
'state': koji.BUILD_STATES['COMPLETE'],
'name': 'name',
'version': 'version',
'release': 'release',
'release': 'release#draft_12345',
'id': 12345,
'draft': True,
'extra': {
@ -305,14 +303,9 @@ class TestImportRPM(unittest.TestCase):
'state': koji.BUILD_STATES['COMPLETE'],
'name': 'name',
'version': 'version',
'release': 'release',
'release': 'release#draft_12345',
'id': 12345,
'draft': True,
'extra': {
'draft': {
'target_release': 'release'
}
}
'draft': True
}
self.nextval.return_value = 9876
kojihub.import_rpm(self.src_filename, buildinfo=buildinfo, draft=True)
@ -384,4 +377,4 @@ class TestImportRPM(unittest.TestCase):
self.assertEqual(insert.data, data)
self.assertEqual(insert.rawdata, {})
self.get_build.assert_called_once_with(5566, strict=True)
self.assertEqual(self.get_build.call_count, 1)
self.assertEqual(self.get_build.call_count, 1)

View file

@ -36,7 +36,9 @@ class TestPromoteBuild(unittest.TestCase):
self.list_tags = mock.patch('kojihub.kojihub.list_tags',
return_value=[{'id': 101}]).start()
self.set_tag_update = mock.patch('kojihub.kojihub.set_tag_update').start()
self.encode_datetime = mock.patch('kojihub.kojihub.encode_datetime', return_value='NOW').start()
self.encode_datetime = mock.patch(
'kojihub.kojihub.encode_datetime', return_value='NOW'
).start()
self._now = datetime.datetime.now()
self._datetime = mock.patch('kojihub.kojihub.datetime.datetime').start()
self.now = self._datetime.now = mock.MagicMock(return_value=self._now)
@ -45,12 +47,12 @@ class TestPromoteBuild(unittest.TestCase):
'id': 1,
'name': 'foo',
'version': 'bar',
'release': 'dftrel_1',
'release': 'tgtrel#draft_1',
'nvr': 'testnvr',
'extra': {
'draft': {
'promoted': False,
'target_release': 'tgtrel_1'
'target_release': 'tgtrel'
}},
'state': 1,
'draft': True,
@ -58,13 +60,13 @@ class TestPromoteBuild(unittest.TestCase):
'volume_name': 'X',
'task_id': 222
}
self.new_build = {
self.new_build = {
# no check on the info
'id': 1,
'name': 'foo',
'version': 'bar',
'release': 'tgtrel_1',
'release': 'tgtrel',
'volume_name': 'X'
}
@ -82,15 +84,15 @@ class TestPromoteBuild(unittest.TestCase):
{
'draft': {
'promoted': True,
'target_release': 'tgtrel_1',
'old_release': 'dftrel_1',
'target_release': 'tgtrel',
'old_release': 'tgtrel#draft_1',
'promotion_time': 'NOW',
'promotion_ts': self._now.timestamp(),
'promoter': self.user['name']
}
}
)
ret = self.exports.promoteBuild('a-draft-build', strict=True)
self.assertEqual(ret, self.new_build)
self.assertEqual(len(self.updates), 1)
@ -98,7 +100,7 @@ class TestPromoteBuild(unittest.TestCase):
self.assertEqual(update.table, 'build')
self.assertEqual(update.values, self.draft_build)
self.assertEqual(update.data, {'draft': False,
'release': 'tgtrel_1',
'release': 'tgtrel',
'extra': extra})
self.assertEqual(update.rawdata, {})
self.assertEqual(update.clauses, ['id=%(id)i'])
@ -113,21 +115,22 @@ class TestPromoteBuild(unittest.TestCase):
self.exports.promoteBuild('a-regular-build', strict=True)
self.assertEqual(str(cm.exception), "Not a draft build: {'draft': False}")
self.assertEqual(len(self.updates), 0)
ret = self.exports.promoteBuild('a-regular-build', strict=False)
self.assertIsNone(ret)
self.assertEqual(len(self.updates), 0)
def test_promote_build_no_target_release(self):
def test_promote_build__target_release(self):
draft = {
'id': 1,
'name': 'foo',
'version': 'bar',
'release': 'dftrel_1',
'release': 'tgtrel#draft_2',
'extra': {
'draft': {
'promoted': False
# no target_release
'promoted': False,
# target_release doesn't matter now
'target_release': 'any'
}},
'state': 1,
'draft': True,
@ -135,14 +138,17 @@ class TestPromoteBuild(unittest.TestCase):
'volume_name': 'X',
'task_id': 222
}
self.get_build.return_value = draft
with self.assertRaises(koji.GenericError) as cm:
self.exports.promoteBuild('a-regular-build', strict=True)
self.assertEqual(str(cm.exception), f"draft.target_release not found in extra of build: {draft}")
self.assertEqual(
str(cm.exception),
"buildinfo.id: 1 doesn't match build id part: 2 in buildinfo.release: tgtrel#draft_2"
)
self.assertEqual(len(self.updates), 0)
ret = self.exports.promoteBuild('a-regular-build', strict=False)
self.assertIsNone(ret)
self.assertEqual(len(self.updates), 0)
@ -152,12 +158,12 @@ class TestPromoteBuild(unittest.TestCase):
'id': 1,
'name': 'foo',
'version': 'bar',
'release': 'dftrel_1',
'release': 'tgtrel#draft_1',
'nvr': 'testnvr',
'extra': {
'draft': {
'promoted': False
# no target_release
'promoted': False,
'target_release': 'any'
}},
'draft': True,
'state': 0,
@ -193,9 +199,9 @@ class TestPromoteBuild(unittest.TestCase):
self.get_build.assert_called_with({
'name': 'foo',
'version': 'bar',
'release': 'tgtrel_1'
'release': 'tgtrel'
})
self.get_build.reset_mock()
self.get_build.side_effect = [self.draft_build, old]
ret = self.exports.promoteBuild('a-regular-build', strict=False)