diff options
-rw-r--r-- | ipalib/ipa_types.py | 22 | ||||
-rw-r--r-- | ipalib/tests/test_ipa_types.py | 39 |
2 files changed, 61 insertions, 0 deletions
diff --git a/ipalib/ipa_types.py b/ipalib/ipa_types.py index fe35a9ac..ff62af22 100644 --- a/ipalib/ipa_types.py +++ b/ipalib/ipa_types.py @@ -81,6 +81,28 @@ class Type(ReadOnly): return self.convert(value) +class Bool(Type): + def __init__(self, true='Yes', false='No'): + if true is None: + raise TypeError('`true` cannot be None') + if false is None: + raise TypeError('`false` cannot be None') + if true == false: + raise ValueError( + 'cannot be equal: true=%r, false=%r' % (true, false) + ) + self.true = true + self.false = false + super(Bool, self).__init__(bool) + + def convert(self, value): + if value == self.true: + return True + if value == self.false: + return False + return None + + class Int(Type): def __init__(self, min_value=None, max_value=None): check_min_max(min_value, max_value, 'min_value', 'max_value') diff --git a/ipalib/tests/test_ipa_types.py b/ipalib/tests/test_ipa_types.py index f594aabf..37546d9e 100644 --- a/ipalib/tests/test_ipa_types.py +++ b/ipalib/tests/test_ipa_types.py @@ -88,6 +88,45 @@ class test_Type(ClassChecker): assert str(e) == 'not an allowed type: %r' % t +class test_Bool(ClassChecker): + _cls = ipa_types.Bool + + def test_class(self): + assert self.cls.__bases__ == (ipa_types.Type,) + + def test_init(self): + o = self.cls() + assert o.__islocked__() is True + assert read_only(o, 'type') is bool + assert read_only(o, 'name') == 'Bool' + assert read_only(o, 'true') == 'Yes' + assert read_only(o, 'false') == 'No' + + keys = ('true', 'false') + val = 'some value' + for key in keys: + # Check that kwarg sets appropriate attribute: + o = self.cls(**{key: val}) + assert read_only(o, key) is val + # Check that None raises TypeError: + e = raises(TypeError, self.cls, **{key: None}) + assert str(e) == '`%s` cannot be None' % key + + # Check that ValueError is raise if true == false: + e = raises(ValueError, self.cls, true=1L, false=1.0) + assert str(e) == 'cannot be equal: true=1L, false=1.0' + + def test_call(self): + o = self.cls() + assert o(True) is True + assert o('Yes') is True + assert o(False) is False + assert o('No') is False + for value in (0, 1, 'True', 'False', 'yes', 'no'): + # value is not be converted, so None is returned + assert o(value) is None + + class test_Int(ClassChecker): _cls = ipa_types.Int |