debian-koji/tests/test_hub/test_query_processor.py
2018-07-11 17:37:39 -04:00

111 lines
3.9 KiB
Python

from __future__ import absolute_import
import mock
try:
import unittest2 as unittest
except ImportError:
import unittest
import kojihub
class TestQueryProcessor(unittest.TestCase):
def setUp(self):
self.simple_arguments = dict(
columns=['something'],
tables=['awesome'],
)
self.complex_arguments = dict(
columns=['something'],
aliases=['other'],
tables=['awesome'],
joins=['morestuff'],
#values=...
#transform=...
opts={
#'countOnly': True,
'order': 'other',
'offset': 10,
'limit': 3,
#'rowlock': True,
},
)
self.original_chunksize = kojihub.QueryProcessor.iterchunksize
kojihub.QueryProcessor.iterchunksize = 2
def tearDown(self):
kojihub.QueryProcessor.iterchunksize = self.original_chunksize
def test_basic_instantiation(self):
kojihub.QueryProcessor() # No exception!
def test_instantiation_with_cols_and_aliases(self):
proc = kojihub.QueryProcessor(columns=['wat'], aliases=['zap'])
assert 'zap' in proc.colsByAlias
assert proc.colsByAlias['zap'] == 'wat'
assert len(proc.colsByAlias) == 1
def test_empty_as_string(self):
proc = kojihub.QueryProcessor()
actual = str(proc)
self.assertIn("SELECT", actual)
self.assertIn("FROM", actual)
def test_simple_as_string(self):
proc = kojihub.QueryProcessor(
columns=['something'],
tables=['awesome'],
)
actual = " ".join([token for token in str(proc).split() if token])
expected = "SELECT something FROM awesome"
self.assertEqual(actual, expected)
def test_complex_as_string(self):
proc = kojihub.QueryProcessor(**self.complex_arguments)
actual = " ".join([token for token in str(proc).split() if token])
expected = "SELECT something FROM awesome JOIN morestuff ORDER BY something OFFSET 10 LIMIT 3"
self.assertEqual(actual, expected)
@mock.patch('kojihub.context')
def test_simple_with_execution(self, context):
cursor = mock.MagicMock()
context.cnx.cursor.return_value = cursor
proc = kojihub.QueryProcessor(**self.simple_arguments)
proc.execute()
cursor.execute.assert_called_once_with('\nSELECT something\n FROM awesome\n\n\n \n\n \n', {})
@mock.patch('kojihub.context')
def test_simple_count_with_execution(self, context):
cursor = mock.MagicMock()
context.cnx.cursor.return_value = cursor
cursor.fetchall.return_value = [('some count',)]
args = self.simple_arguments.copy()
args['opts'] = {'countOnly': True}
proc = kojihub.QueryProcessor(**args)
results = proc.execute()
cursor.execute.assert_called_once_with('\nSELECT count(*)\n FROM awesome\n\n\n \n\n \n', {})
self.assertEqual(results, 'some count')
@mock.patch('kojihub.context')
def test_simple_execution_with_iterate(self, context):
cursor = mock.MagicMock()
context.cnx.cursor.return_value = cursor
cursor.fetchall.return_value = [
('value number 1',),
('value number 2',),
('value number 3',),
]
proc = kojihub.QueryProcessor(**self.simple_arguments)
generator = proc.iterate()
calls = cursor.execute.mock_calls
result = next(generator)
# two calls so far..
self.assertEqual(result, {'something': 'value number 1'})
self.assertEqual(len(calls), 2)
result = next(generator)
# still two.
self.assertEqual(result, {'something': 'value number 2'})
self.assertEqual(len(calls), 2)
# now three.
result = next(generator)
self.assertEqual(result, {'something': 'value number 3'})