Terraform
Terraform Configuration
The configuration used during the execution of an acceptance test can be specified at the TestStep level by populating one of the following mutually exclusive fields:
Terraform configuration can be used in conjunction with Terraform variables defined via TestStep.ConfigVariables.
TestStep Config
The TestStep.Config field accepts a string containing valid Terraform configuration.
In the following example, the Config field specifies a resource which is used in combination with ExternalProviders to specify the version and source for the provider:
func TestAccResourcePassword_UpgradeFromVersion3_2_0(t *testing.T) {
    resource.Test(t, resource.TestCase{
        Steps: []resource.TestStep{
            {
                ExternalProviders: map[string]resource.ExternalProvider{
                    "random": {
                        VersionConstraint: "3.2.0",
                        Source:            "hashicorp/random",
                    },
                },
                Config: `resource "random_password" "min" {
                            length = 12
                            override_special = "!#@"
                            min_lower = 2
                            min_upper = 3
                            min_special = 1
                            min_numeric = 4
                        }`,
                        
TestStep ConfigDirectory
The TestStep.ConfigDirectory field accepts a TestStepConfigFunc which is a function that accepts a TestStepConfigRequest and returns a string containing a path to a directory containing Terraform configuration files. The path can be a relative or absolute path.
There are helper methods available for generating a TestStepConfigFunc including:
Note: TestStep.ExternalProviders cannot be specified when using ConfigDirectory. It is expected that required_providers are defined within the configuration files.
Custom functions can be written and used in the TestStep.ConfigDirectory field as long as the function is a TestStepConfigFunc type.
StaticDirectory
The StaticDirectory(directory string) function accepts a string specifying a path to a directory containing Terraform configuration.
For example:
func Test_ConfigDirectory_StaticDirectory(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigDirectory: config.StaticDirectory(`testdata/directory_containing_config`),
                /* ... */
            },
        },
    })
}
In this instance, the testing configuration is expected to be in the testdata/directory_containing_config directory relative to the file containing the Test_ConfigDirectory_StaticDirectory test.
TestNameDirectory
The TestNameDirectory() function will use the name of the executing test to specify a path to a directory containing Terraform configuration.
For example:
func Test_ConfigDirectory_TestNameDirectory(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigDirectory: config.TestNameDirectory(),
                /* ... */
            },
        },
    })
}
In this instance, the testing configuration is expected to be in the testdata/Test_ConfigDirectory_TestNameDirectory directory relative to the file containing the Test_ConfigDirectory_TestNameDirectory test.
TestStepDirectory
The TestStepDirectory() function will use the name of the executing test and the current test step number to specify a path to a directory containing Terraform configuration.
For example:
func Test_ConfigDirectory_TestStepDirectory(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigDirectory: config.TestStepDirectory(),
                /* ... */
            },
        },
    })
}
In this instance, because this is the first test step in the test, the testing configuration is expected to be in the testdata/Test_ConfigDirectory_TestStepDirectory/1 directory relative to the file containing the Test_ConfigDirectory_TestStepDirectory test.
TestStep ConfigFile
The TestStep.ConfigFile field accepts a TestStepConfigFunc which is a function that accepts a TestStepConfigRequest and returns a string containing a path to a file containing Terraform configuration. The path can be a relative or absolute path.
There are helper methods available for generating a TestStepConfigFunc including:
Note: TestStep.ExternalProviders cannot be specified when using ConfigFile. It is expected that required_providers are defined within the configuration file.
Custom functions can be written and used in the TestStep.ConfigFile field as long as the function is a TestStepConfigFunc type.
StaticFile
The StaticFile(file string) function accepts a string specifying a path to a file containing Terraform configuration.
For example:
func Test_ConfigFile_StaticFile(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigFile: config.StaticFile(`testdata/directory_containing_config/main.tf`),
                /* ... */
            },
        },
    })
}
In this instance, the testing configuration is expected to be in the testdata/directory_containing_config/main.tf file relative to the file containing the Test_ConfigFile_StaticFile test.
TestNameFile
The TestNameFile(file string) function will use the name of the executing test to specify a path to a file containing Terraform configuration.
For example:
func Test_ConfigFile_TestNameFile(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigFile: config.TestNameFile("main.tf"),
                /* ... */
            },
        },
    })
}
In this instance, the testing configuration is expected to be in the testdata/Test_ConfigFile_TestNameFile directory relative to the file containing the Test_ConfigFile_TestNameFile test.
TestStepFile
The TestStepFile(file string) function will use the name of the executing test and the current test step number to specify a path to a file containing Terraform configuration.
For example:
func Test_ConfigFile_TestStepFile(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigFile: config.TestStepFile("main.tf"),
                /* ... */
            },
        },
    })
}
In this instance, because this is the first test step in the test, the testing configuration is expected to be in the testdata/Test_ConfigFile_TestStepFile/1/main.tf file relative to the file containing the Test_ConfigDirectory_TestNameDirectory test.
TestStep ConfigVariables
Terraform input variables allow customization of a Terraform configuration without altering the configuration itself.
The TestStep.ConfigVariables field accepts a Variables type which is a key-value map of string to Variable.
The following functions return types implementing Variable that correlate with the Terraform type constraints:
- BoolVariable(value bool)
- FloatVariable[T constraints.Float](value T)
- IntegerVariable[T constraints.Integer](value T)
- func ListVariable(value ...Variable)
- MapVariable(value map[string]Variable)
- ObjectVariable(value map[string]Variable)
- SetVariable(value ...Variable)
- StringVariable(value string)
- TupleVariable(value ...Variable)
The following example shows the usage of TestStep.ConfigVariables in conjunction with TestStep.ConfigFile:
func Test_ConfigFile_TestNameFile(t *testing.T) {
    t.Parallel()
    Test(t, TestCase{
        Steps: []TestStep{
            {
                ConfigFile: config.TestNameFile("random.tf"),
                ConfigVariables: config.Variables{
                    "length":  config.IntegerVariable(8),
                    "numeric": config.BoolVariable(false),
                },
                /* ... */
            },
        },
    })
}
The configuration would be expected to be in the testdata/Test_ConfigFile_TestNameFile/random.tf file, for example:
terraform {
  required_providers {
    random = {
      source = "registry.terraform.io/hashicorp/random"
      version = "3.5.1"
    }
  }
}
provider "random" {}
resource "random_password" "test" {
  length = var.length
  numeric = var.numeric
}
variable "length" {
  type = number
}
variable "numeric" {
  type = bool
}