diff --git a/engine/engine.go b/engine/engine.go index 42bfd13b..f2fb82fd 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -791,6 +791,12 @@ func contractStep(s *step.Step, res *resolution.Resolution) { if child.Metadata != nil { childM[values.MetadataKey] = child.Metadata } + childMMetadata := childM[values.MetadataKey].(map[string]interface{}) + if childMMetadata == nil { + childMMetadata = make(map[string]interface{}) + } + childMMetadata[values.IteratorKey] = child.Item + childM[values.MetadataKey] = childMMetadata childM[values.StateKey] = child.State var i interface{} = childM collectedChildren = append(collectedChildren, i) diff --git a/engine/engine_test.go b/engine/engine_test.go index 9e812683..ece635f9 100644 --- a/engine/engine_test.go +++ b/engine/engine_test.go @@ -672,6 +672,19 @@ func TestForeach(t *testing.T) { firstItem := concatList[0].(map[string]interface{}) firstItemOutput := firstItem[values.OutputKey].(map[string]interface{}) assert.Equal(t, "foo-b-bar-b", firstItemOutput["concat"]) + + outputExpected := map[string]string{"foo": "foo-b", "bar": "bar-b"} + metadata, ok := firstItem[values.MetadataKey].(map[string]interface{}) + require.True(t, ok) + iterator, ok := metadata[values.IteratorKey].(map[string]interface{}) + require.True(t, ok) + outputInterface, ok := iterator["output"].(map[string]interface{}) + require.True(t, ok) + output := make(map[string]string) + for key, value := range outputInterface { + output[key] = fmt.Sprintf("%v", value) + } + assert.Equal(t, outputExpected, output) } func TestForeachWithChainedIterations(t *testing.T) {