diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-06-10 21:18:24 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-06-10 21:18:24 +0000 |
| commit | 45cec095b4904ba71425d2fe18c143982dd08f43 (patch) | |
| tree | af5e540fdcbf1cb2a3337157d69d4b40be010fa8 /test/orm/test_evaluator.py | |
| parent | 698a3c1ac665e7cd2ef8d5ad3ebf51b7fe6661f4 (diff) | |
| download | sqlalchemy-45cec095b4904ba71425d2fe18c143982dd08f43.tar.gz | |
- unit tests have been migrated from unittest to nose.
See README.unittests for information on how to run
the tests. [ticket:970]
Diffstat (limited to 'test/orm/test_evaluator.py')
| -rw-r--r-- | test/orm/test_evaluator.py | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/test/orm/test_evaluator.py b/test/orm/test_evaluator.py new file mode 100644 index 000000000..af6a3f89e --- /dev/null +++ b/test/orm/test_evaluator.py @@ -0,0 +1,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), + ]) + |
