Files
sqlalchemy/test/engine/test_processors.py
T
Mike Bayer 7c74d702a9 Make boolean processors consistent between Py/C; coerce to 1/0
The processing performed by the :class:`.Boolean` datatype for backends
that only feature integer types has been made consistent between the
pure Python and C-extension versions, in that the C-extension version
will accept any integer value from the database as a boolean, not just
zero and one; additionally, non-boolean integer values being sent to
the database are coerced to exactly zero or one, instead of being
passed as the original integer value.

Change-Id: I01e647547fd7047bd549dd70e1fa202c51e8328b
Fixes: #3730
2016-06-23 19:58:43 -04:00

251 lines
6.6 KiB
Python

from sqlalchemy.testing import fixtures
from sqlalchemy.testing import assert_raises_message, eq_
class _BooleanProcessorTest(fixtures.TestBase):
def test_int_to_bool_none(self):
eq_(
self.module.int_to_boolean(None),
None
)
def test_int_to_bool_zero(self):
eq_(
self.module.int_to_boolean(0),
False
)
def test_int_to_bool_one(self):
eq_(
self.module.int_to_boolean(1),
True
)
def test_int_to_bool_positive_int(self):
eq_(
self.module.int_to_boolean(12),
True
)
def test_int_to_bool_negative_int(self):
eq_(
self.module.int_to_boolean(-4),
True
)
class PyBooleanProcessorTest(_BooleanProcessorTest):
@classmethod
def setup_class(cls):
from sqlalchemy import processors
cls.module = type(
"util", (object,),
dict(
(k, staticmethod(v))
for k, v in list(processors.py_fallback().items())
)
)
def test_bool_to_int_false(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(False), 0)
def test_bool_to_int_true(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(True), 1)
def test_bool_to_int_positive_int(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(5), 1)
def test_bool_to_int_negative_int(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(-10), 1)
def test_bool_to_int_zero(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(0), 0)
def test_bool_to_int_one(self):
from sqlalchemy import processors
eq_(processors.boolean_to_int(1), 1)
class CBooleanProcessorTest(_BooleanProcessorTest):
__requires__ = ('cextensions',)
@classmethod
def setup_class(cls):
from sqlalchemy import cprocessors
cls.module = cprocessors
class _DateProcessorTest(fixtures.TestBase):
def test_date_no_string(self):
assert_raises_message(
ValueError,
"Couldn't parse date string '2012' - value is not a string",
self.module.str_to_date, 2012
)
def test_datetime_no_string(self):
assert_raises_message(
ValueError,
"Couldn't parse datetime string '2012' - value is not a string",
self.module.str_to_datetime, 2012
)
def test_time_no_string(self):
assert_raises_message(
ValueError,
"Couldn't parse time string '2012' - value is not a string",
self.module.str_to_time, 2012
)
def test_date_invalid_string(self):
assert_raises_message(
ValueError,
"Couldn't parse date string: '5:a'",
self.module.str_to_date, "5:a"
)
def test_datetime_invalid_string(self):
assert_raises_message(
ValueError,
"Couldn't parse datetime string: '5:a'",
self.module.str_to_datetime, "5:a"
)
def test_time_invalid_string(self):
assert_raises_message(
ValueError,
"Couldn't parse time string: '5:a'",
self.module.str_to_time, "5:a"
)
class PyDateProcessorTest(_DateProcessorTest):
@classmethod
def setup_class(cls):
from sqlalchemy import processors
cls.module = type("util", (object,),
dict(
(k, staticmethod(v))
for k, v in list(processors.py_fallback().items())
)
)
class CDateProcessorTest(_DateProcessorTest):
__requires__ = ('cextensions',)
@classmethod
def setup_class(cls):
from sqlalchemy import cprocessors
cls.module = cprocessors
class _DistillArgsTest(fixtures.TestBase):
def test_distill_none(self):
eq_(
self.module._distill_params(None, None),
[]
)
def test_distill_no_multi_no_param(self):
eq_(
self.module._distill_params((), {}),
[]
)
def test_distill_dict_multi_none_param(self):
eq_(
self.module._distill_params(None, {"foo": "bar"}),
[{"foo": "bar"}]
)
def test_distill_dict_multi_empty_param(self):
eq_(
self.module._distill_params((), {"foo": "bar"}),
[{"foo": "bar"}]
)
def test_distill_single_dict(self):
eq_(
self.module._distill_params(({"foo": "bar"},), {}),
[{"foo": "bar"}]
)
def test_distill_single_list_strings(self):
eq_(
self.module._distill_params((["foo", "bar"],), {}),
[["foo", "bar"]]
)
def test_distill_single_list_tuples(self):
eq_(
self.module._distill_params(
([("foo", "bar"), ("bat", "hoho")],), {}),
[('foo', 'bar'), ('bat', 'hoho')]
)
def test_distill_single_list_tuple(self):
eq_(
self.module._distill_params(([("foo", "bar")],), {}),
[('foo', 'bar')]
)
def test_distill_multi_list_tuple(self):
eq_(
self.module._distill_params(
([("foo", "bar")], [("bar", "bat")]), {}),
([('foo', 'bar')], [('bar', 'bat')])
)
def test_distill_multi_strings(self):
eq_(
self.module._distill_params(("foo", "bar"), {}),
[('foo', 'bar')]
)
def test_distill_single_list_dicts(self):
eq_(
self.module._distill_params(
([{"foo": "bar"}, {"foo": "hoho"}],), {}),
[{'foo': 'bar'}, {'foo': 'hoho'}]
)
def test_distill_single_string(self):
eq_(
self.module._distill_params(("arg",), {}),
[["arg"]]
)
def test_distill_multi_string_tuple(self):
eq_(
self.module._distill_params((("arg", "arg"),), {}),
[("arg", "arg")]
)
class PyDistillArgsTest(_DistillArgsTest):
@classmethod
def setup_class(cls):
from sqlalchemy.engine import util
cls.module = type("util", (object,),
dict(
(k, staticmethod(v))
for k, v in list(util.py_fallback().items())
)
)
class CDistillArgsTest(_DistillArgsTest):
__requires__ = ('cextensions', )
@classmethod
def setup_class(cls):
from sqlalchemy import cutils as util
cls.module = util