def test_q_attribute_selection(self): # Combinations of attribute lookups, __getitem__ and calling. q = Q.value self.assertEqual(get_query_result(q, self.obj), 'value') q = Q['attr'] self.assertEqual(get_query_result(q, self.obj), 'item attr') q = Q.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.nested_obj['attr'] self.assertEqual(get_query_result(q, self.obj), 'item attr') # Add some operators q = Q.nested_obj.nested_obj.value + '-' + Q.value self.assertEqual(get_query_result(q, self.obj), 'value-value') q = ~ Q.true() self.assertEqual(get_query_result(q, self.obj), False) q = Q.true() & Q.nested_obj.true() self.assertEqual(get_query_result(q, self.obj), True) q = Q.true() | Q.nested_obj.false() self.assertEqual(get_query_result(q, self.obj), True)
def test_query_result(self): """ Analysis of the following hierarchical query. # Q | <q_object_test.Obj object at 0x976d64c> # Q.true | <bound method Obj.true of <q_object_test.Obj object at 0x976d64c>> # Q.true() | True # Q | <q_object_test.Obj object at 0x976d64c> # Q.nested_obj | <q_object_test.Obj object at 0x976d64c> # Q.nested_obj.false | <bound method Obj.false of <q_object_test.Obj object at 0x976d64c>> # Q.nested_obj.false() | False # Q.true() | Q.nested_obj.false() | True """ def count(query): result = query._execute_query(self.obj) return len(list(result.walk_through_subqueries())) # Check subquery count q = Q self.assertEqual(count(q), 1) q = Q.true self.assertEqual(count(q), 2) q = Q.true() self.assertEqual(count(q), 3) q = Q.nested_obj self.assertEqual(count(q), 2) q = Q.nested_obj.false self.assertEqual(count(q), 3) q = Q.nested_obj.false() self.assertEqual(count(q), 4) q = Q.true() | Q.nested_obj.false() self.assertEqual(count(q), 8) # Check subquery order. q = Q.true() | Q.nested_obj.false() result = q._execute_query(self.obj) self.assertIsInstance(result, QueryResult) # The first parameter contains all the subqueries that are executed. queries = [r[0] for r in result.walk_through_subqueries()] self.assertEqual(map(repr, queries), [ 'Q', 'Q.true', 'Q.true()', 'Q', 'Q.nested_obj', 'Q.nested_obj.false', 'Q.nested_obj.false()', 'Q.true() | Q.nested_obj.false()' ]) for q in queries: self.assertIsInstance(q, Query) # The second parameter contains the results for the respective subqueries. results = [r[1] for r in result.walk_through_subqueries()] self.assertEqual(results[2], True) self.assertEqual(results[6], False) self.assertEqual(results[7], True)
def test_q_attribute_selection(self): # Combinations of attribute lookups, __getitem__ and calling. q = Q.value self.assertEqual(get_query_result(q, self.obj), 'value') q = Q['attr'] self.assertEqual(get_query_result(q, self.obj), 'item attr') q = Q.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.action() self.assertEqual(get_query_result(q, self.obj), 'action-result') q = Q.nested_obj.nested_obj['attr'] self.assertEqual(get_query_result(q, self.obj), 'item attr') # Add some operators q = Q.nested_obj.nested_obj.value + '-' + Q.value self.assertEqual(get_query_result(q, self.obj), 'value-value') q = ~Q.true() self.assertEqual(get_query_result(q, self.obj), False) q = Q.true() & Q.nested_obj.true() self.assertEqual(get_query_result(q, self.obj), True) q = Q.true() | Q.nested_obj.false() self.assertEqual(get_query_result(q, self.obj), True)
class upstart_service(UpstartService): """ Redis upstart service. """ slug = Q('redis-%s') % Q.parent.slug chdir = '/' user = Q.parent.username command = Q('/usr/local/bin/redis-server %s') % Q.parent.config_file
def test_literals(self): # Literals q = Q('string') self.assertEqual(get_query_result(q, None), 'string') q = Q(55) self.assertEqual(get_query_result(q, None), 55) q = Q(True) self.assertEqual(get_query_result(q, None), True) q = Q(False) self.assertEqual(get_query_result(q, None), False)
class UnitTest(Service): def fail_with_error(self): """ This is an action which failes with an error. A nice traceback should be shown in the shell. (If this was called from the shell.) """ self._error_func() def _error_func(self): self._error_func2() def _error_func2(self): raise Exception('Something went wrong (dummy exception)') def eternal_recursion(self): self.eternal_recursion() def false_status_code_exception(self): self.hosts.run('/bin/false') # # Q-object tests # var1 = 'a' var2 = 'b' var3 = 55 var4 = 22 var5 = 2 var_list = [1, 2, 3, 4] #q_addition = Q.var3 + Q.var4 #q_substraction = Q.var3 - Q.var4 q_modulo = Q('%s/%s') % (Q.var1, Q.var2) q_index = Q.var_list[Q.var5] q_invalid = Q.some.invalid.query def test_q_object(self): test('Q-object: variable retreival', 'a', lambda: self.var1) #test('Q-object: addition', 77, lambda: self.q_addition) #test('Q-object: substraction', 33, lambda: self.q_substraction) test('Q-object: module operator', 'a/b', lambda: self.q_modulo) test('Q-object: index operator (Q.var[Q.var2])', 3, lambda: self.q_index) test('Q-object exception', None, lambda: self.q_invalid, should_fail=True)
def test_query_result(self): """ Analysis of the following hierarchical query. # Q | <q_object_test.Obj object at 0x976d64c> # Q.true | <bound method Obj.true of <q_object_test.Obj object at 0x976d64c>> # Q.true() | True # Q | <q_object_test.Obj object at 0x976d64c> # Q.nested_obj | <q_object_test.Obj object at 0x976d64c> # Q.nested_obj.false | <bound method Obj.false of <q_object_test.Obj object at 0x976d64c>> # Q.nested_obj.false() | False # Q.true() | Q.nested_obj.false() | True """ def count(query): result = query._execute_query(self.obj) return len(list(result.walk_through_subqueries())) # Check subquery count q = Q self.assertEqual(count(q), 1) q = Q.true self.assertEqual(count(q), 2) q = Q.true() self.assertEqual(count(q), 3) q = Q.nested_obj self.assertEqual(count(q), 2) q = Q.nested_obj.false self.assertEqual(count(q), 3) q = Q.nested_obj.false() self.assertEqual(count(q), 4) q = Q.true() | Q.nested_obj.false() self.assertEqual(count(q), 8) # Check subquery order. q = Q.true() | Q.nested_obj.false() result = q._execute_query(self.obj) self.assertIsInstance(result, QueryResult) # The first parameter contains all the subqueries that are executed. queries = [ r[0] for r in result.walk_through_subqueries() ] self.assertEqual(map(repr, queries), [ 'Q', 'Q.true', 'Q.true()', 'Q', 'Q.nested_obj', 'Q.nested_obj.false', 'Q.nested_obj.false()', 'Q.true() | Q.nested_obj.false()' ]) for q in queries: self.assertIsInstance(q, Query) # The second parameter contains the results for the respective subqueries. results = [ r[1] for r in result.walk_through_subqueries() ] self.assertEqual(results[2], True) self.assertEqual(results[6], False) self.assertEqual(results[7], True)
def test_booleans(self): # And/or/not q = Q(True) & Q(True) self.assertEqual(get_query_result(q, None), True) q = Q(True) & Q(False) self.assertEqual(get_query_result(q, None), False) q = Q(True) | Q(False) self.assertEqual(get_query_result(q, None), True) q = Q(False) | Q(False) self.assertEqual(get_query_result(q, None), False) q = ~Q(False) self.assertEqual(get_query_result(q, None), True) q = ~Q(True) self.assertEqual(get_query_result(q, None), False) # Combinations q = Q(False) | ~Q(False) self.assertEqual(get_query_result(q, None), True)
def test_string_interpolation(self): # String interpolation q = Q('before %s after') % 'value' self.assertEqual(get_query_result(q, None), 'before value after')
def test_operator_overloads(self): # Simple operator overloads (Both Q objects) q = Q('a') + Q('b') self.assertEqual(get_query_result(q, None), 'ab') q = Q(1) + Q(2) self.assertEqual(get_query_result(q, None), 3) q = Q(2) - Q(1) self.assertEqual(get_query_result(q, None), 1) q = Q(3) * Q(4) self.assertEqual(get_query_result(q, None), 12) q = Q(12) / Q(4) self.assertEqual(get_query_result(q, None), 3) # Simple operator overloads (Q object on the left.) q = Q('a') + 'b' self.assertEqual(get_query_result(q, None), 'ab') q = Q(1) + 2 self.assertEqual(get_query_result(q, None), 3) q = Q(2) - 1 self.assertEqual(get_query_result(q, None), 1) q = Q(3) * 4 self.assertEqual(get_query_result(q, None), 12) q = Q(12) / 4 self.assertEqual(get_query_result(q, None), 3) # Simple operator overloads (Q object on the right.) q = 'a' + Q('b') self.assertEqual(get_query_result(q, None), 'ab') q = 1 + Q(2) self.assertEqual(get_query_result(q, None), 3) q = 2 - Q(1) self.assertEqual(get_query_result(q, None), 1) q = 3 * Q(4) self.assertEqual(get_query_result(q, None), 12) q = 12 / Q(4) self.assertEqual(get_query_result(q, None), 3)
def test_reprs(self): # Operators self.assertEqual(repr(Q(4) + Q(5)), '4 + 5') self.assertEqual(repr(Q(4) - Q(5)), '4 - 5') self.assertEqual(repr(Q(4) * Q(5)), '4 * 5') self.assertEqual(repr(Q(4) / Q(5)), '4 / 5') # Booleans self.assertEqual(repr(Q(4) | ~Q(5)), '4 | ~ 5') self.assertEqual(repr(Q(4) & ~Q(5)), '4 & ~ 5') # Attributes and calls self.assertEqual(repr(Q.a), 'Q.a') self.assertEqual(repr(Q.b['lookup']), "Q.b['lookup']") self.assertEqual(repr(Q.a.call('param') + Q.b['lookup']), "Q.a.call('param') + Q.b['lookup']") self.assertEqual(repr(Q.a.call('param', 'p2', key='value')), "Q.a.call('param', 'p2', key='value')") self.assertEqual(repr(Q.a.call(Q.a)), "Q.a.call(Q.a)")
def test_resolve_types(self): q = Q(Q('a')) self.assertEqual(get_query_result(q, None), 'a') q = Q([Q('%s') % 'a']) self.assertEqual(get_query_result(q, None), ['a']) q = Q('%s: %s') % ('a', 'b') self.assertEqual(get_query_result(q, None), 'a: b') q = Q('%s: %s') % (Q('a'), Q('b')) self.assertEqual(get_query_result(q, None), 'a: b') q = Q(['a', 'b']) + ['c', 'd'] self.assertEqual(get_query_result(q, None), ['a', 'b', 'c', 'd']) q = Q(['a', 'b']) + [Q('c'), Q('d')] self.assertEqual(get_query_result(q, None), ['a', 'b', 'c', 'd']) q = Q('%(A)s: %(B)s') % {'A': 'a', 'B': 'b'} self.assertEqual(get_query_result(q, None), 'a: b') q = Q('%(A)s: %(B)s') % {Q('A'): Q('a'), Q('B'): Q('b')} self.assertEqual(get_query_result(q, None), 'a: b')