def test_set_call_prefix_validator_fail():
    _call_prefix_validator_fail(
        [
            MetadataValidator('key1', prefix_validators=[_noop]),
            MetadataValidator('key2', prefix_validators=[_noop])
        ], 'key3', 0, 'key3stuff',
        ValueError('No prefix validators for prefix key3'))
    _call_prefix_validator_fail(
        [  # exact match required
            MetadataValidator('key1', prefix_validators=[_noop]),
            MetadataValidator('key2', prefix_validators=[_noop]),
            MetadataValidator('key', prefix_validators=[_noop])
        ],
        'key3',
        0,
        'key3stuff',
        ValueError('No prefix validators for prefix key3'))
    _call_prefix_validator_fail(
        [
            MetadataValidator('key1', prefix_validators=[_noop]),
            MetadataValidator('key2', prefix_validators=[_noop]),
            MetadataValidator('key3', prefix_validators=[_noop])
        ], 'key', 0, 'key3stuff',
        ValueError('No prefix validators for prefix key'))
    _call_prefix_validator_fail(
        [
            MetadataValidator('key1', prefix_validators=[_noop]),
            MetadataValidator('key2', prefix_validators=[_noop, _noop])
        ], 'key2', 2, 'key2stuff',
        IndexError(
            'Requested validator index 2 for prefix key2 but maximum index is 1'
        ))
def test_set_key_metadata_fail_bad_args():
    _key_metadata_fail_([], None, ValueError('keys cannot be None'))
    _key_metadata_fail_([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key3', [_noop])
    ], ['key1', 'key2', 'key3'],
                        IllegalParameterError('No such metadata key: key2'))
def test_construct_val_std():
    mv = MetadataValidator('mykey', [val1, val2])

    assert mv.key == 'mykey'
    assert mv.metadata == {}
    assert mv.is_prefix_validator() is False
    assert len(mv.validators) == 2
    assert len(mv.prefix_validators) == 0
    assert mv.validators[0]('foo', {'a': 'b'}) == "foo {'a': 'b'} 1"
    assert mv.validators[1]('bar', {'c': 'd'}) == "bar {'c': 'd'} 2"
def test_set_call_validator():
    mv = MetadataValidatorSet([
        MetadataValidator('key1',
                          [lambda k, v: (k, v, 1), lambda k, v: (k, v, 2)]),
        MetadataValidator('key2', [lambda k, v: (k, v, 3)])
    ])
    assert mv.call_validator('key1', 0,
                             {'foo', 'bar'}) == ('key1', {'foo', 'bar'}, 1)
    assert mv.call_validator('key1', 1,
                             {'foo', 'bat'}) == ('key1', {'foo', 'bat'}, 2)
    assert mv.call_validator('key2', 0,
                             {'foo', 'baz'}) == ('key2', {'foo', 'baz'}, 3)
def test_set_call_validator_fail():
    _call_validator_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop])
    ], 'key3', 0, ValueError('No validators for key key3'))
    _call_validator_fail(
        [
            MetadataValidator('key1', [_noop]),
            MetadataValidator('key2', [_noop, _noop])
        ], 'key2', 2,
        IndexError(
            'Requested validator index 2 for key key2 but maximum index is 1'))
def test_construct_val_prefix_and_meta():
    mv = MetadataValidator('my other key',
                           prefix_validators=[val2],
                           metadata={
                               'foo': 'bar',
                               'baz': 'bat'
                           })

    assert mv.key == 'my other key'
    assert mv.metadata == {'foo': 'bar', 'baz': 'bat'}
    assert mv.is_prefix_validator() is True
    assert len(mv.validators) == 0
    assert len(mv.prefix_validators) == 1
    assert mv.prefix_validators[0]('foo', {'a': 'b'}) == "foo {'a': 'b'} 2"
def test_set_validate_metadata_return_errors_with_subkey():
    _validate_metadata_errors([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator(
            'key3',
            [_noop, lambda _, __: {
                'subkey': 'somekey',
                'message': 'oh poop'
            }])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, 'key3', 'Key key3: oh poop', 'somekey')
def test_set_with_validators():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('key1', [
            lambda k, v: exec('assert k == "key1"'),
            lambda k, v: exec('assert v == {"a": "b"}')
        ]),
        MetadataValidator('key2', [lambda k, v: exec('assert k == "key2"')])
    ])

    md = {'key1': {'a': 'b'}, 'key2': {'foo': 'bar'}}
    mv.validate_metadata(md)
    mv.validate_metadata(maps.FrozenMap(md))

    assert mv.keys() == ['key1', 'key2']
    assert mv.prefix_keys() == []
    assert mv.validator_count('key1') == 2
    assert mv.validator_count('key2') == 1
def test_set_call_prefix_validator():
    mv = MetadataValidatorSet([
        MetadataValidator('p1',
                          prefix_validators=[
                              lambda p, k, v: (p, k, v, 1), lambda p, k, v:
                              (p, k, v, 2)
                          ]),
        MetadataValidator('p2',
                          prefix_validators=[lambda p, k, v: (p, k, v, 3)])
    ])
    assert mv.call_prefix_validator('p1', 0, 'key1',
                                    {'foo', 'bar'}) == ('p1', 'key1',
                                                        {'foo', 'bar'}, 1)
    assert mv.call_prefix_validator('p1', 1, 'key11',
                                    {'foo', 'bat'}) == ('p1', 'key11',
                                                        {'foo', 'bat'}, 2)
    assert mv.call_prefix_validator('p2', 0, 'key2',
                                    {'foo', 'baz'}) == ('p2', 'key2',
                                                        {'foo', 'baz'}, 3)
def test_prefix_key_metadata_fail_prefix_match():
    mv = MetadataValidatorSet([
        MetadataValidator('abcdef',
                          prefix_validators=[_noop],
                          metadata={'f': 'g'}),
        MetadataValidator('abcdefhi',
                          prefix_validators=[_noop],
                          metadata={'f': 'g'})
    ])

    with raises(Exception) as got:
        mv.prefix_key_metadata(None, exact_match=False)
    assert_exception_correct(got.value, ValueError('keys cannot be None'))

    with raises(Exception) as got:
        mv.prefix_key_metadata(['abcde'], exact_match=False)
    assert_exception_correct(
        got.value,
        IllegalParameterError('No prefix metadata keys matching key abcde'))
def test_set_with_prefix_validators():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('pre1',
                          prefix_validators=[
                              lambda p, k, v: exec('assert p == "pre1"'),
                              lambda p, k, v: exec('assert k == "pre1stuff"'),
                              lambda p, k, v: exec('assert v == {"a": "b"}')
                          ]),
        MetadataValidator(
            'pre2',
            prefix_validators=[lambda p, k, v: exec('assert p == "pre2"')])
    ])

    md = {'pre1stuff': {'a': 'b'}, 'pre2thingy': {'foo': 'bar'}}
    mv.validate_metadata(md)
    mv.validate_metadata(maps.FrozenMap(md))

    assert mv.keys() == []
    assert mv.prefix_keys() == ['pre1', 'pre2']
    assert mv.prefix_validator_count('pre1') == 3
    assert mv.prefix_validator_count('pre2') == 1
def test_set_with_prefix_validators_and_standard_validator():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('pre1',
                          prefix_validators=[
                              lambda p, k, v: exec('assert p == "pre1"'),
                              lambda p, k, v: exec('assert k == "pre1stuff"'),
                              lambda p, k, v: exec('assert v == {"a": "b"}')
                          ]),
        MetadataValidator(
            'pre2',
            prefix_validators=[lambda p, k, v: exec('assert p == "pre2"')]),
        # test that non-prefix validator with same name is ok
        MetadataValidator('pre2', [lambda k, v: exec('raise ValueError()')])
    ])

    md = {'pre1stuff': {'a': 'b'}, 'pre2thingy': {'foo': 'bar'}}
    mv.validate_metadata(md)
    mv.validate_metadata(maps.FrozenMap(md))

    assert mv.keys() == ['pre2']
    assert mv.prefix_keys() == ['pre1', 'pre2']
    assert mv.prefix_validator_count('pre1') == 3
    assert mv.prefix_validator_count('pre2') == 1
def test_set_with_prefix_validators_multiple_matches():
    results = []
    mv = MetadataValidatorSet([
        MetadataValidator('somekey', [lambda k, v: results.append((k, v))]),
        MetadataValidator('somekeya',
                          prefix_validators=[
                              lambda p, k, v: exec(
                                  'raise ValueError("test failed somekeya")')
                          ]),
        MetadataValidator(
            'somekex',
            prefix_validators=[
                lambda p, k, v: exec('raise ValueError("test failed somekex")')
            ]),
        MetadataValidator(
            'somekey',
            prefix_validators=[lambda p, k, v: results.append((p, k, v))]),
        MetadataValidator(
            'somekez',
            prefix_validators=[
                lambda p, k, v: exec('raise ValueError("test failed somekez")')
            ]),
        MetadataValidator(
            'someke',
            prefix_validators=[lambda p, k, v: results.append((p, k, v))]),
        MetadataValidator(
            's', prefix_validators=[lambda p, k, v: results.append(
                (p, k, v))]),
        MetadataValidator(
            't',
            prefix_validators=[
                lambda p, k, v: exec('raise ValueError("test failed t")')
            ]),
    ])
    md = {'somekey': {'x', 'y'}}
    mv.validate_metadata(md)

    print(results)
    assert results == [
        ('somekey', {'x', 'y'}),
        ('s', 'somekey', {'x', 'y'}),
        ('someke', 'somekey', {'x', 'y'}),
        ('somekey', 'somekey', {'x', 'y'}),
    ]
def test_construct_set_fail_bad_args():
    _fail_construct_set([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key3', [_noop]),
        MetadataValidator('key1', [_noop]),
    ], ValueError('Duplicate validator: key1'))
    _fail_construct_set([
        MetadataValidator('key1', prefix_validators=[_noop]),
        MetadataValidator('key3', prefix_validators=[_noop]),
        MetadataValidator('key1', prefix_validators=[_noop]),
    ], ValueError('Duplicate prefix validator: key1'))
def test_set_prefix_validator_count_fail():
    _prefix_validator_count_fail([
        MetadataValidator('key1', prefix_validators=[_noop]),
        MetadataValidator('key2', prefix_validators=[_noop])
    ], 'key3', ValueError('No prefix validators for prefix key3'))
    _prefix_validator_count_fail(
        [  # exact match required
            MetadataValidator('key1', prefix_validators=[_noop]),
            MetadataValidator('key', prefix_validators=[_noop])
        ],
        'key3',
        ValueError('No prefix validators for prefix key3'))
    _prefix_validator_count_fail([
        MetadataValidator('key1', prefix_validators=[_noop]),
        MetadataValidator('key3', prefix_validators=[_noop])
    ], 'key', ValueError('No prefix validators for prefix key'))
Example #16
0
def test_set_validate_metadata_return_errors():
    _validate_metadata_errors([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator('key', prefix_validators=[_noop3])
    ], {
        'key1': 'a',
        'key2': 'b',
        'kex': 'c'
    }, str('No validator available for metadata key kex'))
    _validate_metadata_errors([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, str('No validator available for metadata key key3'))
    _validate_metadata_errors(
        [MetadataValidator('keyx', prefix_validators=[_noop3])], {
            'keyx1': 'a',
            'keyx2': 'b',
            'key': 'c'
        }, str('No validator available for metadata key key'))
    _validate_metadata_errors([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator('key3', [_noop, lambda _, __: 'oh poop'])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, str('Key key3: oh poop'))
    _validate_metadata_errors([
        MetadataValidator('key1', prefix_validators=[_noop3]),
        MetadataValidator('key2', prefix_validators=[_noop3]),
        MetadataValidator(
            'key3', prefix_validators=[_noop3, lambda _, __, ___: 'oh poop'])
    ], {
        'key1stuff': 'a',
        'key2': 'b',
        'key3yay': 'c'
    }, str('Prefix validator key3, key key3yay: oh poop'))
def _fail_construct_val(key, validators, prefix_validators, expected):
    with raises(Exception) as got:
        MetadataValidator(key, validators, prefix_validators)
    assert_exception_correct(got.value, expected)
def test_set_validate_metadata_fail():
    _validate_metadata_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop])
    ], [], ValueError('metadata must be a dict'))
    _validate_metadata_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator('key', prefix_validators=[_noop3])
    ], {
        'key1': 'a',
        'key2': 'b',
        'kex': 'c'
    }, MetadataValidationError('No validator available for metadata key kex'))
    _validate_metadata_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, MetadataValidationError('No validator available for metadata key key3'))
    _validate_metadata_fail(
        [MetadataValidator('keyx', prefix_validators=[_noop3])], {
            'keyx1': 'a',
            'keyx2': 'b',
            'key': 'c'
        },
        MetadataValidationError('No validator available for metadata key key'))
    _validate_metadata_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator('key3', [_noop, lambda _, __: 'oh poop'])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, MetadataValidationError('Key key3: oh poop'))
    _validate_metadata_fail([
        MetadataValidator('key1', prefix_validators=[_noop3]),
        MetadataValidator('key2', prefix_validators=[_noop3]),
        MetadataValidator(
            'key3', prefix_validators=[_noop3, lambda _, __, ___: 'oh poop'])
    ], {
        'key1stuff': 'a',
        'key2': 'b',
        'key3yay': 'c'
    }, MetadataValidationError('Prefix validator key3, key key3yay: oh poop'))
def test_set_validate_metadata_return_errors():
    _validate_metadata_errors(
        [
            MetadataValidator('key1', [_noop]),
            MetadataValidator('key2', [_noop]),
            MetadataValidator('key', prefix_validators=[_noop3])
        ], {
            'key1': 'a',
            'key2': 'b',
            'kex': 'c'
        }, 'kex',
        'Cannot validate controlled field "kex", no matching validator found')
    _validate_metadata_errors(
        [
            MetadataValidator('key1', [_noop]),
            MetadataValidator('key2', [_noop])
        ], {
            'key1': 'a',
            'key2': 'b',
            'key3': 'c'
        }, 'key3',
        'Cannot validate controlled field "key3", no matching validator found')
    _validate_metadata_errors(
        [MetadataValidator('keyx', prefix_validators=[_noop3])], {
            'keyx1': 'a',
            'keyx2': 'b',
            'key': 'c'
        }, 'key',
        'Cannot validate controlled field "key", no matching validator found')
    _validate_metadata_errors([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop]),
        MetadataValidator('key3', [_noop, lambda _, __: 'oh poop'])
    ], {
        'key1': 'a',
        'key2': 'b',
        'key3': 'c'
    }, 'key3', 'Key key3: oh poop')
    _validate_metadata_errors([
        MetadataValidator('key1', prefix_validators=[_noop3]),
        MetadataValidator('key2', prefix_validators=[_noop3]),
        MetadataValidator(
            'key3', prefix_validators=[_noop3, lambda _, __, ___: 'oh poop'])
    ], {
        'key1stuff': 'a',
        'key2': 'b',
        'key3yay': 'c'
    }, 'key3yay', 'Prefix validator key3, key key3yay: oh poop')
def test_set_with_key_metadata():
    mv = MetadataValidatorSet([
        MetadataValidator('pre1',
                          prefix_validators=[_noop],
                          metadata={
                              'a': 'b',
                              'c': 'd'
                          }),
        MetadataValidator('pre2', prefix_validators=[_noop]),
        MetadataValidator('pre3',
                          prefix_validators=[_noop],
                          metadata={'c': 'd'}),
        MetadataValidator('pre1', [_noop]),
        MetadataValidator('pre2', [_noop], metadata={
            'e': 'f',
            'h': 'i'
        }),
        MetadataValidator('pre3', [_noop], metadata={'h': 'i'})
    ])

    assert mv.key_metadata([]) == {}
    assert mv.prefix_key_metadata([]) == {}

    assert mv.key_metadata(['pre1']) == {'pre1': {}}
    assert mv.prefix_key_metadata(['pre1'], exact_match=True) == {
        'pre1': {
            'a': 'b',
            'c': 'd'
        }
    }

    assert mv.key_metadata(['pre1', 'pre3']) == {
        'pre1': {},
        'pre3': {
            'h': 'i'
        }
    }
    assert mv.prefix_key_metadata(['pre1', 'pre2']) == {
        'pre1': {
            'a': 'b',
            'c': 'd'
        },
        'pre2': {}
    }

    assert mv.key_metadata(['pre1', 'pre2', 'pre3']) == {
        'pre1': {},
        'pre2': {
            'e': 'f',
            'h': 'i'
        },
        'pre3': {
            'h': 'i'
        }
    }
    assert mv.prefix_key_metadata(['pre1', 'pre2', 'pre3']) == {
        'pre1': {
            'a': 'b',
            'c': 'd'
        },
        'pre2': {},
        'pre3': {
            'c': 'd'
        }
    }
def test_set_with_prefix_match_key_metadata():
    mv = MetadataValidatorSet([
        MetadataValidator('a', prefix_validators=[_noop], metadata={'a': 'b'}),
        MetadataValidator('abc',
                          prefix_validators=[_noop],
                          metadata={'c': 'd'}),
        MetadataValidator('abcdef',
                          prefix_validators=[_noop],
                          metadata={'f': 'g'}),
        MetadataValidator('abcdefhi',
                          prefix_validators=[_noop],
                          metadata={'f': 'g'}),
        MetadataValidator('abzhi',
                          prefix_validators=[_noop],
                          metadata={'z': 'w'}),
        MetadataValidator('abzhijk',
                          prefix_validators=[_noop],
                          metadata={'q': 'q'}),
        MetadataValidator('b',
                          prefix_validators=[_noop],
                          metadata={'bbb': 'bbb'}),
    ])

    assert mv.prefix_key_metadata(['abcdef']) == {'abcdef': {'f': 'g'}}
    assert mv.prefix_key_metadata(['abcdef'], exact_match=False) == {
        'a': {
            'a': 'b'
        },
        'abc': {
            'c': 'd'
        },
        'abcdef': {
            'f': 'g'
        }
    }
    assert mv.prefix_key_metadata(['abcdefh'], exact_match=False) == {
        'a': {
            'a': 'b'
        },
        'abc': {
            'c': 'd'
        },
        'abcdef': {
            'f': 'g'
        }
    }
    assert mv.prefix_key_metadata(['abzhij'], exact_match=False) == {
        'a': {
            'a': 'b'
        },
        'abzhi': {
            'z': 'w'
        }
    }
    assert mv.prefix_key_metadata(['abcdef', 'abzhij'], exact_match=False) == {
        'a': {
            'a': 'b'
        },
        'abc': {
            'c': 'd'
        },
        'abcdef': {
            'f': 'g'
        },
        'abzhi': {
            'z': 'w'
        }
    }
def test_set_validator_count_fail():
    _validator_count_fail([
        MetadataValidator('key1', [_noop]),
        MetadataValidator('key2', [_noop])
    ], 'key3', ValueError('No validators for key key3'))