From a8aff633bdc3470fa59591443e4700bfed638691 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Wed, 26 Feb 2025 14:10:09 +0100 Subject: [PATCH] terraform test: fix crash when non-applyable plans are applied --- .changes/v1.11/BUG FIXES-20250226-140931.yaml | 5 +++++ internal/backend/local/test.go | 12 +++++++----- internal/command/test_test.go | 5 +++++ .../command/testdata/test/unapplyable-plan/main.tf | 8 ++++++++ .../testdata/test/unapplyable-plan/main.tftest.hcl | 11 +++++++++++ 5 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 .changes/v1.11/BUG FIXES-20250226-140931.yaml create mode 100644 internal/command/testdata/test/unapplyable-plan/main.tf create mode 100644 internal/command/testdata/test/unapplyable-plan/main.tftest.hcl diff --git a/.changes/v1.11/BUG FIXES-20250226-140931.yaml b/.changes/v1.11/BUG FIXES-20250226-140931.yaml new file mode 100644 index 000000000000..7008e3f06433 --- /dev/null +++ b/.changes/v1.11/BUG FIXES-20250226-140931.yaml @@ -0,0 +1,5 @@ +kind: BUG FIXES +body: '`terraform test`: Fix crash when a run block attempts to cleanup after a non-applyable plan.' +time: 2025-02-26T14:09:31.83904+01:00 +custom: + Issue: "36582" diff --git a/internal/backend/local/test.go b/internal/backend/local/test.go index efbf371a2259..a7911ed9f376 100644 --- a/internal/backend/local/test.go +++ b/internal/backend/local/test.go @@ -937,11 +937,13 @@ func (runner *TestFileRunner) cleanup(file *moduletest.File) { for key, state := range runner.RelevantStates { empty := true - for _, module := range state.State.Modules { - for _, resource := range module.Resources { - if resource.Addr.Resource.Mode == addrs.ManagedResourceMode { - empty = false - break + if !state.State.Empty() { + for _, module := range state.State.Modules { + for _, resource := range module.Resources { + if resource.Addr.Resource.Mode == addrs.ManagedResourceMode { + empty = false + break + } } } } diff --git a/internal/command/test_test.go b/internal/command/test_test.go index 0a232c6a06b6..bd7ddea74185 100644 --- a/internal/command/test_test.go +++ b/internal/command/test_test.go @@ -295,6 +295,11 @@ func TestTest_Runs(t *testing.T) { expectedErr: []string{"Test assertion failed", "resource renamed without moved block"}, code: 1, }, + "unapplyable-plan": { + expectedOut: []string{"0 passed, 1 failed."}, + expectedErr: []string{"Cannot apply non-applyable plan"}, + code: 1, + }, } for name, tc := range tcs { t.Run(name, func(t *testing.T) { diff --git a/internal/command/testdata/test/unapplyable-plan/main.tf b/internal/command/testdata/test/unapplyable-plan/main.tf new file mode 100644 index 000000000000..36bc69bcdbf4 --- /dev/null +++ b/internal/command/testdata/test/unapplyable-plan/main.tf @@ -0,0 +1,8 @@ + +resource "test_resource" "example" { + value = "bar" +} + +output "value" { + value = test_resource.example.value +} diff --git a/internal/command/testdata/test/unapplyable-plan/main.tftest.hcl b/internal/command/testdata/test/unapplyable-plan/main.tftest.hcl new file mode 100644 index 000000000000..8e52386ac97d --- /dev/null +++ b/internal/command/testdata/test/unapplyable-plan/main.tftest.hcl @@ -0,0 +1,11 @@ + +run "test" { + command = apply + plan_options { + mode = refresh-only + } + assert { + condition = test_resource.example.value == "bar" + error_message = "wrong value" + } +}