onsi / gomega

Ginkgo's Preferred Matcher Library
http://onsi.github.io/gomega/
MIT License
2.18k stars 284 forks source link

Assertion for determining if a maps values exist within another map? #762

Open Mo0rBy opened 5 months ago

Mo0rBy commented 5 months ago

I'd like to assert that mapA contains all the key:value pairs in mapB but mapA can contain more key:value pairs.

For examples:

mapA := map[string]string{
    "keyA": "valA",
    "key2": "val2",
    "keyB": "valB",
    "key1": "val1",
}

mapB := map[string]string{
    "key1": "val1",
    "key2": "val2",
}

Expect(mapA).To(Contain(mapB))

Very similar behaviour to the ContainElements() matcher, but for maps instead of slices and without needing to explicitly define the keys or values that you are expecting, it should be able to infer that from mapA.

I think there is probably a way to do this with the existing matchers somehow, but I can't figure it out if there is, for example

I think this could be a common enough use case that it should have its own matcher as well, so I thought I should post my query here.

Mo0rBy commented 5 months ago

For now, I'm just looping over the map and then using the HaveKeyWithValue() matcher which is actually clean enough, so on 2nd thought, maybe this isn't needed that badly:

mapA := map[string]string{
    "keyA": "valA",
    "key2": "val2",
    "keyB": "valB",
    "key1": "val1",
}

mapB := map[string]string{
    "key1": "val1",
    "key2": "val2",
}

k, v := range mapB {
    Expect(mapA).To(HaveKeyWithValue(k, v))
}
onsi commented 5 months ago

Hey @Mo0rBy there isn’t a dedicated matcher for this and i would likely do what you’re doing (loop). If you’re interested in submitting a PR I’d be happy to pull in a new matcher. The trickiest bit is usually picking the right name! Perhaps ContainMap()?