2023-08-16 14:04:52 -04:00
|
|
|
// Copyright IBM Corp. 2014, 2026
|
|
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
|
2023-06-13 04:09:20 -04:00
|
|
|
package views
|
|
|
|
|
|
|
|
|
|
import (
|
2023-07-19 04:07:46 -04:00
|
|
|
"strings"
|
2023-06-13 04:09:20 -04:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/google/go-cmp/cmp"
|
2023-07-19 04:07:46 -04:00
|
|
|
"github.com/zclconf/go-cty/cty"
|
2023-06-13 04:09:20 -04:00
|
|
|
|
2023-06-28 03:30:29 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/addrs"
|
2023-06-13 04:09:20 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/command/arguments"
|
2023-07-19 04:07:46 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/configs"
|
|
|
|
|
"github.com/hashicorp/terraform/internal/configs/configschema"
|
2023-06-13 04:09:20 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/moduletest"
|
2023-07-19 04:07:46 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/plans"
|
|
|
|
|
"github.com/hashicorp/terraform/internal/providers"
|
2023-06-28 03:30:29 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/states"
|
2023-06-13 04:09:20 -04:00
|
|
|
"github.com/hashicorp/terraform/internal/terminal"
|
|
|
|
|
"github.com/hashicorp/terraform/internal/tfdiags"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestTestHuman_Conclusion(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
Suite *moduletest.Suite
|
|
|
|
|
Expected string
|
|
|
|
|
}{
|
|
|
|
|
"no tests": {
|
|
|
|
|
Suite: &moduletest.Suite{},
|
|
|
|
|
Expected: "\nExecuted 0 tests.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only skipped tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nExecuted 0 tests, 6 skipped.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only passed tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nSuccess! 6 passed, 0 failed.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"passed and skipped tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nSuccess! 4 passed, 0 failed, 2 skipped.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only failed tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nFailure! 0 passed, 6 failed.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed and skipped tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nFailure! 0 passed, 4 failed, 2 skipped.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed, passed and skipped tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nFailure! 2 passed, 2 failed, 2 skipped.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed and errored tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nFailure! 0 passed, 6 failed.\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed, errored, passed, and skipped tests": {
|
|
|
|
|
Suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-13 04:09:20 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Expected: "\nFailure! 2 passed, 2 failed, 2 skipped.\n",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewHuman, NewView(streams))
|
|
|
|
|
|
|
|
|
|
view.Conclusion(tc.Suite)
|
|
|
|
|
|
|
|
|
|
actual := done(t).Stdout()
|
|
|
|
|
expected := tc.Expected
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Fatalf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestHuman_File(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
File *moduletest.File
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress moduletest.Progress
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected string
|
|
|
|
|
}{
|
|
|
|
|
"pass": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tf", Status: moduletest.Pass},
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected: "main.tf... pass\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pending": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tf", Status: moduletest.Pending},
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected: "main.tf... pending\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"skip": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tf", Status: moduletest.Skip},
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected: "main.tf... skip\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tf", Status: moduletest.Fail},
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected: "main.tf... fail\n",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tf", Status: moduletest.Error},
|
2023-09-08 13:43:18 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
Expected: "main.tf... fail\n",
|
|
|
|
|
},
|
2023-09-08 13:43:18 -04:00
|
|
|
"starting": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tftest.hcl", Status: moduletest.Pending},
|
|
|
|
|
Progress: moduletest.Starting,
|
|
|
|
|
Expected: "main.tftest.hcl... in progress\n",
|
|
|
|
|
},
|
|
|
|
|
"tear_down": {
|
|
|
|
|
File: &moduletest.File{Name: "main.tftest.hcl", Status: moduletest.Pending},
|
|
|
|
|
Progress: moduletest.TearDown,
|
|
|
|
|
Expected: "main.tftest.hcl... tearing down\n",
|
|
|
|
|
},
|
2023-06-13 04:09:20 -04:00
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewHuman, NewView(streams))
|
|
|
|
|
|
2023-09-08 13:43:18 -04:00
|
|
|
view.File(tc.File, tc.Progress)
|
2023-06-13 04:09:20 -04:00
|
|
|
|
|
|
|
|
actual := done(t).Stdout()
|
|
|
|
|
expected := tc.Expected
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Fatalf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestHuman_Run(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
2023-10-02 03:14:20 -04:00
|
|
|
Run *moduletest.Run
|
|
|
|
|
Progress moduletest.Progress
|
|
|
|
|
StdOut string
|
|
|
|
|
StdErr string
|
2023-06-13 04:09:20 -04:00
|
|
|
}{
|
|
|
|
|
"pass": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... pass\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pass_with_diags": {
|
|
|
|
|
Run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{tfdiags.Sourceless(tfdiags.Warning, "a warning occurred", "some warning happened during this test")},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-06-13 04:09:20 -04:00
|
|
|
StdOut: ` run "run_block"... pass
|
|
|
|
|
|
|
|
|
|
Warning: a warning occurred
|
|
|
|
|
|
|
|
|
|
some warning happened during this test
|
2023-09-08 13:43:18 -04:00
|
|
|
|
2023-06-13 04:09:20 -04:00
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pending": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pending},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... pending\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"skip": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Skip},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... skip\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Fail},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... fail\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail_with_diags": {
|
|
|
|
|
Run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "a comparison failed", "details details details"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "a second comparison failed", "other details"),
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... fail\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
StdErr: `
|
|
|
|
|
Error: a comparison failed
|
|
|
|
|
|
|
|
|
|
details details details
|
|
|
|
|
|
|
|
|
|
Error: a second comparison failed
|
|
|
|
|
|
|
|
|
|
other details
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Error},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... fail\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error_with_diags": {
|
|
|
|
|
Run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{tfdiags.Sourceless(tfdiags.Error, "an error occurred", "something bad happened during this test")},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
|
|
|
|
StdOut: " run \"run_block\"... fail\n",
|
2023-06-13 04:09:20 -04:00
|
|
|
StdErr: `
|
|
|
|
|
Error: an error occurred
|
|
|
|
|
|
|
|
|
|
something bad happened during this test
|
2023-07-19 04:07:46 -04:00
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"verbose_plan": {
|
|
|
|
|
Run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Config: &configs.TestRun{
|
|
|
|
|
Command: configs.PlanTestCommand,
|
|
|
|
|
},
|
|
|
|
|
Verbose: &moduletest.Verbose{
|
|
|
|
|
Plan: &plans.Plan{
|
2024-08-12 14:28:26 -04:00
|
|
|
Changes: &plans.ChangesSrc{
|
2023-07-19 04:07:46 -04:00
|
|
|
Resources: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
PrevRunAddr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ProviderAddr: addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
After: dynamicValue(
|
|
|
|
|
t,
|
|
|
|
|
cty.ObjectVal(map[string]cty.Value{
|
|
|
|
|
"value": cty.StringVal("Hello, world!"),
|
|
|
|
|
}),
|
|
|
|
|
cty.Object(map[string]cty.Type{
|
|
|
|
|
"value": cty.String,
|
|
|
|
|
})),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
State: states.NewState(), // empty state
|
|
|
|
|
Config: &configs.Config{},
|
|
|
|
|
Providers: map[addrs.Provider]providers.ProviderSchema{
|
|
|
|
|
addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
}: {
|
|
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
|
"test_resource": {
|
2025-03-04 10:33:43 -05:00
|
|
|
Body: &configschema.Block{
|
2023-07-19 04:07:46 -04:00
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
|
"value": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-07-19 04:07:46 -04:00
|
|
|
StdOut: ` run "run_block"... pass
|
|
|
|
|
|
|
|
|
|
Terraform used the selected providers to generate the following execution
|
|
|
|
|
plan. Resource actions are indicated with the following symbols:
|
|
|
|
|
+ create
|
|
|
|
|
|
|
|
|
|
Terraform will perform the following actions:
|
|
|
|
|
|
|
|
|
|
# test_resource.creating will be created
|
|
|
|
|
+ resource "test_resource" "creating" {
|
|
|
|
|
+ value = "Hello, world!"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Plan: 1 to add, 0 to change, 0 to destroy.
|
2023-09-08 13:43:18 -04:00
|
|
|
|
2023-07-19 04:07:46 -04:00
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"verbose_apply": {
|
|
|
|
|
Run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Config: &configs.TestRun{
|
|
|
|
|
Command: configs.ApplyTestCommand,
|
|
|
|
|
},
|
|
|
|
|
Verbose: &moduletest.Verbose{
|
|
|
|
|
Plan: &plans.Plan{}, // empty plan
|
|
|
|
|
State: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
AttrsJSON: []byte(`{"value":"foobar"}`),
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
Config: &configs.Config{},
|
|
|
|
|
Providers: map[addrs.Provider]providers.ProviderSchema{
|
|
|
|
|
addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
}: {
|
|
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
|
"test_resource": {
|
2025-03-04 10:33:43 -05:00
|
|
|
Body: &configschema.Block{
|
2023-07-19 04:07:46 -04:00
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
|
"value": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Complete,
|
2023-07-19 04:07:46 -04:00
|
|
|
StdOut: ` run "run_block"... pass
|
2023-09-08 13:43:18 -04:00
|
|
|
|
2023-07-19 04:07:46 -04:00
|
|
|
# test_resource.creating:
|
|
|
|
|
resource "test_resource" "creating" {
|
|
|
|
|
value = "foobar"
|
|
|
|
|
}
|
2023-09-08 13:43:18 -04:00
|
|
|
|
2023-06-13 04:09:20 -04:00
|
|
|
`,
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
// These next three tests should print nothing, as we only report on
|
|
|
|
|
// progress complete.
|
|
|
|
|
"progress_starting": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Starting,
|
|
|
|
|
},
|
|
|
|
|
"progress_running": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.Running,
|
|
|
|
|
},
|
|
|
|
|
"progress_teardown": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
Progress: moduletest.TearDown,
|
|
|
|
|
},
|
2023-06-13 04:09:20 -04:00
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
2023-06-28 03:30:29 -04:00
|
|
|
file := &moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
Name: "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
}
|
2023-06-13 04:09:20 -04:00
|
|
|
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewHuman, NewView(streams))
|
|
|
|
|
|
2023-10-02 03:14:20 -04:00
|
|
|
view.Run(tc.Run, file, tc.Progress, 0)
|
2023-06-13 04:09:20 -04:00
|
|
|
|
|
|
|
|
output := done(t)
|
|
|
|
|
actual, expected := output.Stdout(), tc.StdOut
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Errorf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
actual, expected = output.Stderr(), tc.StdErr
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Errorf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-06-28 03:30:29 -04:00
|
|
|
|
|
|
|
|
func TestTestHuman_DestroySummary(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
diags tfdiags.Diagnostics
|
2023-07-10 06:42:05 -04:00
|
|
|
run *moduletest.Run
|
2023-06-28 03:30:29 -04:00
|
|
|
file *moduletest.File
|
|
|
|
|
state *states.State
|
|
|
|
|
stdout string
|
|
|
|
|
stderr string
|
|
|
|
|
}{
|
|
|
|
|
"empty": {
|
|
|
|
|
diags: nil,
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.NewState(),
|
|
|
|
|
},
|
|
|
|
|
"empty_state_only_warnings": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "some thing not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "some thing not very bad happened again"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.NewState(),
|
|
|
|
|
stdout: `
|
|
|
|
|
Warning: first warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened
|
|
|
|
|
|
|
|
|
|
Warning: second warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened again
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"empty_state_with_errors": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "some thing not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "some thing not very bad happened again"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "first error", "this time it is very bad"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.NewState(),
|
|
|
|
|
stdout: `
|
|
|
|
|
Warning: first warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened
|
|
|
|
|
|
|
|
|
|
Warning: second warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened again
|
|
|
|
|
`,
|
2023-07-20 02:29:09 -04:00
|
|
|
stderr: `Terraform encountered an error destroying resources created while executing
|
2023-07-20 10:57:05 -04:00
|
|
|
main.tftest.hcl.
|
2023-06-28 03:30:29 -04:00
|
|
|
|
|
|
|
|
Error: first error
|
|
|
|
|
|
2023-07-10 06:42:05 -04:00
|
|
|
this time it is very bad
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"error_from_run": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "first error", "this time it is very bad"),
|
|
|
|
|
},
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-07-10 06:42:05 -04:00
|
|
|
state: states.NewState(),
|
2023-07-20 02:29:09 -04:00
|
|
|
stderr: `Terraform encountered an error destroying resources created while executing
|
2023-07-20 10:57:05 -04:00
|
|
|
main.tftest.hcl/run_block.
|
2023-07-10 06:42:05 -04:00
|
|
|
|
|
|
|
|
Error: first error
|
|
|
|
|
|
2023-06-28 03:30:29 -04:00
|
|
|
this time it is very bad
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"state_only_warnings": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "some thing not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "some thing not very bad happened again"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "foo",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceDeposed(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
"0fcb640a",
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
stdout: `
|
|
|
|
|
Warning: first warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened
|
|
|
|
|
|
|
|
|
|
Warning: second warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened again
|
|
|
|
|
`,
|
|
|
|
|
stderr: `
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform left the following resources in state after executing
|
|
|
|
|
main.tftest.hcl, and they need to be cleaned up manually:
|
2023-06-28 03:30:29 -04:00
|
|
|
- test.bar
|
|
|
|
|
- test.bar (0fcb640a)
|
|
|
|
|
- test.foo
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"state_with_errors": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "some thing not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "some thing not very bad happened again"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "first error", "this time it is very bad"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "foo",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceDeposed(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
"0fcb640a",
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
stdout: `
|
|
|
|
|
Warning: first warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened
|
|
|
|
|
|
|
|
|
|
Warning: second warning
|
|
|
|
|
|
|
|
|
|
some thing not very bad happened again
|
|
|
|
|
`,
|
2023-07-20 02:29:09 -04:00
|
|
|
stderr: `Terraform encountered an error destroying resources created while executing
|
2023-07-20 10:57:05 -04:00
|
|
|
main.tftest.hcl.
|
2023-06-28 03:30:29 -04:00
|
|
|
|
|
|
|
|
Error: first error
|
|
|
|
|
|
|
|
|
|
this time it is very bad
|
|
|
|
|
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform left the following resources in state after executing
|
|
|
|
|
main.tftest.hcl, and they need to be cleaned up manually:
|
2023-06-28 03:30:29 -04:00
|
|
|
- test.bar
|
|
|
|
|
- test.bar (0fcb640a)
|
|
|
|
|
- test.foo
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewHuman, NewView(streams))
|
|
|
|
|
|
2023-07-10 06:42:05 -04:00
|
|
|
view.DestroySummary(tc.diags, tc.run, tc.file, tc.state)
|
2023-06-28 03:30:29 -04:00
|
|
|
|
|
|
|
|
output := done(t)
|
|
|
|
|
actual, expected := output.Stdout(), tc.stdout
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Errorf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
actual, expected = output.Stderr(), tc.stderr
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Errorf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-19 04:31:32 -04:00
|
|
|
func TestTestHuman_FatalInterruptSummary(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states map[string]*states.State
|
2023-07-19 04:31:32 -04:00
|
|
|
run *moduletest.Run
|
|
|
|
|
created []*plans.ResourceInstanceChangeSrc
|
|
|
|
|
want string
|
|
|
|
|
}{
|
|
|
|
|
"no_state_only_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: make(map[string]*states.State),
|
2023-07-19 04:31:32 -04:00
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Config: &configs.TestRun{},
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
},
|
|
|
|
|
created: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: `
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform was interrupted while executing main.tftest.hcl, and may not have
|
2023-07-20 02:29:09 -04:00
|
|
|
performed the expected cleanup operations.
|
2023-07-19 04:31:32 -04:00
|
|
|
|
2023-07-20 02:29:09 -04:00
|
|
|
Terraform was in the process of creating the following resources for
|
|
|
|
|
"run_block" from the module under test, and they may not have been destroyed:
|
2023-07-19 04:31:32 -04:00
|
|
|
- test_instance.one
|
|
|
|
|
- test_instance.two
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"file_state_no_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
configs.TestMainStateIdentifier: states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
created: nil,
|
|
|
|
|
want: `
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform was interrupted while executing main.tftest.hcl, and may not have
|
2023-07-20 02:29:09 -04:00
|
|
|
performed the expected cleanup operations.
|
2023-07-19 04:31:32 -04:00
|
|
|
|
2023-07-20 02:29:09 -04:00
|
|
|
Terraform has already created the following resources from the module under
|
|
|
|
|
test:
|
2023-07-19 04:31:32 -04:00
|
|
|
- test_instance.one
|
|
|
|
|
- test_instance.two
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"run_states_no_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
"../setup": states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
created: nil,
|
|
|
|
|
want: `
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform was interrupted while executing main.tftest.hcl, and may not have
|
2023-07-20 02:29:09 -04:00
|
|
|
performed the expected cleanup operations.
|
2023-07-19 04:31:32 -04:00
|
|
|
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Terraform has already created the following resources for "../setup":
|
2023-07-19 04:31:32 -04:00
|
|
|
- test_instance.one
|
|
|
|
|
- test_instance.two
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
"all_states_with_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
"../setup": states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "setup_one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "setup_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
configs.TestMainStateIdentifier: states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
created: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "new_one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "new_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Config: &configs.TestRun{},
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
},
|
|
|
|
|
want: `
|
2023-07-20 10:57:05 -04:00
|
|
|
Terraform was interrupted while executing main.tftest.hcl, and may not have
|
2023-07-20 02:29:09 -04:00
|
|
|
performed the expected cleanup operations.
|
2023-07-19 04:31:32 -04:00
|
|
|
|
2023-07-20 02:29:09 -04:00
|
|
|
Terraform has already created the following resources from the module under
|
|
|
|
|
test:
|
2023-07-19 04:31:32 -04:00
|
|
|
- test_instance.one
|
|
|
|
|
- test_instance.two
|
|
|
|
|
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
Terraform has already created the following resources for "../setup":
|
2023-07-20 12:57:35 -04:00
|
|
|
- test_instance.setup_one
|
|
|
|
|
- test_instance.setup_two
|
|
|
|
|
|
2023-07-20 02:29:09 -04:00
|
|
|
Terraform was in the process of creating the following resources for
|
|
|
|
|
"run_block" from the module under test, and they may not have been destroyed:
|
2023-07-19 04:31:32 -04:00
|
|
|
- test_instance.new_one
|
|
|
|
|
- test_instance.new_two
|
|
|
|
|
`,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewHuman, NewView(streams))
|
|
|
|
|
|
2023-07-20 12:57:35 -04:00
|
|
|
file := &moduletest.File{
|
|
|
|
|
Name: "main.tftest.hcl",
|
|
|
|
|
}
|
2023-07-19 04:31:32 -04:00
|
|
|
|
|
|
|
|
view.FatalInterruptSummary(tc.run, file, tc.states, tc.created)
|
|
|
|
|
actual, expected := done(t).Stderr(), tc.want
|
|
|
|
|
if diff := cmp.Diff(expected, actual); len(diff) > 0 {
|
|
|
|
|
t.Errorf("expected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 03:30:29 -04:00
|
|
|
func TestTestJSON_Abstract(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
suite *moduletest.Suite
|
|
|
|
|
want []map[string]interface{}
|
|
|
|
|
}{
|
|
|
|
|
"single": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"main.tftest.hcl": {
|
2023-06-28 03:30:29 -04:00
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "setup",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Found 1 file and 1 run block",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_abstract": map[string]interface{}{
|
2023-07-20 10:57:05 -04:00
|
|
|
"main.tftest.hcl": []interface{}{
|
2023-06-28 03:30:29 -04:00
|
|
|
"setup",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_abstract",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"plural": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"main.tftest.hcl": {
|
2023-06-28 03:30:29 -04:00
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "setup",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other.tftest.hcl": {
|
2023-06-28 03:30:29 -04:00
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Found 2 files and 3 run blocks",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_abstract": map[string]interface{}{
|
2023-07-20 10:57:05 -04:00
|
|
|
"main.tftest.hcl": []interface{}{
|
2023-06-28 03:30:29 -04:00
|
|
|
"setup",
|
|
|
|
|
"test",
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other.tftest.hcl": []interface{}{
|
2023-06-28 03:30:29 -04:00
|
|
|
"test",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_abstract",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
|
|
|
|
view.Abstract(tc.suite)
|
|
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestJSON_Conclusion(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
suite *moduletest.Suite
|
|
|
|
|
want []map[string]interface{}
|
|
|
|
|
}{
|
|
|
|
|
"no tests": {
|
|
|
|
|
suite: &moduletest.Suite{},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Executed 0 tests.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "pending",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 0.0,
|
|
|
|
|
"passed": 0.0,
|
|
|
|
|
"skipped": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only skipped tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Executed 0 tests, 6 skipped.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "skip",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 0.0,
|
|
|
|
|
"passed": 0.0,
|
|
|
|
|
"skipped": 6.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only passed tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Success! 6 passed, 0 failed.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "pass",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 0.0,
|
|
|
|
|
"passed": 6.0,
|
|
|
|
|
"skipped": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"passed and skipped tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Success! 4 passed, 0 failed, 2 skipped.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "pass",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 0.0,
|
|
|
|
|
"passed": 4.0,
|
|
|
|
|
"skipped": 2.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"only failed tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Failure! 0 passed, 6 failed.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "fail",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 6.0,
|
|
|
|
|
"passed": 0.0,
|
|
|
|
|
"skipped": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed and skipped tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Failure! 0 passed, 4 failed, 2 skipped.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "fail",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 4.0,
|
|
|
|
|
"passed": 0.0,
|
|
|
|
|
"skipped": 2.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed, passed and skipped tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Failure! 2 passed, 2 failed, 2 skipped.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "fail",
|
|
|
|
|
"errored": 0.0,
|
|
|
|
|
"failed": 2.0,
|
|
|
|
|
"passed": 2.0,
|
|
|
|
|
"skipped": 2.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed and errored tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Failure! 0 passed, 6 failed.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "error",
|
|
|
|
|
"errored": 3.0,
|
|
|
|
|
"failed": 3.0,
|
|
|
|
|
"passed": 0.0,
|
|
|
|
|
"skipped": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"failed, errored, passed, and skipped tests": {
|
|
|
|
|
suite: &moduletest.Suite{
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Files: map[string]*moduletest.File{
|
2023-07-20 10:57:05 -04:00
|
|
|
"descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
"other_descriptive_test_name.tftest.hcl": {
|
|
|
|
|
Name: "other_descriptive_test_name.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Runs: []*moduletest.Run{
|
|
|
|
|
{
|
|
|
|
|
Name: "test_one",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_two",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: "test_three",
|
|
|
|
|
Status: moduletest.Skip,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "Failure! 2 passed, 2 failed, 2 skipped.",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"test_summary": map[string]interface{}{
|
|
|
|
|
"status": "error",
|
|
|
|
|
"errored": 1.0,
|
|
|
|
|
"failed": 1.0,
|
|
|
|
|
"passed": 2.0,
|
|
|
|
|
"skipped": 2.0,
|
|
|
|
|
},
|
|
|
|
|
"type": "test_summary",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
|
|
|
|
view.Conclusion(tc.suite)
|
|
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestJSON_DestroySummary(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
|
|
|
|
file *moduletest.File
|
2023-07-10 06:42:05 -04:00
|
|
|
run *moduletest.Run
|
2023-06-28 03:30:29 -04:00
|
|
|
state *states.State
|
|
|
|
|
diags tfdiags.Diagnostics
|
|
|
|
|
want []map[string]interface{}
|
|
|
|
|
}{
|
|
|
|
|
"empty_state_only_warnings": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "something not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "something not very bad happened again"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.NewState(),
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: first warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "first warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: second warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened again",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "second warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"empty_state_with_errors": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "something not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "something not very bad happened again"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "first error", "this time it is very bad"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.NewState(),
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: first warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "first warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: second warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened again",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "second warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Error: first error",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "this time it is very bad",
|
|
|
|
|
"severity": "error",
|
|
|
|
|
"summary": "first error",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-10 06:42:05 -04:00
|
|
|
"state_from_run": {
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}},
|
2023-07-10 06:42:05 -04:00
|
|
|
state: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "foo",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@message": "Terraform left some resources in state after executing main.tftest.hcl/run_block, they need to be cleaned up manually.",
|
2023-07-10 06:42:05 -04:00
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-07-10 06:42:05 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_cleanup": map[string]interface{}{
|
|
|
|
|
"failed_resources": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.foo",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_cleanup",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-06-28 03:30:29 -04:00
|
|
|
"state_only_warnings": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "something not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "something not very bad happened again"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "foo",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceDeposed(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
"0fcb640a",
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@message": "Terraform left some resources in state after executing main.tftest.hcl, they need to be cleaned up manually.",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"test_cleanup": map[string]interface{}{
|
|
|
|
|
"failed_resources": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.bar",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.bar",
|
|
|
|
|
"deposed_key": "0fcb640a",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.foo",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_cleanup",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: first warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "first warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: second warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened again",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "second warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"state_with_errors": {
|
|
|
|
|
diags: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "first warning", "something not very bad happened"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Warning, "second warning", "something not very bad happened again"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "first error", "this time it is very bad"),
|
|
|
|
|
},
|
2023-07-20 10:57:05 -04:00
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl"},
|
2023-06-28 03:30:29 -04:00
|
|
|
state: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "foo",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
state.SetResourceInstanceDeposed(
|
|
|
|
|
addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test",
|
|
|
|
|
Name: "bar",
|
|
|
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
|
|
|
|
|
"0fcb640a",
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
Status: states.ObjectReady,
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@message": "Terraform left some resources in state after executing main.tftest.hcl, they need to be cleaned up manually.",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"test_cleanup": map[string]interface{}{
|
|
|
|
|
"failed_resources": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.bar",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.bar",
|
|
|
|
|
"deposed_key": "0fcb640a",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test.foo",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_cleanup",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: first warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "first warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: second warning",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something not very bad happened again",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "second warning",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Error: first error",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "this time it is very bad",
|
|
|
|
|
"severity": "error",
|
|
|
|
|
"summary": "first error",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
2023-07-10 06:42:05 -04:00
|
|
|
view.DestroySummary(tc.diags, tc.run, tc.file, tc.state)
|
2023-06-28 03:30:29 -04:00
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestJSON_File(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
2023-09-08 13:43:18 -04:00
|
|
|
file *moduletest.File
|
|
|
|
|
progress moduletest.Progress
|
|
|
|
|
want []map[string]interface{}
|
2023-06-28 03:30:29 -04:00
|
|
|
}{
|
|
|
|
|
"pass": {
|
2023-09-08 13:43:18 -04:00
|
|
|
file: &moduletest.File{Name: "main.tf", Status: moduletest.Pass},
|
|
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tf... pass",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tf",
|
|
|
|
|
"test_file": map[string]interface{}{
|
2023-09-08 13:43:18 -04:00
|
|
|
"path": "main.tf",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pass",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pending": {
|
2023-09-08 13:43:18 -04:00
|
|
|
file: &moduletest.File{Name: "main.tf", Status: moduletest.Pending},
|
|
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tf... pending",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tf",
|
|
|
|
|
"test_file": map[string]interface{}{
|
2023-09-08 13:43:18 -04:00
|
|
|
"path": "main.tf",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pending",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"skip": {
|
2023-09-08 13:43:18 -04:00
|
|
|
file: &moduletest.File{Name: "main.tf", Status: moduletest.Skip},
|
|
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tf... skip",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tf",
|
|
|
|
|
"test_file": map[string]interface{}{
|
2023-09-08 13:43:18 -04:00
|
|
|
"path": "main.tf",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "skip",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail": {
|
2023-09-08 13:43:18 -04:00
|
|
|
file: &moduletest.File{Name: "main.tf", Status: moduletest.Fail},
|
|
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tf... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tf",
|
|
|
|
|
"test_file": map[string]interface{}{
|
2023-09-08 13:43:18 -04:00
|
|
|
"path": "main.tf",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "fail",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error": {
|
2023-09-08 13:43:18 -04:00
|
|
|
file: &moduletest.File{Name: "main.tf", Status: moduletest.Error},
|
|
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tf... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tf",
|
|
|
|
|
"test_file": map[string]interface{}{
|
2023-09-08 13:43:18 -04:00
|
|
|
"path": "main.tf",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "error",
|
|
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"starting": {
|
|
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl", Status: moduletest.Pending},
|
|
|
|
|
progress: moduletest.Starting,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tftest.hcl... in progress",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tftest.hcl",
|
|
|
|
|
"test_file": map[string]interface{}{
|
|
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"progress": "starting",
|
|
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"tear_down": {
|
|
|
|
|
file: &moduletest.File{Name: "main.tftest.hcl", Status: moduletest.Pending},
|
|
|
|
|
progress: moduletest.TearDown,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "main.tftest.hcl... tearing down",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tftest.hcl",
|
|
|
|
|
"test_file": map[string]interface{}{
|
|
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"progress": "teardown",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_file",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
2023-09-08 13:43:18 -04:00
|
|
|
view.File(tc.file, tc.progress)
|
2023-06-28 03:30:29 -04:00
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTestJSON_Run(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
2023-10-02 03:14:20 -04:00
|
|
|
run *moduletest.Run
|
|
|
|
|
progress moduletest.Progress
|
|
|
|
|
elapsed int64
|
|
|
|
|
want []map[string]interface{}
|
2023-06-28 03:30:29 -04:00
|
|
|
}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"starting": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Starting,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... in progress",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tftest.hcl",
|
|
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
|
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "starting",
|
|
|
|
|
"elapsed": float64(0),
|
|
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"running": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Running,
|
|
|
|
|
elapsed: 2024,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... in progress",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tftest.hcl",
|
|
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
|
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "running",
|
|
|
|
|
"elapsed": float64(2024),
|
|
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"teardown": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.TearDown,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... tearing down",
|
|
|
|
|
"@module": "terraform.ui",
|
|
|
|
|
"@testfile": "main.tftest.hcl",
|
|
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
|
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "teardown",
|
|
|
|
|
"elapsed": float64(0),
|
|
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
2023-06-28 03:30:29 -04:00
|
|
|
"pass": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pass},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... pass",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pass",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pass_with_diags": {
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{tfdiags.Sourceless(tfdiags.Warning, "a warning occurred", "some warning happened during this test")},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... pass",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pass",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "warn",
|
|
|
|
|
"@message": "Warning: a warning occurred",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "some warning happened during this test",
|
|
|
|
|
"severity": "warning",
|
|
|
|
|
"summary": "a warning occurred",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"pending": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Pending},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... pending",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pending",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"skip": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Skip},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... skip",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "skip",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Fail},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "fail",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"fail_with_diags": {
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Fail,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "a comparison failed", "details details details"),
|
|
|
|
|
tfdiags.Sourceless(tfdiags.Error, "a second comparison failed", "other details"),
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "fail",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Error: a comparison failed",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "details details details",
|
|
|
|
|
"severity": "error",
|
|
|
|
|
"summary": "a comparison failed",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Error: a second comparison failed",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "other details",
|
|
|
|
|
"severity": "error",
|
|
|
|
|
"summary": "a second comparison failed",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
run: &moduletest.Run{Name: "run_block", Config: &configs.TestRun{}, Status: moduletest.Error},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "error",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
"error_with_diags": {
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Error,
|
|
|
|
|
Diagnostics: tfdiags.Diagnostics{tfdiags.Sourceless(tfdiags.Error, "an error occurred", "something bad happened during this test")},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-06-28 03:30:29 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... fail",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "error",
|
2023-06-28 03:30:29 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Error: an error occurred",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-06-28 03:30:29 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"diagnostic": map[string]interface{}{
|
|
|
|
|
"detail": "something bad happened during this test",
|
|
|
|
|
"severity": "error",
|
|
|
|
|
"summary": "an error occurred",
|
|
|
|
|
},
|
|
|
|
|
"type": "diagnostic",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-19 04:07:46 -04:00
|
|
|
|
|
|
|
|
"verbose_plan": {
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Config: &configs.TestRun{
|
|
|
|
|
Command: configs.PlanTestCommand,
|
|
|
|
|
},
|
|
|
|
|
Verbose: &moduletest.Verbose{
|
|
|
|
|
Plan: &plans.Plan{
|
2024-08-12 14:28:26 -04:00
|
|
|
Changes: &plans.ChangesSrc{
|
2023-07-19 04:07:46 -04:00
|
|
|
Resources: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
PrevRunAddr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ProviderAddr: addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
After: dynamicValue(
|
|
|
|
|
t,
|
|
|
|
|
cty.ObjectVal(map[string]cty.Value{
|
|
|
|
|
"value": cty.StringVal("foobar"),
|
|
|
|
|
}),
|
|
|
|
|
cty.Object(map[string]cty.Type{
|
|
|
|
|
"value": cty.String,
|
|
|
|
|
})),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
State: states.NewState(), // empty state
|
|
|
|
|
Config: &configs.Config{
|
|
|
|
|
Module: &configs.Module{
|
|
|
|
|
ProviderRequirements: &configs.RequiredProviders{},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Providers: map[addrs.Provider]providers.ProviderSchema{
|
|
|
|
|
addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
}: {
|
|
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
|
"test_resource": {
|
2025-03-04 10:33:43 -05:00
|
|
|
Body: &configschema.Block{
|
2023-07-19 04:07:46 -04:00
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
|
"value": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-07-19 04:07:46 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... pass",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-07-19 04:07:46 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pass",
|
2023-07-19 04:07:46 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "-verbose flag enabled, printing plan",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-07-19 04:07:46 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_plan": map[string]interface{}{
|
2023-08-28 04:25:29 -04:00
|
|
|
"plan_format_version": "1.2",
|
|
|
|
|
"provider_format_version": "1.0",
|
2023-07-19 04:07:46 -04:00
|
|
|
"resource_changes": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"address": "test_resource.creating",
|
|
|
|
|
"change": map[string]interface{}{
|
|
|
|
|
"actions": []interface{}{"create"},
|
|
|
|
|
"after": map[string]interface{}{
|
|
|
|
|
"value": "foobar",
|
|
|
|
|
},
|
|
|
|
|
"after_sensitive": map[string]interface{}{},
|
|
|
|
|
"after_unknown": map[string]interface{}{},
|
|
|
|
|
"before": nil,
|
|
|
|
|
"before_sensitive": false,
|
|
|
|
|
},
|
|
|
|
|
"mode": "managed",
|
|
|
|
|
"name": "creating",
|
|
|
|
|
"provider_name": "registry.terraform.io/hashicorp/test",
|
|
|
|
|
"type": "test_resource",
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-08-28 04:25:29 -04:00
|
|
|
"provider_schemas": map[string]interface{}{
|
|
|
|
|
"registry.terraform.io/hashicorp/test": map[string]interface{}{
|
|
|
|
|
"provider": map[string]interface{}{
|
|
|
|
|
"version": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"resource_schemas": map[string]interface{}{
|
|
|
|
|
"test_resource": map[string]interface{}{
|
|
|
|
|
"block": map[string]interface{}{
|
|
|
|
|
"attributes": map[string]interface{}{
|
|
|
|
|
"value": map[string]interface{}{
|
|
|
|
|
"description_kind": "plain",
|
|
|
|
|
"type": "string",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"description_kind": "plain",
|
|
|
|
|
},
|
|
|
|
|
"version": 0.0,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-07-19 04:07:46 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_plan",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
|
2023-07-19 04:07:46 -04:00
|
|
|
"verbose_apply": {
|
|
|
|
|
run: &moduletest.Run{
|
|
|
|
|
Name: "run_block",
|
|
|
|
|
Status: moduletest.Pass,
|
|
|
|
|
Config: &configs.TestRun{
|
|
|
|
|
Command: configs.ApplyTestCommand,
|
|
|
|
|
},
|
|
|
|
|
Verbose: &moduletest.Verbose{
|
|
|
|
|
Plan: &plans.Plan{}, // empty plan
|
|
|
|
|
State: states.BuildState(func(state *states.SyncState) {
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_resource",
|
|
|
|
|
Name: "creating",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{
|
|
|
|
|
AttrsJSON: []byte(`{"value":"foobar"}`),
|
|
|
|
|
},
|
|
|
|
|
addrs.AbsProviderConfig{
|
|
|
|
|
Module: addrs.RootModule,
|
|
|
|
|
Provider: addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}),
|
|
|
|
|
Config: &configs.Config{
|
|
|
|
|
Module: &configs.Module{},
|
|
|
|
|
},
|
|
|
|
|
Providers: map[addrs.Provider]providers.ProviderSchema{
|
|
|
|
|
addrs.Provider{
|
|
|
|
|
Hostname: addrs.DefaultProviderRegistryHost,
|
|
|
|
|
Namespace: "hashicorp",
|
|
|
|
|
Type: "test",
|
|
|
|
|
}: {
|
|
|
|
|
ResourceTypes: map[string]providers.Schema{
|
|
|
|
|
"test_resource": {
|
2025-03-04 10:33:43 -05:00
|
|
|
Body: &configschema.Block{
|
2023-07-19 04:07:46 -04:00
|
|
|
Attributes: map[string]*configschema.Attribute{
|
|
|
|
|
"value": {
|
|
|
|
|
Type: cty.String,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-10-02 03:14:20 -04:00
|
|
|
progress: moduletest.Complete,
|
2023-07-19 04:07:46 -04:00
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": " \"run_block\"... pass",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-07-19 04:07:46 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_run": map[string]interface{}{
|
2023-10-02 03:14:20 -04:00
|
|
|
"path": "main.tftest.hcl",
|
|
|
|
|
"run": "run_block",
|
|
|
|
|
"progress": "complete",
|
|
|
|
|
"status": "pass",
|
2023-07-19 04:07:46 -04:00
|
|
|
},
|
|
|
|
|
"type": "test_run",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"@level": "info",
|
|
|
|
|
"@message": "-verbose flag enabled, printing state",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-07-19 04:07:46 -04:00
|
|
|
"@testrun": "run_block",
|
|
|
|
|
"test_state": map[string]interface{}{
|
2023-08-28 04:25:29 -04:00
|
|
|
"state_format_version": "1.0",
|
|
|
|
|
"provider_format_version": "1.0",
|
2023-08-31 05:45:52 -04:00
|
|
|
"root_module": map[string]interface{}{
|
2023-08-28 04:25:29 -04:00
|
|
|
"resources": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"address": "test_resource.creating",
|
|
|
|
|
"mode": "managed",
|
|
|
|
|
"name": "creating",
|
|
|
|
|
"provider_name": "registry.terraform.io/hashicorp/test",
|
|
|
|
|
"schema_version": 0.0,
|
|
|
|
|
"sensitive_values": map[string]interface{}{},
|
|
|
|
|
"type": "test_resource",
|
|
|
|
|
"values": map[string]interface{}{
|
|
|
|
|
"value": "foobar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"provider_schemas": map[string]interface{}{
|
|
|
|
|
"registry.terraform.io/hashicorp/test": map[string]interface{}{
|
|
|
|
|
"provider": map[string]interface{}{
|
|
|
|
|
"version": 0.0,
|
|
|
|
|
},
|
|
|
|
|
"resource_schemas": map[string]interface{}{
|
|
|
|
|
"test_resource": map[string]interface{}{
|
|
|
|
|
"block": map[string]interface{}{
|
|
|
|
|
"attributes": map[string]interface{}{
|
|
|
|
|
"value": map[string]interface{}{
|
|
|
|
|
"description_kind": "plain",
|
|
|
|
|
"type": "string",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"description_kind": "plain",
|
2023-07-19 04:07:46 -04:00
|
|
|
},
|
2023-08-28 04:25:29 -04:00
|
|
|
"version": 0.0,
|
2023-07-19 04:07:46 -04:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_state",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2023-06-28 03:30:29 -04:00
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
2023-07-20 10:57:05 -04:00
|
|
|
file := &moduletest.File{Name: "main.tftest.hcl"}
|
2023-06-28 03:30:29 -04:00
|
|
|
|
2023-10-02 03:14:20 -04:00
|
|
|
view.Run(tc.run, file, tc.progress, tc.elapsed)
|
2023-07-19 04:07:46 -04:00
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want, cmp.FilterPath(func(path cmp.Path) bool {
|
|
|
|
|
return strings.Contains(path.Last().String(), "version") || strings.Contains(path.Last().String(), "timestamp")
|
|
|
|
|
}, cmp.Ignore()))
|
2023-06-28 03:30:29 -04:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-19 04:07:46 -04:00
|
|
|
|
2023-07-19 04:31:32 -04:00
|
|
|
func TestTestJSON_FatalInterruptSummary(t *testing.T) {
|
|
|
|
|
tcs := map[string]struct {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states map[string]*states.State
|
2023-07-19 04:31:32 -04:00
|
|
|
changes []*plans.ResourceInstanceChangeSrc
|
|
|
|
|
want []map[string]interface{}
|
|
|
|
|
}{
|
|
|
|
|
"no_state_only_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: make(map[string]*states.State),
|
2023-07-19 04:31:32 -04:00
|
|
|
changes: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Terraform was interrupted during test execution, and may not have performed the expected cleanup operations.",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-08-24 10:14:49 -04:00
|
|
|
"@testrun": "run_block",
|
2023-07-19 04:31:32 -04:00
|
|
|
"test_interrupt": map[string]interface{}{
|
|
|
|
|
"planned": []interface{}{
|
|
|
|
|
"test_instance.one",
|
|
|
|
|
"test_instance.two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_interrupt",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"file_state_no_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
configs.TestMainStateIdentifier: states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
changes: nil,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Terraform was interrupted during test execution, and may not have performed the expected cleanup operations.",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-08-24 10:14:49 -04:00
|
|
|
"@testrun": "run_block",
|
2023-07-19 04:31:32 -04:00
|
|
|
"test_interrupt": map[string]interface{}{
|
|
|
|
|
"state": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.one",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_interrupt",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"run_states_no_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
"../setup": states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
changes: nil,
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Terraform was interrupted during test execution, and may not have performed the expected cleanup operations.",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-08-24 10:14:49 -04:00
|
|
|
"@testrun": "run_block",
|
2023-07-19 04:31:32 -04:00
|
|
|
"test_interrupt": map[string]interface{}{
|
|
|
|
|
"states": map[string]interface{}{
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
"../setup": []interface{}{
|
2023-07-19 04:31:32 -04:00
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.one",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_interrupt",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"all_states_with_plan": {
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
states: map[string]*states.State{
|
|
|
|
|
"../setup": states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "setup_one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "setup_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
configs.TestMainStateIdentifier: states.BuildState(func(state *states.SyncState) {
|
2023-07-19 04:31:32 -04:00
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
|
|
|
|
|
state.SetResourceInstanceCurrent(
|
|
|
|
|
addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&states.ResourceInstanceObjectSrc{},
|
|
|
|
|
addrs.AbsProviderConfig{})
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
changes: []*plans.ResourceInstanceChangeSrc{
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "new_one",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Addr: addrs.AbsResourceInstance{
|
|
|
|
|
Module: addrs.RootModuleInstance,
|
|
|
|
|
Resource: addrs.ResourceInstance{
|
|
|
|
|
Resource: addrs.Resource{
|
|
|
|
|
Mode: addrs.ManagedResourceMode,
|
|
|
|
|
Type: "test_instance",
|
|
|
|
|
Name: "new_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ChangeSrc: plans.ChangeSrc{
|
|
|
|
|
Action: plans.Create,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
want: []map[string]interface{}{
|
|
|
|
|
{
|
|
|
|
|
"@level": "error",
|
|
|
|
|
"@message": "Terraform was interrupted during test execution, and may not have performed the expected cleanup operations.",
|
|
|
|
|
"@module": "terraform.ui",
|
2023-07-20 10:57:05 -04:00
|
|
|
"@testfile": "main.tftest.hcl",
|
2023-08-24 10:14:49 -04:00
|
|
|
"@testrun": "run_block",
|
2023-07-19 04:31:32 -04:00
|
|
|
"test_interrupt": map[string]interface{}{
|
|
|
|
|
"state": []interface{}{
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.one",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"states": map[string]interface{}{
|
Implement controlling destroy functionality within Terraform Test (#37359)
* Add ability to parse backend blocks present in a test file's run blocks, validate configuration (#36541)
* Add ability to parse backend blocks from a run block
* Add validation to avoid multiple backend blocks across run blocks that use the same internal state file. Update tests.
* Add validation to avoid multiple backend blocks within a single run block. Update tests.
* Remove use of quotes in diagnostic messages
* Add validation to avoid backend blocks being used in plan run blocks. Update tests.
* Correct local backend blocks in new test fixtures
* Add test to show that different test files can use same backend block for same state key.
* Add validation to enforce state-storage backend types are used
* Remove TODO comment
We only need to consider one file at a time when checking if a state_key already has a backend associated with it; parallelism in `terraform test` is scoped down to individual files.
* Add validation to assert that the backend block must be in the first apply command for an internal state
* Consolidate backend block validation inside a single if statement
* Add initial version of validation that ensures a backend isn't re-used within a file
* Explicitly set the state_key at the point of parsing the config
TODO: What should be done with method (moduletest.Run).GetStateKey?
* Update test fixture now that reusing backend configs has been made invalid
* Add automated test showing validation of reused configuration blocks
* Skip test due to flakiness, minor change to test config naming
* Update test so it tolerates non-deterministic order run blocks are evaluated in
* Remove unnecessary value assignment to r.StateKey
* Replace use of GetStateKey() with accessing the state key that's now set during test config parsing
* Fix bug so that run blocks using child modules get the correct state key set at parsing time
* Update acceptance test to also cover scenario where root and child module state keys are in use
* Update test name
* Add newline to regex
* Ensure consistent place where repeat backend error is raised from
* Write leftover test state(s) to file (#36614)
* Add additional validation that the backend used in a run is a supported type (#36648)
* Prevent test run when leftover state data is present (#36685)
* `test`: Set the initial state for a state files from a backend, allow the run that defines a backend to write state to the backend (#36646)
* Allow use of backend block to set initial state for a state key
* Note about alternative place to keep 'backend factories'
* Allow the run block defining the backend to write state to it
* Fix rebase
* Change to accessing backend init functions via ContextOpts
* Add tests demonstrating how runs containing backend blocks use and update persisted state
* Fix test fixture
* Address test failure due to trouble opening the state file
This problem doesn't happen on MacOS, so I assume is due to the Linux environment of GitHub runners.
* Fix issue with paths properly
I hope
* Fix defect in test assertion
* Pivot back to approach introduced in 4afc3d7
* Let failing tests write to persistent state, add test case covering that.
I split the acceptance tests into happy/unhappy paths for this, which required some of the helper functions' declarations to be raised up to package-level.
* Change how we update internal state files, so that information about the associated backend is never lost
* Fix UpdateStateFile
* Ensure that the states map set by TestStateTransformer associates a backend with the correct run.
* Misc spelling fixes in comments and a log
* Replace state get/set functions with existing helpers (#36747)
* Replace state get/set functions with existing helpers
* Compare to string representation of state
* Compare to string representation of state
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* Add validation to enforce skip_cleanup=false cannot be used with backend blocks (#36857)
* Integrate use of backend blocks in tests with skip_cleanup feature (#36848)
* Fix nil pointer error, update test to not be table-driven
* Make using a backend block implicitly set skip_cleanup to true
* Stop state artefacts being created when a backend is in use and no cleanup errors have occurred
* Return diagnostics so calling code knows if cleanup experienced issues or not
* Update tests to show that when cleanup fails a state artefact is created
* Add comment about why diag not returned
* Bug fix - actually pull in the state from the state manager!
* Split and simplify (?) tests to show the backend block can create and/or reuse prior state
* Update test to use new fixtures, assert about state artefact. Fix nil pointer
* Update test fixture in use, add guardrail for flakiness of forced error during cleanup
* Refactor so resource ID set in only one place
* Add documentation for using a `backend` block during `test` (#36832)
* Add backend as a documented block in a run block
* Add documentation about backend blocks in run blocks.
* Make the relationship between backends and state keys more clear, other improvements
* More test documentation (#36838)
* Terraform Test: cleanup command (#36847)
* Allow cleanup of states that depend on prior runs outputs (#36902)
* terraform test: refactor graph edge calculation
* create fake run block nodes during cleanup operation
* tidy up TODOs
* fix tests
* remove old changes
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* Improve diagnostics around skip_cleanup conflicts (#37385)
* Improve diagnostics around skip_cleanup conflicts
* remove unused dynamic node
* terraform test: refactor manifest file for simplicity (#37412)
* test: refactor apply and plan functions so no run block is needed
* terraform test: write and load state manifest files
* Terraform Test: Allow skipping cleanup of entire test file or individual run blocks (#36729)
* terraform test: add support for skip_cleanup attr
* terraform test: add cleanup command
* terraform test: add backend blocks
* pause
* fix tests
* remove commented code
* terraform test: make controlling destroy functionality experimental (#37419)
* address comments
* Update internal/moduletest/graph/node_state_cleanup.go
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
---------
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
* add experimental changelog entries
---------
Co-authored-by: Sarah French <15078782+SarahFrench@users.noreply.github.com>
Co-authored-by: Samsondeen <40821565+dsa0x@users.noreply.github.com>
Co-authored-by: Samsondeen Dare <samsondeen.dare@hashicorp.com>
2025-09-10 11:22:20 -04:00
|
|
|
"../setup": []interface{}{
|
2023-07-19 04:31:32 -04:00
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.setup_one",
|
|
|
|
|
},
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"instance": "test_instance.setup_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"planned": []interface{}{
|
|
|
|
|
"test_instance.new_one",
|
|
|
|
|
"test_instance.new_two",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"type": "test_interrupt",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for name, tc := range tcs {
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
|
|
|
view := NewTest(arguments.ViewJSON, NewView(streams))
|
|
|
|
|
|
2023-07-20 10:57:05 -04:00
|
|
|
file := &moduletest.File{Name: "main.tftest.hcl"}
|
2023-07-19 04:31:32 -04:00
|
|
|
run := &moduletest.Run{Name: "run_block"}
|
|
|
|
|
|
|
|
|
|
view.FatalInterruptSummary(run, file, tc.states, tc.changes)
|
|
|
|
|
testJSONViewOutputEquals(t, done(t).All(), tc.want)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-19 04:07:46 -04:00
|
|
|
func dynamicValue(t *testing.T, value cty.Value, typ cty.Type) plans.DynamicValue {
|
|
|
|
|
d, err := plans.NewDynamicValue(value, typ)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to create dynamic value: %s", err)
|
|
|
|
|
}
|
|
|
|
|
return d
|
|
|
|
|
}
|