Example #1
0
    def test_int_in_list(self):
        spec = ListOf(int)

        # outer value is missing

        with raises_regexp(ValidationError, 'must be list'):
            spec(None)

        # outer value is present, inner value is missing

        with raises_regexp(ValidationError, 'lacks item: must be int'):
            spec([])

        # outer value is present, inner optional value is missing

        relaxed_spec = ListOf(int) | None
        relaxed_spec([])

        # inner value is present but is None

        with raises_regexp(ValidationError, 'item #0: must be int'):
            spec([None])

        # inner value is present

        spec([123])

        # multiple inner values are present

        spec([123, 456])

        # one of the inner values is of a wrong type

        with raises_regexp(ValidationError, 'item #1: must be int'):
            spec([123, 'bogus'])
Example #2
0
def test_translate_list():
    assert translate(list) == IsA(list)
    assert translate([]) == IsA(list)
    assert translate([int]) == ListOf(IsA(int))
    assert translate([1]) == ListOf(IsA(int, default=1))
    with raises_regexp(StructureSpecificationError,
                       'Expected a list containing exactly 1 item; '
                       'got 3: \[1, 2, 3\]'):
        translate([1, 2, 3])
Example #3
0
    def test_merge_list_with_oneof(self):
        "Non-rule node in list's inner spec"

        # TODO: refactor and reformulate.
        #       This test was written for older implementation of Monk.

        int_spec = IsA(int, default=123)
        str_spec = IsA(str, default='foo')

        # no defaults

        #rule = Rule(datatype=list, inner_spec=OneOf([123, 456]))
        item_spec = Any([int_spec, str_spec])
        rule = ListOf(item_spec)
        assert rule.get_default_for([]) == []
        assert rule.get_default_for([789]) == [789]

        # with defaults
        # (same results because defaults have no effect on lists)

        #rule = Rule(datatype=list,
        #            inner_spec=OneOf([123, 456], first_is_default=True))

        item_spec = Any([int_spec, str_spec], first_is_default=True)
        rule = ListOf(item_spec)
        assert rule.get_default_for([]) == []
        assert rule.get_default_for([789]) == [789]
Example #4
0
    def test_schemed_dict_in_list(self):
        spec = ListOf({'foo': int})

        # dict in list: missing key

        with raises(ValidationError):
            spec([{}])

        with raises_regexp(ValidationError, "item #1: must have keys: 'foo'"):
            spec([{'foo': 123}, {}])

        # dict in list: missing value

        with raises_regexp(ValidationError,
                           "item #0: 'foo' value must be int"):
            spec([{'foo': None}])

        with raises_regexp(ValidationError,
                           "item #1: 'foo' value must be int"):
            spec([{'foo': 123}, {'foo': None}])

        # multiple innermost values are present

        spec([{'foo': 123}])
        spec([{'foo': 123}, {'foo': 456}])

        # one of the innermost values is of a wrong type

        with raises_regexp(ValidationError,
                           "item #2: 'foo' value must be int"):
            spec([{'foo': 123}, {'foo': 456}, {'foo': 'bogus'}])
Example #5
0
def test_magic_eq():
    assert IsA(str) == IsA(str)
    assert IsA(str) != IsA(str, default='foo')
    assert IsA(str) != IsA(int)
    assert IsA(str) != Equals(int)

    # nested
    v1 = ListOf([DictOf([ (Equals('foo'), IsA(str)) ])])
    v2 = ListOf([DictOf([ (Equals('foo'), IsA(str)) ])])
    v3 = ListOf([DictOf([ (Equals('bar'), IsA(str)) ])])
    v4 = ListOf([DictOf([ (Equals('foo'), IsA(int)) ])])
    v5 = ListOf([DictOf([ (Equals('foo'), IsA(str, default='x')) ])])
    assert v1 == v1
    assert v1 == v2
    assert v1 != v3
    assert v1 != v4
    assert v1 != v5
Example #6
0
def test_regression_22():
    ~Anything()
    ~IsA(str)
    ~Equals(5)
    ~Contains('x')
    ~InRange(5)
    ~Length(5)
    ~ListOf(str)
    ~DictOf([])
    ~Exists()
Example #7
0
    def test_merge_list_with_oneof(self):
        "Non-rule node in list's inner spec"

        # TODO: refactor and reformulate.
        #       This test was written for older implementation of Monk.

        int_spec = IsA(int, default=123)
        str_spec = IsA(str, default="foo")

        # no defaults

        # rule = Rule(datatype=list, inner_spec=OneOf([123, 456]))
        item_spec = Any([int_spec, str_spec])
        rule = ListOf(item_spec)
        assert rule.get_default_for([]) == []
        assert rule.get_default_for([789]) == [789]

        # with defaults
        # (same results because defaults have no effect on lists)

        # rule = Rule(datatype=list,
        #            inner_spec=OneOf([123, 456], first_is_default=True))

        item_spec = Any([int_spec, str_spec], first_is_default=True)
        rule = ListOf(item_spec)
        assert rule.get_default_for([]) == []
        assert rule.get_default_for([789]) == [789]
Example #8
0
    def test_freeform_dict_in_list(self):
        spec = ListOf(dict)

        # inner value is present

        spec([{}])
        spec([{'foo': 123}])

        # multiple inner values are present

        spec([{'foo': 123}, {'bar': 456}])

        # one of the inner values is of a wrong type

        with raises_regexp(ValidationError, 'item #1: must be dict'):
            spec([{}, 'bogus'])
Example #9
0
    def test_merge_list(self):

        ## present but empty inner spec (optional)
        rule = ListOf([]) | Equals(None)

        # optional missing list
        assert rule.get_default_for(None) == None

        ## present but empty inner spec (required)
        rule = ListOf([])

        # required missing list → empty list
        assert rule.get_default_for(None) == []

        ## present non-empty inner spec (optional)
        rule = ListOf(IsA(int, default=123)) | Equals(None)

        # optional missing list with required item(s)
        assert rule.get_default_for(None) == None

        # optional empty list with required item(s)
        assert rule.get_default_for([]) == []

        ## present non-empty inner spec (optional)
        elem_spec = IsA(int, default=123) | Equals(None)
        rule = ListOf(elem_spec) | Equals(None)

        # optional missing list with optional item(s)
        assert rule.get_default_for(None) == None

        # optional empty list with optional item
        assert rule.get_default_for([]) == []

        ## present non-empty inner spec (required)
        rule = ListOf(IsA(int, default=123))

        # required missing list → inner spec
        assert rule.get_default_for(None) == []

        # required empty list → inner spec
        assert rule.get_default_for([]) == []

        # required non-empty list → inner spec
        #        fallback = lambda s, v, **kw: v
        assert rule.get_default_for([None]) == [None]
        assert rule.get_default_for([456]) == [456]

        ## present inner spec with empty item spec
        rule = ListOf(Anything())
        assert rule.get_default_for([456]) == [456]

        ## present inner spec with item spec that has an inner spec
        # rule = Rule(datatype=list, inner_spec=[123])
        rule = ListOf(ListOf(IsA(int, default=123)))

        # XXX CHANGED    WTF was it before!?
        ##assert rule.get_default_for([None]) == [123]
        # assert rule.get_default_for([[]]) == [[123]]

        # bogus value; will not pass validation but should be preserved
        assert rule.get_default_for(123) == 123
Example #10
0
    def test_merge_list(self):

        ## present but empty inner spec (optional)
        rule = ListOf([]) | Equals(None)

        # optional missing list
        assert rule.get_default_for(None) == None

        ## present but empty inner spec (required)
        rule = ListOf([])

        # required missing list → empty list
        assert rule.get_default_for(None) == []

        ## present non-empty inner spec (optional)
        rule = ListOf(IsA(int, default=123)) | Equals(None)

        # optional missing list with required item(s)
        assert rule.get_default_for(None) == None

        # optional empty list with required item(s)
        assert rule.get_default_for([]) == []

        ## present non-empty inner spec (optional)
        elem_spec = IsA(int, default=123) | Equals(None)
        rule = ListOf(elem_spec) | Equals(None)

        # optional missing list with optional item(s)
        assert rule.get_default_for(None) == None

        # optional empty list with optional item
        assert rule.get_default_for([]) == []

        ## present non-empty inner spec (required)
        rule = ListOf(IsA(int, default=123))

        # required missing list → inner spec
        assert rule.get_default_for(None) == []

        # required empty list → inner spec
        assert rule.get_default_for([]) == []

        # required non-empty list → inner spec
        #        fallback = lambda s, v, **kw: v
        assert rule.get_default_for([None]) == [None]
        assert rule.get_default_for([456]) == [456]

        ## present inner spec with empty item spec
        rule = ListOf(Anything())
        assert rule.get_default_for([456]) == [456]

        ## present inner spec with item spec that has an inner spec
        #rule = Rule(datatype=list, inner_spec=[123])
        rule = ListOf(ListOf(IsA(int, default=123)))

        # XXX CHANGED    WTF was it before!?
        ##assert rule.get_default_for([None]) == [123]
        #assert rule.get_default_for([[]]) == [[123]]

        # bogus value; will not pass validation but should be preserved
        assert rule.get_default_for(123) == 123