Beispiel #1
0
def test_sequence_of_values_type():
    """ Test parser for sequence of allowed values. """

    checker = parsing.EnumerationType({'a', 'b', 'c', 'd'})
    checker.validate('d')
    checker.validate('c')
    checker.validate('b')
    checker.validate('a')
    assert_raises(lambda: checker.validate('e'), exceptions.ValueException)
Beispiel #2
0
def test_stringable_type():
    """ Test stringable type. """

    checker = parsing.StringableType(str)
    checker.validate('0')
    checker = parsing.StringableType(MyStringable)
    checker.validate(MyStringable('test'))
    assert_raises(lambda: checker.validate('test'), exceptions.TypeException)
    assert_raises(lambda: checker.validate(None), exceptions.TypeException)
Beispiel #3
0
def test_primitive_type():
    """ Test parser for primitive type. """

    checker = parsing.PrimitiveType(bool)
    checker.validate(True)
    checker.validate(False)
    assert_raises(lambda: checker.validate(None), exceptions.TypeException)
    assert_raises(lambda: checker.validate(0), exceptions.TypeException)
    assert_raises(lambda: checker.validate(1), exceptions.TypeException)
    assert_raises(lambda: checker.validate(''), exceptions.TypeException)
    assert_raises(lambda: checker.validate('a non-empty string'),
                  exceptions.TypeException)
Beispiel #4
0
def test_sequence_type():
    """ Test sequence type. """

    # With default sequence builder.
    checker = parsing.SequenceType(int)
    checker.validate((1, 2, 3))
    checker.validate([1, 2, 3])
    checker.validate({1, 2, 3})
    checker.validate(SortedSet(int))
    checker.validate(SortedSet(int, (1, 2, 3)))
    assert_raises(lambda: checker.validate((1, 2, 3.0)),
                  exceptions.TypeException)
    assert_raises(lambda: checker.validate((1.0, 2.0, 3.0)),
                  exceptions.TypeException)
    assert isinstance(checker.to_type((1, 2, 3)), list)
    # With SortedSet as sequence builder.
    checker = parsing.SequenceType(float)
    checker.validate((1.0, 2.0, 3.0))
    checker.validate([1.0, 2.0, 3.0])
    checker.validate({1.0, 2.0, 3.0})
    assert_raises(lambda: checker.validate((1, 2, 3.0)),
                  exceptions.TypeException)
    assert_raises(lambda: checker.validate((1.0, 2.0, 3)),
                  exceptions.TypeException)
    checker = parsing.SequenceType(int,
                                   sequence_builder=SortedSet.builder(int))
    initial_list = (1, 2, 7, 7, 1)
    checker.validate(initial_list)
    updated_list = checker.update(initial_list)
    assert isinstance(updated_list,
                      SortedSet) and updated_list.element_type is int
    assert updated_list == SortedSet(int, (1, 2, 7))
    assert checker.to_json(updated_list) == [1, 2, 7]
    assert checker.to_type([7, 2, 1, 1, 7, 1, 7]) == updated_list
Beispiel #5
0
def test_jsonable_class_type():
    """ Test parser for Jsonable sub-classes. """

    checker = parsing.JsonableClassType(MyJsonable)
    my_jsonable = MyJsonable(field_a=False,
                             field_b='test',
                             field_e={1},
                             field_f=[6.5])
    my_jsonable_dict = {
        'field_a': False,
        'field_b': 'test',
        'field_e': (1, 2),
        'field_f': (1.0, 2.0),
    }
    checker.validate(my_jsonable)
    assert_raises(lambda: checker.validate(None), exceptions.TypeException)
    assert_raises(lambda: checker.validate(my_jsonable_dict),
                  exceptions.TypeException)
Beispiel #6
0
def test_sequence_of_primitives_type():
    """ Test parser for sequence of primitive types. """

    checker = parsing.SequenceOfPrimitivesType((int, bool))
    checker.validate(False)
    checker.validate(True)
    checker.validate(0)
    checker.validate(1)
    assert_raises(lambda: checker.validate(0.0), exceptions.TypeException)
    assert_raises(lambda: checker.validate(1.0), exceptions.TypeException)
    assert_raises(lambda: checker.validate(''), exceptions.TypeException)
    assert_raises(lambda: checker.validate('a non-empty string'),
                  exceptions.TypeException)
Beispiel #7
0
def test_dict_type():
    """ Test dict type. """

    checker = parsing.DictType(str, int)
    checker.validate({'test': 1})
    assert_raises(lambda: checker.validate({'test': 1.0}),
                  exceptions.TypeException)
    checker = parsing.DictType(MyStringable, float)
    checker.validate({MyStringable('12'): 2.5})
    assert_raises(lambda: checker.validate({'12': 2.5}),
                  exceptions.TypeException)
    assert_raises(lambda: checker.validate({MyStringable('12'): 2}),
                  exceptions.TypeException)
    checker = parsing.DictType(MyStringable,
                               float,
                               dict_builder=SortedDict.builder(
                                   MyStringable, float))
    value = {MyStringable(12): 22.0}
    checker.validate(value)
    updated_value = checker.update(value)
    assert isinstance(updated_value, SortedDict)
    assert updated_value.key_type is MyStringable
    assert updated_value.val_type is float
    json_value = {'MyStringable 12': 22.0}
    assert checker.to_type(json_value) == SortedDict(
        MyStringable, float, {MyStringable('12'): 22.0})
    assert checker.to_json(
        SortedDict(MyStringable, float,
                   {MyStringable(12): 22.0})) == json_value
Beispiel #8
0
def test_optional_value_type():
    """ Test optional value type. """

    checker = parsing.OptionalValueType(bool)
    assert_raises(lambda ch=checker: ch.validate(1), exceptions.TypeException)
    assert_raises(lambda ch=checker: ch.validate(1.1),
                  exceptions.TypeException)
    assert_raises(lambda ch=checker: ch.validate(''), exceptions.TypeException)
    for value in (True, False, None):
        checker.validate(value)
        assert checker.to_type(value) is value
        assert checker.to_json(value) is value
    assert checker.update(None) is None
Beispiel #9
0
def test_default_value_type():
    """ Test default value type. """

    for default_value in (True, False, None):
        checker = parsing.DefaultValueType(bool, default_value)
        assert_raises(lambda ch=checker: ch.validate(1),
                      exceptions.TypeException)
        assert_raises(lambda ch=checker: ch.validate(1.1),
                      exceptions.TypeException)
        assert_raises(lambda ch=checker: ch.validate(''),
                      exceptions.TypeException)
        for value in (True, False, None):
            checker.validate(value)
            if value is None:
                assert checker.to_type(value) is default_value
                assert checker.to_json(value) is default_value
            else:
                assert checker.to_type(value) is value
                assert checker.to_json(value) is value
        assert checker.update(None) is default_value
Beispiel #10
0
def test_model_parsing():
    """ Test parsing for a real model. """

    model = {
        'name': str,
        'language': ('fr', 'en'),
        'myjsonable': parsing.JsonableClassType(MyJsonable),
        'mydict': parsing.DictType(str, float),
        'nothing': (bool, str),
        'default_float': parsing.DefaultValueType(float, 33.44),
        'optional_float': parsing.OptionalValueType(float)
    }
    bad_data_field = {
        '_name_':
        'hello',
        'language':
        'fr',
        'myjsonable':
        MyJsonable(field_a=False, field_b='test', field_e={1}, field_f=[6.5]),
        'mydict': {
            'a': 2.5,
            'b': -1.6
        },
        'nothing':
        'thanks'
    }
    bad_data_type = {
        'name':
        'hello',
        'language':
        'fr',
        'myjsonable':
        MyJsonable(field_a=False, field_b='test', field_e={1}, field_f=[6.5]),
        'mydict': {
            'a': 2.5,
            'b': -1.6
        },
        'nothing':
        2.5
    }
    bad_data_value = {
        'name':
        'hello',
        'language':
        '__',
        'myjsonable':
        MyJsonable(field_a=False, field_b='test', field_e={1}, field_f=[6.5]),
        'mydict': {
            'a': 2.5,
            'b': -1.6
        },
        'nothing':
        '2.5'
    }
    good_data = {
        'name':
        'hello',
        'language':
        'fr',
        'myjsonable':
        MyJsonable(field_a=False, field_b='test', field_e={1}, field_f=[6.5]),
        'mydict': {
            'a': 2.5,
            'b': -1.6
        },
        'nothing':
        '2.5'
    }
    assert_raises(lambda: parsing.validate_data(bad_data_field, model),
                  (exceptions.TypeException, ))
    assert_raises(lambda: parsing.validate_data(bad_data_type, model),
                  (exceptions.TypeException, ))
    assert_raises(lambda: parsing.validate_data(bad_data_value, model),
                  (exceptions.ValueException, ))

    assert 'default_float' not in good_data
    assert 'optional_float' not in good_data
    parsing.validate_data(good_data, model)
    updated_good_data = parsing.update_data(good_data, model)
    assert 'default_float' in updated_good_data
    assert 'optional_float' in updated_good_data
    assert updated_good_data['default_float'] == 33.44
    assert updated_good_data['optional_float'] is None