From a844de42ff86e56cc16504ea7af328a9b5a66643 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Jul 19 2021 12:04:20 +0000 Subject: PR#2942: Increase coverage of CLI unit tests Merges #2942 https://pagure.io/koji/pull-request/2942 --- diff --git a/tests/test_cli/test_add_target.py b/tests/test_cli/test_add_target.py index 3952419..cc0ff17 100644 --- a/tests/test_cli/test_add_target.py +++ b/tests/test_cli/test_add_target.py @@ -83,3 +83,56 @@ class TestAddTarget(utils.CliTestCase): handle_add_target(self.options, self.session, [target, tag, dest_tag]) self.assertExitCode(ex, 1) self.assert_console_message(stderr, expected) + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_add_target_more_option(self, stderr): + args = ['test-target', 'tag', 'test-dest-tag', 'tag-2'] + expected = "Usage: %s add-target \n" \ + "(Specify the --help global option for a list of other help options)\n\n" \ + "%s: error: Incorrect number of arguments\n" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + handle_add_target(self.options, self.session, args) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + + def test_add_target_valid(self): + side_effect_result = [{'arches': 'x86_64', + 'extra': {}, + 'id': 1, + 'locked': False, + 'maven_include_all': False, + 'maven_support': False, + 'name': 'test-tag', + 'perm': None, + 'perm_id': None + }, + {'arches': 'x86_64', + 'extra': {}, + 'id': 2, + 'locked': False, + 'maven_include_all': False, + 'maven_support': False, + 'name': 'test-target', + 'perm': None, + 'perm_id': None + }, + ] + + target = 'test-target' + tag = 'test-tag' + self.session.getTag.side_effect = side_effect_result + self.session.createBuildTarget.return_value = None + rv = handle_add_target(self.options, self.session, [target, tag]) + self.assertEqual(rv, None) + self.session.createBuildTarget.assert_called_once_with(target, tag, target) + self.session.getTag.assert_called_with(target) + + def test_add_target_help(self): + self.assert_help( + handle_add_target, + """Usage: %s add-target +(Specify the --help global option for a list of other help options) + +Options: + -h, --help show this help message and exit +""" % self.progname) diff --git a/tests/test_cli/test_cancel.py b/tests/test_cli/test_cancel.py index 3e8c78e..f5aa7a2 100644 --- a/tests/test_cli/test_cancel.py +++ b/tests/test_cli/test_cancel.py @@ -1,11 +1,13 @@ from __future__ import absolute_import + import mock -import unittest +from six.moves import StringIO import koji from koji_cli.commands import handle_cancel from . import utils + class TestCancel(utils.CliTestCase): maxDiff = None @@ -21,7 +23,6 @@ class TestCancel(utils.CliTestCase): %s: error: {message} """ % (self.progname, self.progname) - @mock.patch('koji_cli.commands.activate_session') def test_anon_cancel(self, activate_session_mock): args = ['123'] @@ -116,3 +117,19 @@ class TestCancel(utils.CliTestCase): activate_session_mock.assert_called_once_with(self.session, self.options) self.session.cancelTaskFull.assert_called_once_with(123, strict=False) self.session.cancelBuild.assert_not_called() + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_cancel_without_arguments(self, stderr): + expected = """Usage: %s cancel [options] [ ...] +(Specify the --help global option for a list of other help options) + +%s: error: You must specify at least one task id or build +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + handle_cancel(self.options, self.session, []) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + + self.session.cancelTask.assert_not_called() + self.session.cancelTaskFull.assert_not_called() + self.session.cancelBuild.assert_not_called() diff --git a/tests/test_cli/test_edit_user.py b/tests/test_cli/test_edit_user.py index 56a776b..734334a 100644 --- a/tests/test_cli/test_edit_user.py +++ b/tests/test_cli/test_edit_user.py @@ -1,9 +1,11 @@ from __future__ import absolute_import -import mock + +import unittest import os -import six import sys -import unittest + +import six +import mock from koji_cli.commands import handle_edit_user @@ -116,6 +118,36 @@ Options: activate_session_mock.assert_not_called() session.editUser.assert_not_called() + @mock.patch('sys.stdout', new_callable=six.StringIO) + @mock.patch('sys.stderr', new_callable=six.StringIO) + @mock.patch('koji_cli.commands.activate_session') + def test_handle_edit_user_more_arg(self, activate_session_mock, stderr, stdout): + args = ['user', 'user2'] + options = mock.MagicMock() + + # Mock out the xmlrpc server + session = mock.MagicMock() + + # Run it and check immediate output + # args: --help + # expected: failed, help info shows + with self.assertRaises(SystemExit) as ex: + handle_edit_user(options, session, args) + self.assertExitCode(ex, 2) + actual_stdout = stdout.getvalue() + actual_stderr = stderr.getvalue() + expected_stdout = '' + expected_stderr = """Usage: %(progname)s edit-user [options] +(Specify the --help global option for a list of other help options) + +%(progname)s: error: This command only accepts one argument (username) +""" % {'progname': progname} + self.assertMultiLineEqual(actual_stdout, expected_stdout) + self.assertMultiLineEqual(actual_stderr, expected_stderr) + # Finally, assert that things were called as we expected. + activate_session_mock.assert_not_called() + session.editUser.assert_not_called() + if __name__ == '__main__': unittest.main() diff --git a/tests/test_cli/test_list_history.py b/tests/test_cli/test_list_history.py index 487f55f..15539be 100644 --- a/tests/test_cli/test_list_history.py +++ b/tests/test_cli/test_list_history.py @@ -1,11 +1,13 @@ from __future__ import absolute_import -import mock + import time -import unittest from datetime import datetime -import koji +import unittest + from six.moves import StringIO +import mock +import koji from koji_cli.commands import anon_handle_list_history from . import utils @@ -209,7 +211,7 @@ class TestListHistory(utils.CliTestCase): "(Specify the --help global option for a list of other " \ "help options)\n\n" \ "%s: error: Please specify an option to limit " \ - "the query\n" %(self.progname, self.progname) + "the query\n" % (self.progname, self.progname) self.session.getChannel.return_value = None with self.assertRaises(SystemExit) as ex: anon_handle_list_history(self.options, self.session, []) @@ -1086,6 +1088,19 @@ class TestListHistory(utils.CliTestCase): anon_handle_list_history(self.options, self.session, ['--xkey', xkey]) self.assert_console_message(stdout, expected) + @mock.patch('sys.stderr', new_callable=StringIO) + @mock.patch('koji_cli.commands.ensure_connection') + def test_list_history_without_arguments(self, ensure_connection_mock, stderr): + expected = """Usage: %s list-history [options] +(Specify the --help global option for a list of other help options) + +%s: error: Please specify an option to limit the query +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + anon_handle_list_history(self.options, self.session, []) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + def test_handle_list_history_help(self): self.assert_help( anon_handle_list_history, diff --git a/tests/test_cli/test_list_notifications.py b/tests/test_cli/test_list_notifications.py index 2848ad0..59d53c3 100644 --- a/tests/test_cli/test_list_notifications.py +++ b/tests/test_cli/test_list_notifications.py @@ -1,15 +1,14 @@ from __future__ import absolute_import -import unittest - import mock from six.moves import StringIO import koji from koji_cli.commands import anon_handle_list_notifications +from . import utils -class TestListNotifications(unittest.TestCase): +class TestListNotifications(utils.CliTestCase): def setUp(self): self.options = mock.MagicMock() self.options.debug = False @@ -20,9 +19,12 @@ class TestListNotifications(unittest.TestCase): @mock.patch('koji_cli.commands.activate_session') def test_list_notifications(self, activate_session_mock, stdout): self.session.getBuildNotifications.return_value = [ - {'id': 1, 'tag_id': 1, 'package_id': 11, 'email': 'email@test.com', 'success_only': True}, - {'id': 2, 'tag_id': None, 'package_id': 11, 'email': 'email@test.com', 'success_only': False}, - {'id': 3, 'tag_id': 1, 'package_id': None, 'email': 'email@test.com', 'success_only': True}, + {'id': 1, 'tag_id': 1, 'package_id': 11, 'email': 'email@test.com', + 'success_only': True}, + {'id': 2, 'tag_id': None, 'package_id': 11, 'email': 'email@test.com', + 'success_only': False}, + {'id': 3, 'tag_id': 1, 'package_id': None, 'email': 'email@test.com', + 'success_only': True}, ] self.session.getBuildNotificationBlocks.return_value = [] self.session.getTag.return_value = {'id': 1, 'name': 'tag'} @@ -54,9 +56,12 @@ No notification blocks @mock.patch('koji_cli.commands.ensure_connection') def test_list_notifications_user(self, ensure_connection_mock, stdout): self.session.getBuildNotifications.return_value = [ - {'id': 1, 'tag_id': 1, 'package_id': 11, 'email': 'email@test.com', 'success_only': True}, - {'id': 2, 'tag_id': None, 'package_id': 11, 'email': 'email@test.com', 'success_only': False}, - {'id': 3, 'tag_id': 1, 'package_id': None, 'email': 'email@test.com', 'success_only': True}, + {'id': 1, 'tag_id': 1, 'package_id': 11, 'email': 'email@test.com', + 'success_only': True}, + {'id': 2, 'tag_id': None, 'package_id': 11, 'email': 'email@test.com', + 'success_only': False}, + {'id': 3, 'tag_id': 1, 'package_id': None, 'email': 'email@test.com', + 'success_only': True}, ] self.session.getBuildNotificationBlocks.return_value = [ {'id': 11, 'tag_id': None, 'package_id': 22}, @@ -99,28 +104,37 @@ Notification blocks self.session.getUser.assert_called_once_with('random_name') self.session.getBuildNotifications.assert_called_once_with(321) - @mock.patch('sys.exit') @mock.patch('sys.stderr', new_callable=StringIO) - def test_list_notifications_missing_params(self, sys_stderr, sys_exit): - sys_exit.side_effect = SystemExit() + def test_handle_list_notifications_without_option(self, stderr): + expected = """Usage: %s list-notifications [options] +(Specify the --help global option for a list of other help options) - with self.assertRaises(SystemExit): +%s: error: Use --user or --mine. +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: anon_handle_list_notifications(self.options, self.session, []) - - self.session.getUser.assert_not_called() + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) self.session.getBuildNotifications.assert_not_called() self.session.getTag.assert_not_called() self.session.getPackage.assert_not_called() + self.session.getUser.assert_not_called() - @mock.patch('sys.exit') @mock.patch('sys.stderr', new_callable=StringIO) - def test_handle_list_notifications_no_args(self, sys_stderr, sys_exit): - sys_exit.side_effect = SystemExit() - - with self.assertRaises(SystemExit): - anon_handle_list_notifications(self.options, self.session, []) - + def test_handle_list_notifications_with_args(self, stderr): + expected = """Usage: %s list-notifications [options] +(Specify the --help global option for a list of other help options) + +%s: error: This command takes no arguments +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + anon_handle_list_notifications(self.options, self.session, ['test-argument']) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) self.session.getBuildNotifications.assert_not_called() + self.session.getTag.assert_not_called() + self.session.getPackage.assert_not_called() + self.session.getUser.assert_not_called() @mock.patch('sys.stderr', new_callable=StringIO) def test_list_notifications_user_non_exist_user(self, stderr): @@ -136,3 +150,29 @@ Notification blocks self.session.getBuildNotifications.assert_not_called() self.session.getTag.assert_not_called() self.session.getPackage.assert_not_called() + + @mock.patch('sys.stdout', new_callable=StringIO) + @mock.patch('koji_cli.commands.ensure_connection') + def test_list_notifications_without_notification(self, ensure_connection_mock, stdout): + username = 'random_name' + self.session.getUser.return_value = {'id': 321} + self.session.getBuildNotifications.return_value = [] + self.session.getBuildNotificationBlocks.return_value = [ + {'id': 11, 'tag_id': 22, 'package_id': None} + ] + self.session.getTag.return_value = {'id': 22, 'name': 'tag'} + anon_handle_list_notifications(self.options, self.session, ['--user', username]) + expected = """No notifications + +Notification blocks + ID Tag Package +---------------------------------------------------------- + 11 tag * +""" + actual = stdout.getvalue() + self.assertMultiLineEqual(actual, expected) + ensure_connection_mock.assert_called_once_with(self.session, self.options) + self.session.getTag.assert_called_once_with(22) + self.session.getPackage.assert_not_called() + self.session.getUser.assert_called_once_with('random_name') + self.session.getBuildNotifications.assert_called_once_with(321) diff --git a/tests/test_cli/test_list_tasks.py b/tests/test_cli/test_list_tasks.py index 8e8b343..ddf67dd 100644 --- a/tests/test_cli/test_list_tasks.py +++ b/tests/test_cli/test_list_tasks.py @@ -1,7 +1,9 @@ from __future__ import absolute_import + +import unittest + import mock import six -import unittest import koji from koji_cli.lib import _list_tasks @@ -154,7 +156,7 @@ class TestListTasks(unittest.TestCase): 'id': 3, 'parent': 2, 'sub': True} - ]) + ]) class TestCliListTasks(utils.CliTestCase): @@ -250,6 +252,17 @@ class TestCliListTasks(utils.CliTestCase): handle_list_tasks(options, session, ['--quiet']) self.assert_console_message(stdout, task_output) + # Case 5, argument error test. + expected = self.format_error_message( + "--all must be used with --after") + self.assert_system_exit( + handle_list_tasks, + options, + session, + ['--all'], + stderr=expected, + activate_session=None) + def test_handle_list_tasks_help(self): self.assert_help( handle_list_tasks, diff --git a/tests/test_cli/test_remove_notification.py b/tests/test_cli/test_remove_notification.py index 8354e1e..76403d4 100644 --- a/tests/test_cli/test_remove_notification.py +++ b/tests/test_cli/test_remove_notification.py @@ -1,42 +1,52 @@ from __future__ import absolute_import -import koji -import mock -import unittest +import mock from six.moves import StringIO +import koji from koji_cli.commands import handle_remove_notification +from . import utils -class TestAddHost(unittest.TestCase): + +class TestAddHost(utils.CliTestCase): def setUp(self): self.options = mock.MagicMock() self.options.debug = False self.session = mock.MagicMock() self.session.getAPIVersion.return_value = koji.API_VERSION - @mock.patch('koji_cli.commands.activate_session') def test_handle_remove_notification(self, activate_session_mock): handle_remove_notification(self.options, self.session, ['1', '3', '5']) - self.session.deleteNotification.assert_has_calls([mock.call(1), mock.call(3), mock.call(5)]) - + self.session.deleteNotification.assert_has_calls([mock.call(1), mock.call(3), + mock.call(5)]) - @mock.patch('sys.exit') @mock.patch('sys.stderr', new_callable=StringIO) - def test_handle_remove_notification_bogus(self, sys_stderr, sys_exit): - sys_exit.side_effect = SystemExit() + def test_handle_remove_notification_bogus(self, stderr): + expected = """Usage: %s remove-notification [options] [ ...] +(Specify the --help global option for a list of other help options) - with self.assertRaises(SystemExit): +%s: error: All notification ids has to be integers +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: handle_remove_notification(self.options, self.session, ['bogus']) - + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) self.session.deleteNotification.assert_not_called() - - @mock.patch('sys.exit') @mock.patch('sys.stderr', new_callable=StringIO) - def test_handle_remove_notifications_no_args(self, sys_stderr, sys_exit): - sys_exit.side_effect = SystemExit() + def test_handle_remove_notifications_no_args(self, stderr): + expected = """Usage: %s remove-notification [options] [ ...] +(Specify the --help global option for a list of other help options) + +%s: error: At least one notification id has to be specified +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + handle_remove_notification(self.options, self.session, []) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + self.session.deleteNotification.assert_not_called() with self.assertRaises(SystemExit): handle_remove_notification(self.options, self.session, []) diff --git a/tests/test_cli/test_remove_tag.py b/tests/test_cli/test_remove_tag.py index 769f624..0f045d4 100644 --- a/tests/test_cli/test_remove_tag.py +++ b/tests/test_cli/test_remove_tag.py @@ -34,3 +34,30 @@ class TestRemoveTag(utils.CliTestCase): handle_remove_tag(self.options, self.session, [tag]) self.assertExitCode(ex, 1) self.assert_console_message(stderr, expected) + + def test_remove_tag_valid(self): + tag_info = {'arches': 'x86_64', + 'extra': {}, + 'id': 1, + 'locked': False, + 'maven_include_all': False, + 'maven_support': False, + 'name': 'test-tag', + 'perm': None, + 'perm_id': None} + + self.session.getTag.return_value = tag_info + rv = handle_remove_tag(self.options, self.session, [tag_info['name']]) + self.assertEqual(rv, None) + self.session.deleteTag.assert_called_once_with(tag_info['id']) + self.session.getTag.assert_called_with(tag_info['name']) + + def test_remove_tag_help(self): + self.assert_help( + handle_remove_tag, + """Usage: %s remove-tag [options] +(Specify the --help global option for a list of other help options) + +Options: + -h, --help show this help message and exit +""" % self.progname) diff --git a/tests/test_cli/test_remove_target.py b/tests/test_cli/test_remove_target.py index 6d98218..8bb6c94 100644 --- a/tests/test_cli/test_remove_target.py +++ b/tests/test_cli/test_remove_target.py @@ -35,3 +35,28 @@ class TestRemoveTarget(utils.CliTestCase): handle_remove_target(self.options, self.session, [target]) self.assertExitCode(ex, 1) self.assert_console_message(stderr, expected) + + def test_remove_target_valid(self): + build_target = {'build_tag': 2, + 'build_tag_name': 'test-tag', + 'dest_tag': 1, + 'dest_tag_name': 'test-dest-tag', + 'id': 1, + 'name': 'test-target'} + + self.session.getBuildTarget.return_value = build_target + self.session.deleteBuildTarget.return_value = None + rv = handle_remove_target(self.options, self.session, [build_target['name']]) + self.assertEqual(rv, None) + self.session.deleteBuildTarget.assert_called_once_with(build_target['id']) + self.session.getBuildTarget.assert_called_with(build_target['name']) + + def test_remove_target_help(self): + self.assert_help( + handle_remove_target, + """Usage: %s remove-target [options] +(Specify the --help global option for a list of other help options) + +Options: + -h, --help show this help message and exit +""" % self.progname) diff --git a/tests/test_cli/test_set_pkg_owner_global.py b/tests/test_cli/test_set_pkg_owner_global.py new file mode 100644 index 0000000..2933388 --- /dev/null +++ b/tests/test_cli/test_set_pkg_owner_global.py @@ -0,0 +1,196 @@ +from __future__ import absolute_import + +import mock +from six.moves import StringIO + +import koji +from koji_cli.commands import handle_set_pkg_owner_global +from . import utils + + +class TestSetPkgOwnerGlobal(utils.CliTestCase): + + # Show long diffs in error output... + maxDiff = None + + def setUp(self): + self.options = mock.MagicMock() + self.options.debug = False + self.session = mock.MagicMock() + self.session.getAPIVersion.return_value = koji.API_VERSION + + def test_set_pkg_owner_global_help(self): + self.assert_help( + handle_set_pkg_owner_global, + """Usage: %s set-pkg-owner-global [options] [ ...] +(Specify the --help global option for a list of other help options) + +Options: + -h, --help show this help message and exit + --verbose List changes + --test Test mode + --old-user=OLD_USER, --from=OLD_USER + Only change ownership for packages belonging to this + user +""" % self.progname) + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_set_pkg_owner_global_without_arguments(self, stderr): + expected = """Usage: %s set-pkg-owner-global [options] [ ...] +(Specify the --help global option for a list of other help options) + +%s: error: Please specify an owner and at least one package +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + handle_set_pkg_owner_global(self.options, self.session, []) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + self.session.listPackages.assert_not_called() + self.session.getUser.assert_not_called() + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_set_pkg_owner_global_old_user_spefify_owner(self, stderr): + expected = """Usage: %s set-pkg-owner-global [options] [ ...] +(Specify the --help global option for a list of other help options) + +%s: error: Please specify an owner +""" % (self.progname, self.progname) + with self.assertRaises(SystemExit) as ex: + handle_set_pkg_owner_global(self.options, self.session, ['--old-user', 'test-user']) + self.assertExitCode(ex, 2) + self.assert_console_message(stderr, expected) + self.session.listPackages.assert_not_called() + self.session.getUser.assert_not_called() + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_set_pkg_owner_global_non_exist_owner(self, stderr): + expected = "No such user: user\n" + self.session.getUser.return_value = None + with self.assertRaises(SystemExit) as ex: + handle_set_pkg_owner_global(self.options, self.session, ['user', 'test-package']) + self.assertExitCode(ex, 1) + self.assert_console_message(stderr, expected) + self.session.listPackages.assert_not_called() + self.session.getUser.assert_called_once_with('user') + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_set_pkg_owner_global_old_user_non_exist_user(self, stderr): + expected = "No such user: test-user\n" + user_info = [{'id': 1, 'krb_principals': [], 'name': 'user', 'status': 0, + 'usertype': 0}, + None] + self.session.getUser.side_effect = user_info + with self.assertRaises(SystemExit) as ex: + handle_set_pkg_owner_global(self.options, self.session, ['--old-user', 'test-user', + 'user', 'test-package']) + self.assertExitCode(ex, 1) + self.assert_console_message(stderr, expected) + self.session.listPackages.assert_not_called() + expected_calls = [mock.call('user'), mock.call('test-user')] + self.session.getUser.assert_has_calls(expected_calls) + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stdout', new_callable=StringIO) + def test_set_pkg_owner_global_without_pkgs(self, stdout): + expected = "No data for package test-package\n" + user_info = [{'id': 1, 'krb_principals': [], 'name': 'user', 'status': 0, + 'usertype': 0}] + self.session.getUser.return_value = user_info + self.session.listPackages.return_value = [] + handle_set_pkg_owner_global(self.options, self.session, ['user', 'test-package']) + self.assert_console_message(stdout, expected) + self.session.listPackages.assert_called_once_with(pkgID='test-package', with_dups=True) + self.session.getUser.assert_called_once_with('user') + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stderr', new_callable=StringIO) + def test_set_pkg_owner_global_user_without_pkgs(self, stderr): + expected = "No data for user test-user\n" + user_info = [{'id': 1, 'krb_principals': [], 'name': 'user', 'status': 0, + 'usertype': 0}, + {'id': 2, 'krb_principals': [], 'name': 'test-user', + 'status': 0, 'usertype': 0}] + self.session.getUser.side_effect = user_info + self.session.listPackages.return_value = [] + with self.assertRaises(SystemExit) as ex: + handle_set_pkg_owner_global(self.options, self.session, ['--old-user', 'test-user', + 'user']) + self.assertExitCode(ex, 1) + self.assert_console_message(stderr, expected) + self.session.listPackages.assert_called_once_with(userID=2, with_dups=True) + expected_calls = [mock.call('user'), mock.call('test-user')] + self.session.getUser.assert_has_calls(expected_calls) + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stdout', new_callable=StringIO) + def test_set_pkg_owner_global_test(self, stdout): + expected = "Would have changed owner for test-package-123 in tag test-tag: kojiadmin" \ + " -> user\n" + user_info = [{'id': 2, 'krb_principals': [], 'name': 'user', 'status': 0, + 'usertype': 0}, + {'id': 1, 'krb_principals': [], 'name': 'kojiadmin', 'status': 0, + 'usertype': 0}, + ] + self.session.getUser.side_effect = user_info + self.session.listPackages.return_value = [ + {'blocked': False, + 'extra_arches': '', + 'owner_id': 1, + 'owner_name': 'kojiadmin', + 'package_id': 1, + 'package_name': 'test-package-123', + 'tag_id': 18, + 'tag_name': 'test-tag'}] + + handle_set_pkg_owner_global(self.options, self.session, ['user', '--test', + '--old-user', 'kojiadmin']) + self.assert_console_message(stdout, expected) + self.session.listPackages.assert_called_once_with(userID=1, with_dups=True) + expected_calls = [mock.call('user'), mock.call('kojiadmin')] + self.session.getUser.assert_has_calls(expected_calls) + self.session.packageListSetOwner.assert_not_called() + + @mock.patch('sys.stdout', new_callable=StringIO) + def test_set_pkg_owner_global_verbose_preserving_owner(self, stdout): + expected = "Preserving owner=user for package test-package in tag test-tag\n" + user_info = {'id': 1, 'krb_principals': [], 'name': 'user', 'status': 0, 'usertype': 0} + self.session.getUser.return_value = user_info + self.session.listPackages.return_value = [ + {'blocked': False, + 'extra_arches': '', + 'owner_id': 1, + 'owner_name': 'user', + 'package_id': 1, + 'package_name': 'test-package-123', + 'tag_id': 18, + 'tag_name': 'test-tag'}] + + handle_set_pkg_owner_global(self.options, self.session, ['user', 'test-package', + '--verbose']) + self.assert_console_message(stdout, expected) + self.session.listPackages.assert_called_once_with(pkgID='test-package', with_dups=True) + self.session.getUser.assert_called_once_with('user') + self.session.packageListSetOwner.assert_not_called() + + def test_set_pkg_owner_global_verbose_valid(self, ): + user_info = {'id': 1, 'krb_principals': [], 'name': 'user', 'status': 0, + 'usertype': 0} + self.session.getUser.return_value = user_info + self.session.listPackages.return_value = [ + {'blocked': False, + 'extra_arches': '', + 'owner_id': 2, + 'owner_name': 'kojiadmin', + 'package_id': 1, + 'package_name': 'test-package-123', + 'tag_id': 18, + 'tag_name': 'test-tag'}] + self.session.packageListSetOwner.return_value = None + handle_set_pkg_owner_global(self.options, self.session, ['user', 'test-package', + '--verbose']) + self.session.packageListSetOwner.assert_called_once_with(18, 'test-package-123', 1) + self.session.listPackages.assert_called_once_with(pkgID='test-package', with_dups=True) + self.session.getUser.assert_called_once_with('user') diff --git a/tests/test_cli/test_spin_commands.py b/tests/test_cli/test_spin_commands.py index 7c13a16..5fb86b1 100644 --- a/tests/test_cli/test_spin_commands.py +++ b/tests/test_cli/test_spin_commands.py @@ -1,9 +1,10 @@ from __future__ import absolute_import -import mock -import six import unittest +import six +import mock + import koji from koji_cli.commands import handle_spin_livecd, handle_spin_livemedia, handle_spin_appliance, \ _build_image @@ -359,6 +360,20 @@ class TestSpinLiveMedia(utils.CliTestCase): self.assertDictEqual(empty_opts, args[1].__dict__) self.assertEqual(args[-1], 'livemedia') + def test_handle_spin_livemedia_longer_volid(self): + """Test handle_spin_livemedia function""" + volid = 'extra-long-volid-in-spin-livemedia-cli-command' + expected = self.format_error_message( + 'Volume ID has a maximum length of 32 characters') + args = ['name', 'version', 'target', 'arch', 'file.ks', '--volid', volid] + self.assert_system_exit( + handle_spin_livemedia, + self.options, + self.session, + args, + stderr=expected, + activate_session=None) + @mock.patch('koji_cli.commands._build_image') def test_handle_spin_livemedia_argument_error(self, build_image_mock): """Test handle_spin_livemedia function argument error"""