debian-koji/tests/test_cli/test_repoinfo.py
Jana Cupova de192e10f1 Add repoID in listBuildroots and create repoinfo command
Add repoID param in listBuildroots and show result in repoInfo
Create new command repoinfo which provides equivalent info as repoInfo
Add number of buildroots related to repo in repoinfo page

Fixes: https://pagure.io/koji/issue/2549
2023-04-03 15:20:18 +02:00

264 lines
11 KiB
Python

from __future__ import absolute_import
import unittest
import mock
import six
import tempfile
from koji_cli.commands import anon_handle_repoinfo
import koji
from . import utils
class TestRepoinfo(utils.CliTestCase):
def __vm(self, result):
m = koji.VirtualCall('mcall_method', [], {})
if isinstance(result, dict) and result.get('faultCode'):
m._result = result
else:
m._result = (result,)
return m
def setUp(self):
# Show long diffs in error output...
self.maxDiff = None
self.options = mock.MagicMock()
self.options.debug = False
self.session = mock.MagicMock()
self.session.getAPIVersion.return_value = koji.API_VERSION
self.ensure_connection = mock.patch('koji_cli.commands.ensure_connection').start()
self.tempdir = tempfile.mkdtemp()
self.error_format = """Usage: %s repoinfo [options] <repo-id> [<repo-id> ...]
(Specify the --help global option for a list of other help options)
%s: error: {message}
""" % (self.progname, self.progname)
self.repo_id = '123'
self.multi_broots = [
{'id': 1101, 'repo_id': 101, 'tag_name': 'tag_101', 'arch': 'x86_64'},
{'id': 1111, 'repo_id': 111, 'tag_name': 'tag_111', 'arch': 'x86_64'},
{'id': 1121, 'repo_id': 121, 'tag_name': 'tag_121', 'arch': 'x86_64'}
]
def tearDown(self):
mock.patch.stopall()
@mock.patch('koji.formatTimeLong', return_value='Thu, 01 Jan 2000')
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
def test_repoinfo_valid_not_dist_repo_with_buildroot_opt(self, stdout, stderr, formattimelong):
repoinfo = {'external_repo_id': 1, 'id': self.repo_id, 'tag_id': 11,
'tag_name': 'test-tag', 'state': 1, 'create_ts': 1632914520.353734,
'create_event': 999, 'dist': False, 'task_id': 555}
self.options.topurl = 'https://www.domain.local'
mcall = self.session.multicall.return_value.__enter__.return_value
mcall.repoInfo.return_value = self.__vm(repoinfo)
self.session.listBuildroots.return_value = self.multi_broots
arguments = [self.repo_id, '--buildroots']
rv = anon_handle_repoinfo(self.options, self.session, arguments)
url = '{}/repos/test-tag/123'.format(self.options.topurl)
repo_json = '{}/repos/test-tag/123/repo.json'.format(self.options.topurl)
expected = """ID: %s
Tag ID: %d
Tag name: %s
State: %s
Created: Thu, 01 Jan 2000
Created event: %d
URL: %s
Repo json: %s
Dist repo?: no
Task ID: %d
Number of buildroots: 3
Buildroots ID:
1101
1111
1121
""" % (self.repo_id, repoinfo['tag_id'], repoinfo['tag_name'],
koji.REPO_STATES[repoinfo['state']], repoinfo['create_event'], url, repo_json,
repoinfo['task_id'])
actual = stdout.getvalue()
self.assertMultiLineEqual(actual, expected)
actual = stderr.getvalue()
expected = ''
self.assertMultiLineEqual(actual, expected)
self.assertEqual(rv, None)
self.ensure_connection.assert_called_once_with(self.session, self.options)
self.session.multicall.assert_called_once()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_called_once_with(repoID=self.repo_id)
@mock.patch('koji.formatTimeLong', return_value='Thu, 01 Jan 2000')
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
def test_repoinfo_valid_dist_repo(self, stdout, stderr, formattimelong):
repoinfo = {'external_repo_id': 1, 'id': self.repo_id, 'tag_id': 11,
'tag_name': 'test-tag', 'state': 1, 'create_ts': 1632914520.353734,
'create_event': 999, 'dist': True, 'task_id': 555}
mcall = self.session.multicall.return_value.__enter__.return_value
mcall.repoInfo.return_value = self.__vm(repoinfo)
self.session.listBuildroots.return_value = self.multi_broots
self.options.topurl = 'https://www.domain.local'
arguments = [self.repo_id]
rv = anon_handle_repoinfo(self.options, self.session, arguments)
url = '{}/repos/test-tag/123'.format(self.options.topurl)
repo_json = '{}/repos-dist/test-tag/123/repo.json'.format(self.options.topurl)
expected = """ID: %s
Tag ID: %d
Tag name: %s
State: %s
Created: Thu, 01 Jan 2000
Created event: %d
URL: %s
Repo json: %s
Dist repo?: yes
Task ID: %d
Number of buildroots: 3
""" % (self.repo_id, repoinfo['tag_id'], repoinfo['tag_name'],
koji.REPO_STATES[repoinfo['state']], repoinfo['create_event'], url, repo_json,
repoinfo['task_id'])
actual = stdout.getvalue()
self.assertMultiLineEqual(actual, expected)
actual = stderr.getvalue()
expected = ''
self.assertMultiLineEqual(actual, expected)
self.assertEqual(rv, None)
self.ensure_connection.assert_called_once_with(self.session, self.options)
self.session.multicall.assert_called_once()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_called_once_with(repoID=self.repo_id)
@mock.patch('koji.formatTimeLong', return_value='Thu, 01 Jan 2000')
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
def test_repoinfo_valid_buildroot_not_available_on_hub(self, stdout, stderr, formattimelong):
repoinfo = {'external_repo_id': 1, 'id': self.repo_id, 'tag_id': 11,
'tag_name': 'test-tag', 'state': 1, 'create_ts': 1632914520.353734,
'create_event': 999, 'dist': False, 'task_id': 555}
self.options.topurl = 'https://www.domain.local'
mcall = self.session.multicall.return_value.__enter__.return_value
mcall.repoInfo.return_value = self.__vm(repoinfo)
self.session.listBuildroots.side_effect = koji.ParameterError
arguments = [self.repo_id, '--buildroots']
rv = anon_handle_repoinfo(self.options, self.session, arguments)
url = '{}/repos/test-tag/123'.format(self.options.topurl)
repo_json = '{}/repos/test-tag/123/repo.json'.format(self.options.topurl)
expected = """ID: %s
Tag ID: %d
Tag name: %s
State: %s
Created: Thu, 01 Jan 2000
Created event: %d
URL: %s
Repo json: %s
Dist repo?: no
Task ID: %d
""" % (self.repo_id, repoinfo['tag_id'], repoinfo['tag_name'],
koji.REPO_STATES[repoinfo['state']], repoinfo['create_event'], url, repo_json,
repoinfo['task_id'])
actual = stdout.getvalue()
self.assertMultiLineEqual(actual, expected)
actual = stderr.getvalue()
expecter_warn = "--buildroots option is available with hub 1.33 or newer\n"
self.assertMultiLineEqual(actual, expecter_warn)
self.assertEqual(rv, None)
self.ensure_connection.assert_called_once_with(self.session, self.options)
self.session.multicall.assert_called_once()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_called_once_with(repoID=self.repo_id)
@mock.patch('koji.formatTimeLong', return_value='Thu, 01 Jan 2000')
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
def test_repoinfo_valid_without_buildroot_not_available_on_hub(
self, stdout, stderr, formattimelong):
repoinfo = {'external_repo_id': 1, 'id': self.repo_id, 'tag_id': 11,
'tag_name': 'test-tag', 'state': 1, 'create_ts': 1632914520.353734,
'create_event': 999, 'dist': False, 'task_id': 555}
self.options.topurl = 'https://www.domain.local'
mcall = self.session.multicall.return_value.__enter__.return_value
mcall.repoInfo.return_value = self.__vm(repoinfo)
self.session.listBuildroots.side_effect = koji.ParameterError
arguments = [self.repo_id]
rv = anon_handle_repoinfo(self.options, self.session, arguments)
url = '{}/repos/test-tag/123'.format(self.options.topurl)
repo_json = '{}/repos/test-tag/123/repo.json'.format(self.options.topurl)
expected = """ID: %s
Tag ID: %d
Tag name: %s
State: %s
Created: Thu, 01 Jan 2000
Created event: %d
URL: %s
Repo json: %s
Dist repo?: no
Task ID: %d
""" % (self.repo_id, repoinfo['tag_id'], repoinfo['tag_name'],
koji.REPO_STATES[repoinfo['state']], repoinfo['create_event'], url, repo_json,
repoinfo['task_id'])
actual = stdout.getvalue()
self.assertMultiLineEqual(actual, expected)
actual = stderr.getvalue()
expecter_warn = ""
self.assertMultiLineEqual(actual, expecter_warn)
self.assertEqual(rv, None)
self.ensure_connection.assert_called_once_with(self.session, self.options)
self.session.multicall.assert_called_once()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_called_once_with(repoID=self.repo_id)
@mock.patch('sys.stdout', new_callable=six.StringIO)
@mock.patch('sys.stderr', new_callable=six.StringIO)
def test_repoinfo__not_exist_repo(self, stderr, stdout):
mcall = self.session.multicall.return_value.__enter__.return_value
mcall.repoInfo.return_value = self.__vm(None)
arguments = [self.repo_id]
rv = anon_handle_repoinfo(self.options, self.session, arguments)
actual = stderr.getvalue()
expected = "No such repo: %s\n\n" % self.repo_id
self.assertMultiLineEqual(actual, expected)
actual = stdout.getvalue()
expected = ''
self.assertMultiLineEqual(actual, expected)
self.assertEqual(rv, None)
self.ensure_connection.assert_called_once_with(self.session, self.options)
self.session.multicall.assert_called_once()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_not_called()
def test_repoinfo_without_args(self):
arguments = []
# Run it and check immediate output
self.assert_system_exit(
anon_handle_repoinfo,
self.options, self.session, arguments,
stderr=self.format_error_message('Please specify a repo ID'),
stdout='',
activate_session=None,
exit_code=2)
# Finally, assert that things were called as we expected.
self.ensure_connection.assert_not_called()
self.session.repoInfo.assert_not_called()
self.session.listBuildroots.assert_not_called()
def test_repoinfo_help(self):
self.assert_help(
anon_handle_repoinfo,
"""Usage: %s repoinfo [options] <repo-id> [<repo-id> ...]
(Specify the --help global option for a list of other help options)
Options:
-h, --help show this help message and exit
--buildroots Prints list of buildroot IDs
""" % self.progname)
if __name__ == '__main__':
unittest.main()