def _prefix_key_metadata_fail_(vals, keys, expected):
    mv = MetadataValidatorSet(vals)
    with raises(Exception) as got:
        mv.prefix_key_metadata(keys)
    assert_exception_correct(got.value, expected)

    with raises(Exception) as got:
        mv.prefix_key_metadata(keys, exact_match=True)
    assert_exception_correct(got.value, expected)
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_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_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'
        }
    }