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
}