1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
"""Evluating SQL expressions on ORM objects"""
import sqlalchemy as sa
from sqlalchemy.test import testing
from sqlalchemy import String, Integer, select
from sqlalchemy.test.schema import Table
from sqlalchemy.test.schema import Column
from sqlalchemy.orm import mapper, create_session
from sqlalchemy.test.testing import eq_
from test.orm import _base
from sqlalchemy import and_, or_, not_
from sqlalchemy.orm import evaluator
compiler = evaluator.EvaluatorCompiler()
def eval_eq(clause, testcases=None):
evaluator = compiler.process(clause)
def testeval(obj=None, expected_result=None):
assert evaluator(obj) == expected_result, "%s != %r for %s with %r" % (evaluator(obj), expected_result, clause, obj)
if testcases:
for an_obj,result in testcases:
testeval(an_obj, result)
return testeval
class EvaluateTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(64)))
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
pass
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(User, users)
@testing.resolve_artifact_names
def test_compare_to_value(self):
eval_eq(User.name == 'foo', testcases=[
(User(name='foo'), True),
(User(name='bar'), False),
(User(name=None), None),
])
eval_eq(User.id < 5, testcases=[
(User(id=3), True),
(User(id=5), False),
(User(id=None), None),
])
@testing.resolve_artifact_names
def test_compare_to_none(self):
eval_eq(User.name == None, testcases=[
(User(name='foo'), False),
(User(name=None), True),
])
@testing.resolve_artifact_names
def test_boolean_ops(self):
eval_eq(and_(User.name == 'foo', User.id == 1), testcases=[
(User(id=1, name='foo'), True),
(User(id=2, name='foo'), False),
(User(id=1, name='bar'), False),
(User(id=2, name='bar'), False),
(User(id=1, name=None), None),
])
eval_eq(or_(User.name == 'foo', User.id == 1), testcases=[
(User(id=1, name='foo'), True),
(User(id=2, name='foo'), True),
(User(id=1, name='bar'), True),
(User(id=2, name='bar'), False),
(User(id=1, name=None), True),
(User(id=2, name=None), None),
])
eval_eq(not_(User.id == 1), testcases=[
(User(id=1), False),
(User(id=2), True),
(User(id=None), None),
])
@testing.resolve_artifact_names
def test_null_propagation(self):
eval_eq((User.name == 'foo') == (User.id == 1), testcases=[
(User(id=1, name='foo'), True),
(User(id=2, name='foo'), False),
(User(id=1, name='bar'), False),
(User(id=2, name='bar'), True),
(User(id=None, name='foo'), None),
(User(id=None, name=None), None),
])
|