From 8299bc78b5ee6b584ee46b37cc632864b98d19bd Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Dec 21 2021 13:46:15 +0000 Subject: unit tests for lookup_name --- diff --git a/tests/test_hub/test_lookup_name.py b/tests/test_hub/test_lookup_name.py new file mode 100644 index 0000000..89b3753 --- /dev/null +++ b/tests/test_hub/test_lookup_name.py @@ -0,0 +1,131 @@ +import unittest + +import mock + +import koji +import kojihub + + +QP = kojihub.QueryProcessor +IP = kojihub.InsertProcessor + + +class TestLookupName(unittest.TestCase): + + def setUp(self): + self.QueryProcessor = mock.patch('kojihub.QueryProcessor', + side_effect=self.getQuery).start() + self.queries = [] + self.query_executeOne = mock.MagicMock() + self.InsertProcessor = mock.patch('kojihub.InsertProcessor', + side_effect=self.getInsert).start() + self.inserts = [] + self.insert_execute = mock.MagicMock() + self.nextval = mock.patch('kojihub.nextval').start() + self.context = mock.patch('kojihub.context').start() + + def getQuery(self, *args, **kwargs): + query = QP(*args, **kwargs) + query.executeOne = self.query_executeOne + self.queries.append(query) + return query + + def getInsert(self, *args, **kwargs): + insert = IP(*args, **kwargs) + insert.execute = self.insert_execute + self.inserts.append(insert) + return insert + + def tearDown(self): + mock.patch.stopall() + + def test_wrong_lookup_type(self): + bad_values = [ + {'foo': 'missing id and name fields'}, + ['something'], + set(), + ] + for value in bad_values: + with self.assertRaises(koji.GenericError) as cm: + kojihub.lookup_name('mytable', value) + self.assertEqual('Invalid name or id value: %s' % value, + str(cm.exception)) + self.assertEqual(len(self.queries), 0) + self.assertEqual(len(self.inserts), 0) + + def test_query_by_name(self): + kojihub.lookup_name('some_table', 'herbert') + self.assertEqual(len(self.queries), 1) + query = self.queries[0] + clauses = ['(some_table.name = %(some_table_name)s)'] + values = {'some_table_name': 'herbert'} + self.assertEqual(query.tables, ['some_table']) + self.assertEqual(query.joins, None) + self.assertEqual(set(query.clauses), set(clauses)) + self.assertEqual(query.values, values) + self.assertEqual(len(self.inserts), 0) + + + def test_query_by_id(self): + kojihub.lookup_name('some_table', 12345) + self.assertEqual(len(self.queries), 1) + query = self.queries[0] + clauses = ['(some_table.id = %(some_table_id)s)'] + values = {'some_table_id': 12345} + self.assertEqual(query.tables, ['some_table']) + self.assertEqual(query.joins, None) + self.assertEqual(set(query.clauses), set(clauses)) + self.assertEqual(query.values, values) + self.assertEqual(len(self.inserts), 0) + + def test_query_by_dict(self): + kojihub.lookup_name('some_table', {'id':12345, 'name': 'whatever'}) + self.assertEqual(len(self.queries), 1) + query = self.queries[0] + clauses = ['(some_table.id = %(some_table_id)s)'] + values = {'some_table_id': 12345} + self.assertEqual(query.tables, ['some_table']) + self.assertEqual(query.joins, None) + self.assertEqual(set(query.clauses), set(clauses)) + self.assertEqual(query.values, values) + self.assertEqual(len(self.inserts), 0) + + def test_lookup_name_no_match(self): + self.query_executeOne.return_value = None + result = kojihub.lookup_name('package', 'python') + self.assertEqual(len(self.queries), 1) + self.assertEqual(len(self.inserts), 0) + self.assertEqual(result, None) + + def test_lookup_name_strict(self): + self.query_executeOne.return_value = None + with self.assertRaises(koji.GenericError) as cm: + kojihub.lookup_name('package', 'python', strict=True) + self.assertEqual(len(self.queries), 1) + self.assertEqual(len(self.inserts), 0) + + def test_lookup_name_create(self): + self.query_executeOne.return_value = None + self.nextval.return_value = 999 + result = kojihub.lookup_name('package', 'python', create=True) + self.assertEqual(len(self.queries), 1) + self.assertEqual(len(self.inserts), 1) + expected = {'id': 999, 'name': 'python'} + self.assertEqual(result, expected) + insert = self.inserts[0] + self.assertEqual(insert.table, 'package') + self.assertEqual(insert.data, expected) + self.assertEqual(insert.rawdata, {}) + + def test_lookup_name_create_wrong_type(self): + self.query_executeOne.return_value = None + bad_values = [ + {'id': 100}, + 100 + ] + for value in bad_values: + with self.assertRaises(koji.GenericError) as cm: + kojihub.lookup_name('package', value, create=True) + self.assertEqual('Name must be a string', str(cm.exception)) + self.assertEqual(len(self.inserts), 0) + self.nextval.assert_not_called()