def test_nested_queries(self): query1 = SqlStatement('SELECT 3 as x') query2 = SqlStatement('SELECT x FROM $query1') query3 = 'SELECT * FROM $query2 WHERE x == $count' self.assertEquals('SELECT 3 as x', query1.sql) with self.assertRaises(Exception) as e: _ = SqlStatement.format(query3)[0] self.assertEquals('Unsatisfied dependency $query2', e.exception.message) with self.assertRaises(Exception) as e: _ = SqlStatement.format(query3, {'query1': query1})[0] self.assertEquals('Unsatisfied dependency $query2', e.exception.message) with self.assertRaises(Exception) as e: _ = SqlStatement.format(query3, {'query2': query2})[0] self.assertEquals('Unsatisfied dependency $query1', e.exception.message) with self.assertRaises(Exception) as e: _ = SqlStatement.format(query3, { 'query1': query1, 'query2': query2 })[0] self.assertEquals('Unsatisfied dependency $count', e.exception.message) formatted_query =\ SqlStatement.format(query3, {'query1': query1, 'query2': query2, 'count': 5})[0] self.assertEqual( 'SELECT * FROM (SELECT x FROM (SELECT 3 as x)) WHERE x == 5', formatted_query)
def test_shared_nested_queries(self): query1 = SqlStatement('SELECT 3 as x') query2 = SqlStatement('SELECT x FROM $query1') query3 = 'SELECT x AS y FROM $query1, x FROM $query2' formatted_query = SqlStatement.format(query3, { 'query1': query1, 'query2': query2 })[0] self.assertEqual( 'SELECT x AS y FROM (SELECT 3 as x), x FROM (SELECT x FROM (SELECT 3 as x))', formatted_query)
def test_module_reference(self): m = imp.new_module('m') m.__dict__['q1'] = SqlStatement('SELECT 3 AS x') m.__dict__[SqlModule._SQL_MODULE_LAST] =\ m.__dict__[SqlModule._SQL_MODULE_LAST] = SqlStatement('SELECT * FROM $q1 LIMIT 10') with self.assertRaises(Exception) as e: _ = SqlStatement.format('SELECT * FROM $s', {'s': m}) self.assertEquals('Unsatisfied dependency $q1', e.exception.message) formatted_query = SqlStatement.format('SELECT * FROM $s', { 's': m, 'q1': m.q1 }) self.assertEqual( 'SELECT * FROM (SELECT * FROM (SELECT 3 AS x) LIMIT 10)', formatted_query) formatted_query = SqlStatement.format('SELECT * FROM $s', {'s': m.q1}) self.assertEqual('SELECT * FROM (SELECT 3 AS x)', formatted_query)
def test_circular_references(self): query1 = SqlStatement('SELECT * FROM $query3') query2 = SqlStatement('SELECT x FROM $query1') query3 = SqlStatement('SELECT * FROM $query2 WHERE x == $count') args = {'query1': query1, 'query2': query2, 'query3': query3} with self.assertRaises(Exception) as e: _ = SqlStatement.format('SELECT * FROM $query1', args)[0] self.assertEquals('Circular dependency in $query1', e.exception.message) with self.assertRaises(Exception) as e: _ = SqlStatement.format('SELECT * FROM $query2', args)[0] self.assertEquals('Circular dependency in $query2', e.exception.message) with self.assertRaises(Exception) as e: _ = SqlStatement.format('SELECT * FROM $query3', args)[0] self.assertEquals('Circular dependency in $query3', e.exception.message)