| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package main | |
| import ( | |
| "context" | |
| "testing" | |
| tfe "github.com/hashicorp/go-tfe" | |
| tfversion "github.com/hashicorp/terraform/version" | |
| ) | |
| func Test_terraform_apply_autoApprove(t *testing.T) { | |
| t.Parallel() | |
| skipIfMissingEnvVar(t) | |
| skipWithoutRemoteTerraformVersion(t) | |
| ctx := context.Background() | |
| cases := testCases{ | |
| "workspace manual apply, terraform apply without auto-approve, expect prompt": { | |
| operations: []operationSets{ | |
| { | |
| prep: func(t *testing.T, orgName, dir string) { | |
| wsName := "app" | |
| _ = createWorkspace(t, orgName, tfe.WorkspaceCreateOptions{ | |
| Name: tfe.String(wsName), | |
| TerraformVersion: tfe.String(tfversion.String()), | |
| AutoApply: tfe.Bool(false), | |
| }) | |
| tfBlock := terraformConfigCloudBackendName(orgName, wsName) | |
| writeMainTF(t, tfBlock, dir) | |
| }, | |
| commands: []tfCommand{ | |
| { | |
| command: []string{"init"}, | |
| expectedCmdOutput: `HCP Terraform has been successfully initialized!`, | |
| }, | |
| { | |
| command: []string{"apply"}, | |
| expectedCmdOutput: `Do you want to perform these actions in workspace "app"?`, | |
| userInput: []string{"yes"}, | |
| postInputOutput: []string{`Apply complete!`}, | |
| }, | |
| }, | |
| }, | |
| }, | |
| validations: func(t *testing.T, orgName string) { | |
| workspace, err := tfeClient.Workspaces.ReadWithOptions(ctx, orgName, "app", &tfe.WorkspaceReadOptions{Include: []tfe.WSIncludeOpt{tfe.WSCurrentRun}}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if workspace.CurrentRun == nil { | |
| t.Fatal("Expected workspace to have run, but got nil") | |
| } | |
| if workspace.CurrentRun.Status != tfe.RunApplied { | |
| t.Fatalf("Expected run status to be `applied`, but is %s", workspace.CurrentRun.Status) | |
| } | |
| }, | |
| }, | |
| "workspace auto apply, terraform apply without auto-approve, expect prompt": { | |
| operations: []operationSets{ | |
| { | |
| prep: func(t *testing.T, orgName, dir string) { | |
| wsName := "app" | |
| _ = createWorkspace(t, orgName, tfe.WorkspaceCreateOptions{ | |
| Name: tfe.String(wsName), | |
| TerraformVersion: tfe.String(tfversion.String()), | |
| AutoApply: tfe.Bool(true), | |
| }) | |
| tfBlock := terraformConfigCloudBackendName(orgName, wsName) | |
| writeMainTF(t, tfBlock, dir) | |
| }, | |
| commands: []tfCommand{ | |
| { | |
| command: []string{"init"}, | |
| expectedCmdOutput: `HCP Terraform has been successfully initialized!`, | |
| }, | |
| { | |
| command: []string{"apply"}, | |
| expectedCmdOutput: `Do you want to perform these actions in workspace "app"?`, | |
| userInput: []string{"yes"}, | |
| postInputOutput: []string{`Apply complete!`}, | |
| }, | |
| }, | |
| }, | |
| }, | |
| validations: func(t *testing.T, orgName string) { | |
| workspace, err := tfeClient.Workspaces.ReadWithOptions(ctx, orgName, "app", &tfe.WorkspaceReadOptions{Include: []tfe.WSIncludeOpt{tfe.WSCurrentRun}}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if workspace.CurrentRun == nil { | |
| t.Fatal("Expected workspace to have run, but got nil") | |
| } | |
| if workspace.CurrentRun.Status != tfe.RunApplied { | |
| t.Fatalf("Expected run status to be `applied`, but is %s", workspace.CurrentRun.Status) | |
| } | |
| }, | |
| }, | |
| "workspace manual apply, terraform apply with auto-approve, no prompt": { | |
| operations: []operationSets{ | |
| { | |
| prep: func(t *testing.T, orgName, dir string) { | |
| wsName := "app" | |
| _ = createWorkspace(t, orgName, tfe.WorkspaceCreateOptions{ | |
| Name: tfe.String(wsName), | |
| TerraformVersion: tfe.String(tfversion.String()), | |
| AutoApply: tfe.Bool(false), | |
| }) | |
| tfBlock := terraformConfigCloudBackendName(orgName, wsName) | |
| writeMainTF(t, tfBlock, dir) | |
| }, | |
| commands: []tfCommand{ | |
| { | |
| command: []string{"init"}, | |
| expectedCmdOutput: `HCP Terraform has been successfully initialized!`, | |
| }, | |
| { | |
| command: []string{"apply", "-auto-approve"}, | |
| expectedCmdOutput: `Apply complete!`, | |
| }, | |
| }, | |
| }, | |
| }, | |
| validations: func(t *testing.T, orgName string) { | |
| workspace, err := tfeClient.Workspaces.ReadWithOptions(ctx, orgName, "app", &tfe.WorkspaceReadOptions{Include: []tfe.WSIncludeOpt{tfe.WSCurrentRun}}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if workspace.CurrentRun == nil { | |
| t.Fatal("Expected workspace to have run, but got nil") | |
| } | |
| if workspace.CurrentRun.Status != tfe.RunApplied { | |
| t.Fatalf("Expected run status to be `applied`, but is %s", workspace.CurrentRun.Status) | |
| } | |
| }, | |
| }, | |
| "workspace auto apply, terraform apply with auto-approve, no prompt": { | |
| operations: []operationSets{ | |
| { | |
| prep: func(t *testing.T, orgName, dir string) { | |
| wsName := "app" | |
| _ = createWorkspace(t, orgName, tfe.WorkspaceCreateOptions{ | |
| Name: tfe.String(wsName), | |
| TerraformVersion: tfe.String(tfversion.String()), | |
| AutoApply: tfe.Bool(true), | |
| }) | |
| tfBlock := terraformConfigCloudBackendName(orgName, wsName) | |
| writeMainTF(t, tfBlock, dir) | |
| }, | |
| commands: []tfCommand{ | |
| { | |
| command: []string{"init"}, | |
| expectedCmdOutput: `HCP Terraform has been successfully initialized!`, | |
| }, | |
| { | |
| command: []string{"apply", "-auto-approve"}, | |
| expectedCmdOutput: `Apply complete!`, | |
| }, | |
| }, | |
| }, | |
| }, | |
| validations: func(t *testing.T, orgName string) { | |
| workspace, err := tfeClient.Workspaces.ReadWithOptions(ctx, orgName, "app", &tfe.WorkspaceReadOptions{Include: []tfe.WSIncludeOpt{tfe.WSCurrentRun}}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if workspace.CurrentRun == nil { | |
| t.Fatal("Expected workspace to have run, but got nil") | |
| } | |
| if workspace.CurrentRun.Status != tfe.RunApplied { | |
| t.Fatalf("Expected run status to be `applied`, but is %s", workspace.CurrentRun.Status) | |
| } | |
| }, | |
| }, | |
| } | |
| testRunner(t, cases, 1) | |
| } |