PR#465 Don't allow not-null empty arch/userID in listHosts
Merges #465 https://pagure.io/koji/pull-request/465 Fixes #463 https://pagure.io/koji/issue/463
This commit is contained in:
commit
e7dd4b36f9
2 changed files with 123 additions and 5 deletions
|
|
@ -10532,27 +10532,31 @@ class RootExports(object):
|
|||
|
||||
clauses = []
|
||||
joins = []
|
||||
if arches != None:
|
||||
if arches is not None:
|
||||
if not arches:
|
||||
raise koji.GenericError('arches option cannot be empty')
|
||||
# include the regex constraints below so we can match 'ppc' without
|
||||
# matching 'ppc64'
|
||||
if not (isinstance(arches, list) or isinstance(arches, tuple)):
|
||||
arches = [arches]
|
||||
archClause = [r"""arches ~ E'\\m%s\\M'""" % arch for arch in arches]
|
||||
clauses.append('(' + ' OR '.join(archClause) + ')')
|
||||
if channelID != None:
|
||||
if channelID is not None:
|
||||
channelID = get_channel_id(channelID, strict=True)
|
||||
joins.append('host_channels on host.id = host_channels.host_id')
|
||||
clauses.append('host_channels.channel_id = %(channelID)i')
|
||||
if ready != None:
|
||||
if ready is not None:
|
||||
if ready:
|
||||
clauses.append('ready is true')
|
||||
else:
|
||||
clauses.append('ready is false')
|
||||
if enabled != None:
|
||||
if enabled is not None:
|
||||
if enabled:
|
||||
clauses.append('enabled is true')
|
||||
else:
|
||||
clauses.append('enabled is false')
|
||||
if userID != None:
|
||||
if userID is not None:
|
||||
userID = get_user(userID, strict=True)['id']
|
||||
clauses.append('user_id = %(userID)i')
|
||||
|
||||
query = QueryProcessor(columns=fields, tables=['host'],
|
||||
|
|
|
|||
114
tests/test_hub/test_list_hosts.py
Normal file
114
tests/test_hub/test_list_hosts.py
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
import unittest
|
||||
import mock
|
||||
|
||||
import koji
|
||||
import kojihub
|
||||
|
||||
QP = kojihub.QueryProcessor
|
||||
|
||||
|
||||
class TestListHosts(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.QueryProcessor = mock.patch('kojihub.QueryProcessor',
|
||||
side_effect=self.get_query).start()
|
||||
self.queries = []
|
||||
self.exports = kojihub.RootExports()
|
||||
|
||||
def tearDown(self):
|
||||
mock.patch.stopall()
|
||||
|
||||
def get_query(self, *args, **kwargs):
|
||||
query = QP(*args, **kwargs)
|
||||
query.execute = mock.MagicMock()
|
||||
self.queries.append(query)
|
||||
return query
|
||||
|
||||
def test_list_hosts_simple(self):
|
||||
self.exports.listHosts()
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, [])
|
||||
|
||||
@mock.patch('kojihub.get_user')
|
||||
def test_list_hosts_user_id(self, get_user):
|
||||
get_user.return_value = {'id': 99}
|
||||
self.exports.listHosts(userID=99)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, ['user_id = %(userID)i'])
|
||||
|
||||
@mock.patch('kojihub.get_channel_id')
|
||||
def test_list_hosts_channel_id(self, get_channel_id):
|
||||
get_channel_id.return_value = 2
|
||||
self.exports.listHosts(channelID=2)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, ['host_channels on host.id = host_channels.host_id'])
|
||||
self.assertEqual(query.clauses, ['host_channels.channel_id = %(channelID)i'])
|
||||
|
||||
def test_list_hosts_single_arch(self):
|
||||
self.exports.listHosts(arches='x86_64')
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, [r"""(arches ~ E'\\mx86_64\\M')"""])
|
||||
|
||||
def test_list_hosts_multi_arch(self):
|
||||
self.exports.listHosts(arches=['x86_64', 's390'])
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, [r"""(arches ~ E'\\mx86_64\\M' OR arches ~ E'\\ms390\\M')"""])
|
||||
|
||||
def test_list_hosts_bad_arch(self):
|
||||
with self.assertRaises(koji.GenericError):
|
||||
self.exports.listHosts(arches='')
|
||||
|
||||
def test_list_hosts_ready(self):
|
||||
self.exports.listHosts(ready=1)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, ['ready is true'])
|
||||
|
||||
def test_list_hosts_nonready(self):
|
||||
self.exports.listHosts(ready=0)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, ['ready is false'])
|
||||
|
||||
def test_list_hosts_enabled(self):
|
||||
self.exports.listHosts(enabled=1)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, ['enabled is true'])
|
||||
|
||||
def test_list_hosts_disabled(self):
|
||||
self.exports.listHosts(enabled=0)
|
||||
|
||||
self.assertEqual(len(self.queries), 1)
|
||||
query = self.queries[0]
|
||||
self.assertEqual(query.tables, ['host'])
|
||||
self.assertEqual(query.joins, [])
|
||||
self.assertEqual(query.clauses, ['enabled is false'])
|
||||
Loading…
Add table
Add a link
Reference in a new issue