def _key_metadata_fail_(vals, keys, expected):
    mv = MetadataValidatorSet(vals)
    with raises(Exception) as got:
        mv.key_metadata(keys)
    assert_exception_correct(got.value, expected)
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'
        }
    }