mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-09 23:54:17 -06:00
385b17d679
The Exists function can run in a context where the contents of the template have changed, but it uses the old set of variables from the state. This means that when the set of variables changes, rendering will fail in Exists. This was returning an error, but really it just needs to be treated as a scenario where the template needs re-rendering. fixes #2344 and possibly a few other template issues floating around
102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package template
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
r "github.com/hashicorp/terraform/helper/resource"
|
|
"github.com/hashicorp/terraform/terraform"
|
|
)
|
|
|
|
var testProviders = map[string]terraform.ResourceProvider{
|
|
"template": Provider(),
|
|
}
|
|
|
|
func TestTemplateRendering(t *testing.T) {
|
|
var cases = []struct {
|
|
vars string
|
|
template string
|
|
want string
|
|
}{
|
|
{`{}`, `ABC`, `ABC`},
|
|
{`{a="foo"}`, `${a}`, `foo`},
|
|
{`{a="hello"}`, `${replace(a, "ello", "i")}`, `hi`},
|
|
{`{}`, `${1+2+3}`, `6`},
|
|
}
|
|
|
|
for _, tt := range cases {
|
|
r.Test(t, r.TestCase{
|
|
PreCheck: func() {
|
|
readfile = func(string) ([]byte, error) {
|
|
return []byte(tt.template), nil
|
|
}
|
|
},
|
|
Providers: testProviders,
|
|
Steps: []r.TestStep{
|
|
r.TestStep{
|
|
Config: testTemplateConfig(tt.vars),
|
|
Check: func(s *terraform.State) error {
|
|
got := s.RootModule().Outputs["rendered"]
|
|
if tt.want != got {
|
|
return fmt.Errorf("template:\n%s\nvars:\n%s\ngot:\n%s\nwant:\n%s\n", tt.template, tt.vars, got, tt.want)
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
// https://github.com/hashicorp/terraform/issues/2344
|
|
func TestTemplateVariableChange(t *testing.T) {
|
|
steps := []struct {
|
|
vars string
|
|
template string
|
|
want string
|
|
}{
|
|
{`{a="foo"}`, `${a}`, `foo`},
|
|
{`{b="bar"}`, `${b}`, `bar`},
|
|
}
|
|
|
|
var testSteps []r.TestStep
|
|
for i, step := range steps {
|
|
testSteps = append(testSteps, r.TestStep{
|
|
PreConfig: func(template string) func() {
|
|
return func() {
|
|
readfile = func(string) ([]byte, error) {
|
|
return []byte(template), nil
|
|
}
|
|
}
|
|
}(step.template),
|
|
Config: testTemplateConfig(step.vars),
|
|
Check: func(i int, want string) r.TestCheckFunc {
|
|
return func(s *terraform.State) error {
|
|
got := s.RootModule().Outputs["rendered"]
|
|
if want != got {
|
|
return fmt.Errorf("[%d] got:\n%q\nwant:\n%q\n", i, got, want)
|
|
}
|
|
return nil
|
|
}
|
|
}(i, step.want),
|
|
})
|
|
}
|
|
|
|
r.Test(t, r.TestCase{
|
|
Providers: testProviders,
|
|
Steps: testSteps,
|
|
})
|
|
}
|
|
|
|
func testTemplateConfig(vars string) string {
|
|
return `
|
|
resource "template_file" "t0" {
|
|
filename = "mock"
|
|
vars = ` + vars + `
|
|
}
|
|
output "rendered" {
|
|
value = "${template_file.t0.rendered}"
|
|
}
|
|
`
|
|
}
|