Skip to content
This repository was archived by the owner on Mar 17, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 59 additions & 11 deletions engines/terraform/resolve_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,13 @@ func TestResolveTokenValue(t *testing.T) {

func TestResolveStringInterpolation(t *testing.T) {
tests := []struct {
name string
input string
setupVars map[string]string
expected string
expectError bool
errorMsg string
name string
input string
setupVars map[string]string
setupGlobalVars map[string]string
expectedTokens []string
expectError bool
errorMsg string
}{
{
name: "string with two tokens",
Expand All @@ -410,7 +411,8 @@ func TestResolveStringInterpolation(t *testing.T) {
"var1-middle": "value1",
"var2-suffix": "value2",
},
expectError: false,
expectedTokens: []string{"self.var1-middle", "self.var2-suffix"},
expectError: false,
},
{
name: "string with adjacent tokens",
Expand All @@ -419,23 +421,26 @@ func TestResolveStringInterpolation(t *testing.T) {
"var1": "value1",
"var2": "value2",
},
expectError: false,
expectedTokens: []string{"self.var1", "self.var2"},
expectError: false,
},
{
name: "string with token at start",
input: "self.var1-suffix",
setupVars: map[string]string{
"var1-suffix": "value1",
},
expectError: false,
expectedTokens: []string{"self.var1-suffix"},
expectError: false,
},
{
name: "string with token at end",
input: "prefix-self.var1",
setupVars: map[string]string{
"var1": "value1",
},
expectError: false,
expectedTokens: []string{"self.var1"},
expectError: false,
},
{
name: "string with ${} wrapped tokens",
Expand All @@ -444,7 +449,32 @@ func TestResolveStringInterpolation(t *testing.T) {
"var1": "value1",
"var2": "value2",
},
expectError: false,
expectedTokens: []string{"self.var1", "self.var2"},
expectError: false,
},
{
name: "string with coalesce function",
input: "${coalesce(self.project_id, var.project_id)}",
setupVars: map[string]string{
"project_id": "test-project-123",
},
setupGlobalVars: map[string]string{
"project_id": "global-project",
},
expectedTokens: []string{"self.project_id", "var.project_id"},
expectError: false,
},
{
name: "string with ternary operator",
input: "${self.env != null ? self.env : var.env}",
setupVars: map[string]string{
"env": "production",
},
setupGlobalVars: map[string]string{
"env": "staging",
},
expectedTokens: []string{"self.env", "self.env", "var.env"},
expectError: false,
},
}

Expand All @@ -459,6 +489,15 @@ func TestResolveStringInterpolation(t *testing.T) {
instancedTerraformVariables: make(map[string]map[string]cdktf.TerraformVariable),
}

for varName, varValue := range tt.setupGlobalVars {
if td.terraformVariables == nil {
td.terraformVariables = make(map[string]cdktf.TerraformVariable)
}
td.terraformVariables[varName] = cdktf.NewTerraformVariable(stack, jsii.String(varName), &cdktf.TerraformVariableConfig{
Default: varValue,
})
}

td.instancedTerraformVariables["test_intent"] = make(map[string]cdktf.TerraformVariable)
for varName, varValue := range tt.setupVars {
td.instancedTerraformVariables["test_intent"][varName] = cdktf.NewTerraformVariable(stack, jsii.String("test_"+varName), &cdktf.TerraformVariableConfig{
Expand All @@ -467,6 +506,15 @@ func TestResolveStringInterpolation(t *testing.T) {
}

tokens := findAllTokens(tt.input)

// Extract token strings from TokenMatch for comparison
tokenStrings := make([]string, len(tokens))
for i, token := range tokens {
tokenStrings[i] = token.Token
}

assert.Equal(t, tt.expectedTokens, tokenStrings, "tokens found do not match expected")

result, err := td.resolveStringInterpolation("test_intent", tt.input, tokens)

if tt.expectError {
Expand Down
4 changes: 2 additions & 2 deletions engines/terraform/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,5 @@ func isOnlyToken(input string) bool {
return strings.TrimSpace(input) == strings.TrimSpace(allTokensPattern.FindString(input))
}

var tokenPattern = regexp.MustCompile(`((?:infra|var|self)\.[\w.\-]+)`)
var allTokensPattern = regexp.MustCompile(`((?:infra|var|self)\.[\w.\-]+)`)
var tokenPattern = regexp.MustCompile(`((?:infra|var|self)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`)
var allTokensPattern = regexp.MustCompile(`((?:infra|var|self)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`)