diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index 34694173..ea49ee42 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -3706,8 +3706,7 @@ def handle_clone_tag(goptions, session, args): parser.add_option("-f", "--force", action="store_true", help="override tag locks if necessary") parser.add_option("-n", "--test", action="store_true", help=SUPPRESS_HELP) - parser.add_option("--batch", type='int', default=100, metavar='SIZE', - help="batch size of multicalls [0 to disable, default: %default]") + parser.add_option("--batch", type='int', default=100, metavar='SIZE', help=SUPPRESS_HELP) (options, args) = parser.parse_args(args) if len(args) != 2: @@ -3740,8 +3739,6 @@ def handle_clone_tag(goptions, session, args): except koji.GenericError: parser.error("No such src-tag: %s" % args[0]) dsttag = session.getTag(args[1]) - if not srctag: - parser.error("No such src-tag: %s" % args[0]) if (srctag['locked'] and not options.force) \ or (dsttag and dsttag['locked'] and not options.force): parser.error("Error: You are attempting to clone from or to a tag which is locked.\n" diff --git a/tests/test_cli/test_clone_tag.py b/tests/test_cli/test_clone_tag.py index 0cf388cb..b6f7eb31 100644 --- a/tests/test_cli/test_clone_tag.py +++ b/tests/test_cli/test_clone_tag.py @@ -19,10 +19,6 @@ class TestCloneTag(utils.CliTestCase): self.session = mock.MagicMock() self.options = mock.MagicMock() self.session.hasPerm.return_value = True - self.session.getTag.side_effect = [{'id': 1, - 'locked': False}, - {'id': 2, - 'locked': False}] self.activate_session = mock.patch('koji_cli.commands.activate_session').start() self.error_format = """Usage: %s clone-tag [options] @@ -31,6 +27,90 @@ clone-tag will create the destination tag if it does not already exist %s: error: {message} """ % (self.progname, self.progname) + self.get_tag_info = {'id': 2, + 'name': 'dst-tag', + 'arches': 'arch1 arch2', + 'perm_id': 1, + 'maven_support': False, + 'maven_include_all': True, + 'locked': False, + 'extra': {}} + self.tag_groups = [{'name': 'group1', + 'tag_id': 2, + 'packagelist': [ + {'package': 'pkg1', + 'blocked': False}, + {'package': 'pkg5', + 'blocked': False} + ]}, + {'name': 'group2', + 'tag_id': 3, + 'packagelist': [ + {'package': 'apkg', + 'blocked': False}, + {'package': 'cpkg', + 'blocked': False}]}, + {'name': 'group3', + 'tag_id': 2, + 'packagelist': [ + {'package': 'cpkg', + 'blocked': False}, + {'package': 'dpkg', + 'blocked': False}]}, + {'name': 'group4', + 'tag_id': 3, + 'packagelist': [ + {'package': 'epkg', + 'blocked': False}, + {'package': 'fpkg', + 'blocked': False}]} + ] + self.get_build_config = { + 'id': 1, + 'name': 'src-tag', + 'arches': 'arch1 arch2', + 'perm_id': 1, + 'maven_support': False, + 'maven_include_all': True, + 'locked': False, + 'extra': {}} + self.list_packages = [{'package_id': 1, + 'package_name': 'pkg1', + 'blocked': False, + 'owner_name': 'userA', + 'tag_name': 'src-tag', + 'extra_arches': None}, + {'package_id': 2, + 'package_name': 'pkg2', + 'blocked': True, + 'owner_name': 'userB', + 'tag_name': 'src-tag-p', + 'extra_arches': 'arch3 arch4'}, + {'package_id': 3, + 'package_name': 'apkg', + 'blocked': False, + 'owner_name': 'userA', + 'tag_name': 'src-tag-p', + 'extra_arches': 'arch4'}, + {'package_id': 4, + 'package_name': 'bpkg', + 'blocked': False, + 'owner_name': 'userC', + 'tag_name': 'src-tag', + 'extra_arches': 'arch4'}, + {'package_id': 5, + 'package_name': 'cpkg', + 'blocked': True, + 'owner_name': 'userC', + 'tag_name': 'src-tag-p', + 'extra_arches': 'arch4'}, + {'package_id': 6, + 'package_name': 'dpkg', + 'blocked': True, + 'owner_name': 'userC', + 'tag_name': 'src-tag', + 'extra_arches': 'arch4'} + ] def tearDown(self): mock.patch.stopall() @@ -48,6 +128,11 @@ clone-tag will create the destination tag if it does not already exist exit_code=2 ) self.activate_session.assert_not_called() + self.session.hasPerm.assert_not_called() + self.session.getBuildConfig.assert_not_called() + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_not_admin(self): args = ['src-tag', 'dst-tag'] @@ -63,6 +148,10 @@ clone-tag will create the destination tag if it does not already exist ) self.activate_session.assert_called_once() self.session.hasPerm.assert_has_calls([call('admin'), call('tag')]) + self.session.getBuildConfig.assert_not_called() + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_same_tag(self): args = ['src-tag', 'src-tag'] @@ -75,6 +164,11 @@ clone-tag will create the destination tag if it does not already exist activate_session=None, exit_code=2) self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_not_called() + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_invalid_batch(self): args = ['src-tag', 'dst-tag', '--batch=-1'] @@ -87,6 +181,11 @@ clone-tag will create the destination tag if it does not already exist activate_session=None, exit_code=2) self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_not_called() + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_no_srctag(self): args = ['src-tag', 'dst-tag'] @@ -100,12 +199,15 @@ clone-tag will create the destination tag if it does not already exist activate_session=None, exit_code=2) self.activate_session.assert_called_once() - self.activate_session.getTag.has_called([call('src-tag'), call('dst-tag')]) + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_locked(self): args = ['src-tag', 'dst-tag'] - self.session.getTag.side_effect = [{'id': 1, 'locked': True}, - {'id': 2, 'locked': False}] + self.session.getTag.return_value = {'id': 2, 'locked': True} self.assert_system_exit( handle_clone_tag, self.options, @@ -117,201 +219,42 @@ clone-tag will create the destination tag if it does not already exist activate_session=None, exit_code=2) self.activate_session.assert_called_once() - self.activate_session.getTag.has_called([call('src-tag'), call('dst-tag')]) + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() - self.activate_session.getTag.has_called([call('src-tag'), call('dst-tag')]) - - @mock.patch('sys.stdout', new_callable=six.StringIO) - def test_handle_clone_tag_new_dsttag(self, stdout): + def test_handle_clone_tag_new_dsttag(self): args = ['src-tag', 'dst-tag', '--all', '-v'] - self.session.listPackages.return_value = [{'package_id': 1, - 'package_name': 'pkg1', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag', - 'extra_arches': None}, - {'package_id': 2, - 'package_name': 'pkg2', - 'blocked': True, - 'owner_name': 'userB', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch3 arch4'}, - {'package_id': 3, - 'package_name': 'apkg', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch4'}] - self.session.listTagged.return_value = [{'package_name': 'pkg1', - 'nvr': 'pkg1-1.1-2', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-1.0-2', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-1.0-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg2', - 'nvr': 'pkg2-1.0-1', - 'state': 2, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag-p'} - ] - self.session.getTagGroups.return_value = [{'name': 'group1', - 'packagelist': [ - {'package': 'pkg1', - 'blocked': False}, - {'package': 'pkg2', - 'blocked': False}]}, - {'name': 'group2', - 'packagelist': [ - {'package': 'apkg', - 'blocked': False}, - {'package': 'bpkg', - 'blocked': False}] - }] - self.session.getTag.side_effect = [None, - {'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] - self.session.getBuildConfig.side_effect = [{'id': 1, - 'name': 'src-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - ] - self.session.multiCall.return_value = [] + self.session.listPackages.return_value = [self.list_packages[0], self.list_packages[1], + self.list_packages[2]] + self.session.getTagGroups.return_value = [self.tag_groups[0], self.tag_groups[1]] + self.session.getTag.return_value = None + self.session.getBuildConfig.return_value = self.get_build_config handle_clone_tag(self.options, self.session, args) self.activate_session.assert_called_once() - self.session.assert_has_calls([call.hasPerm('admin'), - call.getBuildConfig('src-tag', event=None), - call.getTag('dst-tag'), - call.snapshotTag(1, 'dst-tag', - builds=True, config=True, event=None, - force=None, groups=True, - inherit_builds=None, latest_only=None, - pkgs=True), - ]) + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTag.assert_called_once_with(1, 'dst-tag', builds=True, config=True, + event=None, force=None, groups=True, + inherit_builds=None, latest_only=None, + pkgs=True) + self.session.snapshotTagModify.assert_not_called() + @mock.patch('koji.util.eventFromOpts', return_value={'id': 1000, 'ts': 1000000.11}) @mock.patch('sys.stdout', new_callable=six.StringIO) - def test_handle_clone_tag_existing_dsttag(self, stdout): - args = ['src-tag', 'dst-tag', '--all', '-v'] - self.session.multiCall.return_value = [] - self.session.listPackages.side_effect = [[{'package_id': 1, - 'package_name': 'pkg1', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag', - 'extra_arches': None}, - {'package_id': 2, - 'package_name': 'pkg2', - 'blocked': True, - 'owner_name': 'userB', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch3 arch4'}, - {'package_id': 3, - 'package_name': 'apkg', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch4'}], - [{'package_id': 1, - 'package_name': 'pkg1', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag', - 'extra_arches': None}, - {'package_id': 3, - 'package_name': 'apkg', - 'blocked': False, - 'owner_name': 'userA', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch4'}, - {'package_id': 4, - 'package_name': 'bpkg', - 'blocked': False, - 'owner_name': 'userC', - 'tag_name': 'src-tag', - 'extra_arches': 'arch4'}, - {'package_id': 5, - 'package_name': 'cpkg', - 'blocked': True, - 'owner_name': 'userC', - 'tag_name': 'src-tag-p', - 'extra_arches': 'arch4'}, - {'package_id': 6, - 'package_name': 'dpkg', - 'blocked': True, - 'owner_name': 'userC', - 'tag_name': 'src-tag', - 'extra_arches': 'arch4'} - ]] - self.session.listTagged.side_effect = [[{'package_name': 'pkg1', - 'nvr': 'pkg1-1.1-2', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-1.0-2', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-1.0-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'package_name': 'pkg2', - 'nvr': 'pkg2-1.0-1', - 'state': 2, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag-p'} - ], - [{'package_name': 'pkg1', - 'nvr': 'pkg1-2.1-2', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'dst-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-1.0-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'dst-tag'}, - {'package_name': 'pkg1', - 'nvr': 'pkg1-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'dst-tag'}, - {'package_name': 'pkg2', - 'nvr': 'pkg2-1.0-1', - 'state': 2, - 'owner_name': 'b_owner', - 'tag_name': 'dst-tag'}, - {'package_name': 'pkg3', - 'nvr': 'pkg3-1.0-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'dst-tag'} - ]] + def test_handle_clone_tag_existing_dsttag(self, stdout, event_from_opts_mock): + args = ['src-tag', 'dst-tag', '--all', '-v', '--event=123'] + self.session.listPackages.side_effect = [[self.list_packages[0], self.list_packages[1], + self.list_packages[2]], + [self.list_packages[0], + self.list_packages[2], + self.list_packages[3], + self.list_packages[4], + self.list_packages[5]] + ] self.session.getTagGroups.side_effect = [[{'name': 'group1', 'tag_id': 1, 'packagelist': [ @@ -332,266 +275,117 @@ clone-tag will create the destination tag if it does not already exist {'package': 'bpkg', 'blocked': False}] }], - [{'name': 'group1', - 'tag_id': 2, - 'packagelist': [ - {'package': 'pkg1', - 'blocked': False}, - {'package': 'pkg5', - 'blocked': False} - ]}, - {'name': 'group2', - 'tag_id': 3, - 'packagelist': [ - {'package': 'apkg', - 'blocked': False}, - {'package': 'cpkg', - 'blocked': False}]}, - {'name': 'group3', - 'tag_id': 2, - 'packagelist': [ - {'package': 'cpkg', - 'blocked': False}, - {'package': 'dpkg', - 'blocked': False}]}, - {'name': 'group4', - 'tag_id': 3, - 'packagelist': [ - {'package': 'epkg', - 'blocked': False}, - {'package': 'fpkg', - 'blocked': False}]} - ]] - self.session.getBuildConfig.side_effect = [{'id': 1, - 'name': 'src-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] - self.session.getTag.side_effect = [{'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - {'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] + [self.tag_groups[0], self.tag_groups[1], + self.tag_groups[2], self.tag_groups[3]]] + self.session.getBuildConfig.return_value = self.get_build_config + self.session.getTag.return_value = self.get_tag_info handle_clone_tag(self.options, self.session, args) + event = {'id': 1000, 'timestr': 'Mon Jan 12 14:46:40 1970'} + self.assert_console_message(stdout, "Cloning at event %(id)i (%(timestr)s)\n" % event) self.activate_session.assert_called_once() - self.session.assert_has_calls([call.hasPerm('admin'), - call.getBuildConfig('src-tag', event=None), - call.getTag('dst-tag'), - call.snapshotTagModify(1, 'dst-tag', - builds=True, config=True, - event=None, force=None, - groups=True, inherit_builds=None, - latest_only=None, pkgs=True, - remove=True) - ]) + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=1000) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_called_once_with(1, 'dst-tag', builds=True, + config=True, event=1000, force=None, + groups=True, inherit_builds=None, + latest_only=None, pkgs=True, + remove=True) + self.session.snapshotTag.assert_not_called() - @mock.patch('sys.stdout', new_callable=six.StringIO) - def test_handle_clone_tag_existing_dsttag_nodelete(self, stdout): + def test_handle_clone_tag_existing_dsttag_nodelete(self): args = ['src-tag', 'dst-tag', '--all', '-v', '--no-delete'] - self.session.multiCall.return_value = [] self.session.listPackages.return_value = [] - self.session.listTagged.side_effect = [[{'id': 1, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-23', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 2, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-21', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 3, - 'package_name': 'pkg', - 'nvr': 'pkg-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - ], - [], - ] self.session.getTagGroups.return_value = [] - self.session.getBuildConfig.side_effect = [{'id': 1, - 'name': 'src-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] - self.session.getTag.side_effect = [{'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - {'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] + self.session.getBuildConfig.return_value = self.get_build_config + self.session.getTag.return_value = self.get_tag_info handle_clone_tag(self.options, self.session, args) self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_called_once_with(1, 'dst-tag', builds=True, + config=True, event=None, force=None, + groups=True, inherit_builds=None, + latest_only=None, pkgs=True, + remove=False) + self.session.snapshotTag.assert_not_called() - @mock.patch('sys.stdout', new_callable=six.StringIO) - def test_handle_clone_tag_existing_dsttag_nodelete_1(self, stdout): + def test_handle_clone_tag_existing_dsttag_nodelete_1(self): args = ['src-tag', 'dst-tag', '--all', '-v', '--no-delete'] - self.session.multiCall.return_value = [] self.session.listPackages.return_value = [] - self.session.listTagged.side_effect = [[{'id': 1, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-23', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 2, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-21', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 3, - 'package_name': 'pkg', - 'nvr': 'pkg-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - ], - [{'id': 1, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-23', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 3, - 'package_name': 'pkg', - 'nvr': 'pkg-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 2, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-21', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - ] - ] self.session.getTagGroups.return_value = [] - self.session.getTag.side_effect = [{'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - {'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] - self.session.getBuildConfig.return_value = { - 'id': 1, - 'name': 'src-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}} + self.session.getTag.return_value = self.get_tag_info + self.session.getBuildConfig.return_value = self.get_build_config handle_clone_tag(self.options, self.session, args) self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_called_once_with(1, 'dst-tag', builds=True, + config=True, event=None, force=None, + groups=True, inherit_builds=None, + latest_only=None, pkgs=True, + remove=False) + self.session.snapshotTag.assert_not_called() - @mock.patch('sys.stdout', new_callable=six.StringIO) - def test_handle_clone_tag_existing_dsttag_nodelete_2(self, stdout): + def test_handle_clone_tag_existing_dsttag_nodelete_2(self): args = ['src-tag', 'dst-tag', '--all', '-v', '--no-delete'] - self.session.multiCall.return_value = [] self.session.listPackages.return_value = [] - self.session.listTagged.side_effect = [[{'id': 1, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-23', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 2, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-21', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 3, - 'package_name': 'pkg', - 'nvr': 'pkg-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - ], - [{'id': 2, - 'package_name': 'pkg', - 'nvr': 'pkg-1.0-21', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - {'id': 3, - 'package_name': 'pkg', - 'nvr': 'pkg-0.1-1', - 'state': 1, - 'owner_name': 'b_owner', - 'tag_name': 'src-tag'}, - ] - ] self.session.getTagGroups.return_value = [] - self.session.getTag.side_effect = [{'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - {'id': 2, - 'name': 'dst-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}] - self.session.getBuildConfig.side_effect = [{'id': 1, - 'name': 'src-tag', - 'arches': 'arch1 arch2', - 'perm_id': 1, - 'maven_support': False, - 'maven_include_all': True, - 'locked': False, - 'extra': {}}, - ] + self.session.getTag.return_value = self.get_tag_info + self.session.getBuildConfig.return_value = self.get_build_config handle_clone_tag(self.options, self.session, args) self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_called_once_with(1, 'dst-tag', builds=True, + config=True, event=None, force=None, + groups=True, inherit_builds=None, + latest_only=None, pkgs=True, + remove=False) + self.session.snapshotTag.assert_not_called() + + def test_handle_clone_tag_option_builds_and_not_pkgs(self): + args = ['src-tag', 'dst-tag', '--builds'] + self.assert_system_exit( + handle_clone_tag, + self.options, + self.session, + args, + stderr=self.format_error_message( + "--builds can't be used without also specifying --pkgs"), + activate_session=None, + exit_code=2) + + self.activate_session.assert_called_once() + self.session.hasPerm.assert_called_once_with('admin') + self.session.getBuildConfig.assert_not_called() + self.session.getTag.assert_not_called() + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() + + def test_handle_clone_tag_option_test(self): + self.session.getTag.return_value = self.get_tag_info + self.session.getBuildConfig.return_value = self.get_build_config + args = ['src-tag', 'dst-tag', '--test'] + self.assert_system_exit( + handle_clone_tag, + self.options, + self.session, + args, + stderr=self.format_error_message( + "server-side operation, test output is no longer available"), + activate_session=None, + exit_code=2) + + self.activate_session.assert_called_once() + self.session.hasPerm.assert_not_called() + self.session.getBuildConfig.assert_called_once_with('src-tag', event=None) + self.session.getTag.assert_called_once_with('dst-tag') + self.session.snapshotTagModify.assert_not_called() + self.session.snapshotTag.assert_not_called() def test_handle_clone_tag_help(self): self.assert_help( @@ -616,7 +410,6 @@ Options: --repo=REPO Clone tag at a specific repo event --notify Send tagging/untagging notifications -f, --force override tag locks if necessary - --batch=SIZE batch size of multicalls [0 to disable, default: 100] """ % self.progname)