gomega icon indicating copy to clipboard operation
gomega copied to clipboard

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

Open Mo0rBy opened this issue 1 year ago • 2 comments

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 avatar May 30 '24 17:05 Mo0rBy

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))
}

Mo0rBy avatar May 30 '24 17:05 Mo0rBy

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()?

onsi avatar May 31 '24 12:05 onsi