Hello, trying to write a unit test with async child workflows but the children
array doesn’t seem to get populated with futures in the unit tests and thus the result is empty. Am I missing something in how I should be doing env.OnWorkflow(childWorkflow)
so that it returns a future?
func ParentWorkflow(ctx workflow.Context, params ParentParams) (map[string]string, error) {
activityoptions := workflow.ActivityOptions{
// Set Activity Timeout duration
ScheduleToCloseTimeout: workflows.GetActivityTimeout(),
}
ctx = workflow.WithActivityOptions(ctx, activityoptions)
var getObjectsOutput *activities.GetObjectsOutput
err := workflow.ExecuteActivity(ctx, GetObjects, activities.GetObjectsInput{names: params.names}).Get(ctx, &getObjectsOutput)
if err != nil {
Log(ctx).Error().Msgf("unable to get objects: %v", err)
return nil, err
}
var objects = getObjectsOutput.Objects
var children []workflow.Future
for _, o := range objects {
// ExecuteChildWorkflow asynchronously
childWorkflowOptions := workflow.ChildWorkflowOptions{
ParentClosePolicy: enums.PARENT_CLOSE_POLICY_ABANDON,
TaskQueue: workers.GetTaskQueue(),
WorkflowExecutionTimeout: 10 * workflows.GetActivityTimeout(),
}
ctx = workflow.WithChildOptions(ctx, childWorkflowOptions)
workflow.Go(ctx, func(ctx workflow.Context) {
children = append(children, workflow.ExecuteChildWorkflow(ctx, ChildWorkflow, Params{name: o.Name}))
})
}
resultMap := make(map[string]string)
var successCount, failureCount int
for _, child := range children {
var result *string
if err := child.Get(ctx, &result); err != nil {
Log(ctx).Error().Msgf("Child workflow failed: %v", err)
failureCount++
resultMap[result] = err.Error()
} else {
successCount++
resultMap[result] = "Success"
}
}
return resultMap, nil
}
func Test_ParentWorkflow(t *testing.T) {
testSuite := testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
objects := []*object{activities.NewRandomObject(), activities.NewRandomObject()}
names := []string{objects[0].Name, objects[1].Name}
env.OnWorkflow(ChildWorkflow, mock.Anything, Params{name: names[0]}).Return(Params{name: names[0]}, nil)
env.OnWorkflow(ChildWorkflow, mock.Anything, Params{name: names[1]}).Return(Params{name: names[1]}, nil)
env.ExecuteWorkflow(workflow.ParentWorkflow, ParentParams{})
assert.True(t, env.IsWorkflowCompleted())
assert.NoError(t, env.GetWorkflowError())
var result map[string]string
env.GetWorkflowResult(&result)
assert.Equal(t, 2, len(result))
assert.Equal(t, "Success", result[names[0]])
assert.Equal(t, "Success", result[names[1]])
}