91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package resolver
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestSubstituteInputs(t *testing.T) {
|
||
|
|
cases := []struct {
|
||
|
|
name string
|
||
|
|
data string
|
||
|
|
inputs map[string]any
|
||
|
|
want string
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
name: "simple substitution",
|
||
|
|
data: `stage: $[[ inputs.STAGE ]]`,
|
||
|
|
inputs: map[string]any{"STAGE": "deploy"},
|
||
|
|
want: `stage: deploy`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "default string used when key absent",
|
||
|
|
data: `image: $[[ inputs.IMAGE | default('ubuntu:22.04') ]]`,
|
||
|
|
inputs: map[string]any{},
|
||
|
|
want: `image: ubuntu:22.04`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "input overrides default",
|
||
|
|
data: `image: $[[ inputs.IMAGE | default('ubuntu:22.04') ]]`,
|
||
|
|
inputs: map[string]any{"IMAGE": "alpine:3.18"},
|
||
|
|
want: `image: alpine:3.18`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "integer input",
|
||
|
|
data: `variables:\n RETRIES: $[[ inputs.RETRY_COUNT ]]`,
|
||
|
|
inputs: map[string]any{"RETRY_COUNT": 3},
|
||
|
|
want: `variables:\n RETRIES: 3`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "boolean default",
|
||
|
|
data: `variables:\n ENABLED: $[[ inputs.ENABLE | default(true) ]]`,
|
||
|
|
inputs: map[string]any{},
|
||
|
|
want: `variables:\n ENABLED: true`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "numeric default",
|
||
|
|
data: `variables:\n COUNT: $[[ inputs.COUNT | default(5) ]]`,
|
||
|
|
inputs: map[string]any{},
|
||
|
|
want: `variables:\n COUNT: 5`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "missing key no default becomes empty",
|
||
|
|
data: `script: $[[ inputs.CMD ]]`,
|
||
|
|
inputs: map[string]any{},
|
||
|
|
want: `script: `,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "no placeholders unchanged",
|
||
|
|
data: `stage: build`,
|
||
|
|
inputs: nil,
|
||
|
|
want: `stage: build`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "multiple placeholders in one document",
|
||
|
|
data: "stage: $[[ inputs.STAGE ]]\nimage: $[[ inputs.IMAGE | default('alpine') ]]",
|
||
|
|
inputs: map[string]any{"STAGE": "test"},
|
||
|
|
want: "stage: test\nimage: alpine",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "double-quoted default",
|
||
|
|
data: `image: $[[ inputs.IMAGE | default("debian:12") ]]`,
|
||
|
|
inputs: map[string]any{},
|
||
|
|
want: `image: debian:12`,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "whitespace inside brackets",
|
||
|
|
data: `stage: $[[ inputs.STAGE ]]`,
|
||
|
|
inputs: map[string]any{"STAGE": "build"},
|
||
|
|
want: `stage: build`,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range cases {
|
||
|
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
|
got := string(substituteInputs([]byte(tc.data), tc.inputs))
|
||
|
|
if got != tc.want {
|
||
|
|
t.Errorf("substituteInputs:\n got %q\n want %q", got, tc.want)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|