// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package template import ( "testing" "github.com/stretchr/testify/require" ) func TestInterpolateHIL(t *testing.T) { for name, test := range map[string]struct { in string vars map[string]string exp string // when lower=false expLower string // when lower=true ok bool }{ // valid HIL "empty": { "", map[string]string{}, "", "", true, }, "no vars": { "nothing", map[string]string{}, "nothing", "nothing", true, }, "just lowercase var": { "${item}", map[string]string{"item": "value"}, "value", "value", true, }, "just uppercase var": { "${item}", map[string]string{"item": "VaLuE"}, "VaLuE", "value", true, }, "lowercase var in middle": { "before ${item}after", map[string]string{"item": "value"}, "before valueafter", "before valueafter", true, }, "uppercase var in middle": { "before ${item}after", map[string]string{"item": "VaLuE"}, "before VaLuEafter", "before valueafter", true, }, "two vars": { "before ${item}after ${more}", map[string]string{"item": "value", "more": "xyz"}, "before valueafter xyz", "before valueafter xyz", true, }, "missing map val": { "${item}", map[string]string{"item": ""}, "", "", true, }, // "weird" HIL, but not technically invalid "just end": { "}", map[string]string{}, "}", "}", true, }, "var without start": { " item }", map[string]string{"item": "value"}, " item }", " item }", true, }, "two vars missing second start": { "before ${ item }after more }", map[string]string{"item": "value", "more": "xyz"}, "before valueafter more }", "before valueafter more }", true, }, // invalid HIL "just start": { "${", map[string]string{}, "", "", false, }, "backwards": { "}${", map[string]string{}, "", "", false, }, "no varname": { "${}", map[string]string{}, "", "", false, }, "missing map key": { "${item}", map[string]string{}, "", "", false, }, "var without end": { "${ item ", map[string]string{"item": "value"}, "", "", false, }, "two vars missing first end": { "before ${ item after ${ more }", map[string]string{"item": "value", "more": "xyz"}, "", "", false, }, } { test := test t.Run(name+" lower=false", func(t *testing.T) { out, err := InterpolateHIL(test.in, test.vars, false) if test.ok { require.NoError(t, err) require.Equal(t, test.exp, out) } else { require.NotNil(t, err) require.Equal(t, out, "") } }) t.Run(name+" lower=true", func(t *testing.T) { out, err := InterpolateHIL(test.in, test.vars, true) if test.ok { require.NoError(t, err) require.Equal(t, test.expLower, out) } else { require.NotNil(t, err) require.Equal(t, out, "") } }) } }