QueryJSON: Avoid overriding Terraform.Stdout directly (#619)
diff --git a/tfexec/cmd.go b/tfexec/cmd.go index 153667a..149da2e 100644 --- a/tfexec/cmd.go +++ b/tfexec/cmd.go
@@ -230,7 +230,7 @@ // Due to this it returns an iterator that allows calling code to consume a stream of messages. func (tf *Terraform) runTerraformCmdJSONLog(ctx context.Context, cmd *exec.Cmd) iter.Seq[NextMessage] { pr, pw := io.Pipe() - tf.SetStdout(pw) + cmd.Stdout = mergeWriters(cmd.Stdout, pw) emitter := newLogMsgEmitter(pr)
diff --git a/tfexec/internal/e2etest/query_test.go b/tfexec/internal/e2etest/query_test.go index 67bc6fc..7b85957 100644 --- a/tfexec/internal/e2etest/query_test.go +++ b/tfexec/internal/e2etest/query_test.go
@@ -5,6 +5,7 @@ import ( "context" + "path/filepath" "regexp" "testing" @@ -80,3 +81,44 @@ } }) } + +func TestQueryJSON_andValidate(t *testing.T) { + versions := []string{testutil.Latest_Alpha_v1_14} + runTestWithVersions(t, versions, "query", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) { + err := tf.Init(context.Background()) + if err != nil { + t.Fatalf("error running Init in test directory: %s", err) + } + + cfgOutPath := filepath.Join(tf.WorkingDir(), "gen.tf") + iter, err := tf.QueryJSON(t.Context(), tfexec.GenerateConfigOut(cfgOutPath)) + if err != nil { + t.Fatalf("error running Query: %s", err) + } + + var completeData tfjson.ListCompleteData + for nextMsg := range iter { + if nextMsg.Err != nil { + t.Fatalf("error getting next message: %s", nextMsg.Err) + } + switch m := nextMsg.Msg.(type) { + case tfjson.ListCompleteMessage: + completeData = m.ListComplete + } + } + + expectedData := tfjson.ListCompleteData{ + Address: "list.concept_pet.pets", + ResourceType: "concept_pet", + Total: 5, + } + if diff := cmp.Diff(expectedData, completeData); diff != "" { + t.Fatalf("unexpected complete message data: %s", diff) + } + + _, err = tf.Validate(t.Context()) + if err != nil { + t.Fatalf("failed to run validate after query: %s", err) + } + }) +}