224 lines
5.2 KiB
Go
224 lines
5.2 KiB
Go
package tmpl
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestReadFile(t *testing.T) {
|
|
expected := `foo:
|
|
bar: BAR
|
|
`
|
|
expectedFilename := "values.yaml"
|
|
ctx := &Context{basePath: ".", readFile: func(filename string) ([]byte, error) {
|
|
if filename != expectedFilename {
|
|
return nil, fmt.Errorf("unexpected filename: expected=%v, actual=%s", expectedFilename, filename)
|
|
}
|
|
return []byte(expected), nil
|
|
}}
|
|
actual, err := ctx.ReadFile(expectedFilename)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestReadFile_PassAbsPath(t *testing.T) {
|
|
expected := `foo:
|
|
bar: BAR
|
|
`
|
|
expectedFilename, _ := filepath.Abs("values.yaml")
|
|
ctx := &Context{basePath: ".", readFile: func(filename string) ([]byte, error) {
|
|
if filename != expectedFilename {
|
|
return nil, fmt.Errorf("unexpected filename: expected=%v, actual=%s", expectedFilename, filename)
|
|
}
|
|
return []byte(expected), nil
|
|
}}
|
|
actual, err := ctx.ReadFile(expectedFilename)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestToYaml_UnsupportedNestedMapKey(t *testing.T) {
|
|
expected := ``
|
|
vals := Values(map[string]interface{}{
|
|
"foo": map[interface{}]interface{}{
|
|
"bar": "BAR",
|
|
},
|
|
})
|
|
actual, err := ToYaml(vals)
|
|
if err == nil {
|
|
t.Fatalf("expected error but got none")
|
|
} else if err.Error() != "error marshaling into JSON: json: unsupported type: map[interface {}]interface {}" {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestToYaml(t *testing.T) {
|
|
expected := `foo:
|
|
bar: BAR
|
|
`
|
|
vals := Values(map[string]interface{}{
|
|
"foo": map[string]interface{}{
|
|
"bar": "BAR",
|
|
},
|
|
})
|
|
actual, err := ToYaml(vals)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestFromYaml(t *testing.T) {
|
|
raw := `foo:
|
|
bar: BAR
|
|
`
|
|
expected := Values(map[string]interface{}{
|
|
"foo": map[string]interface{}{
|
|
"bar": "BAR",
|
|
},
|
|
})
|
|
actual, err := FromYaml(raw)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestFromYamlToJson(t *testing.T) {
|
|
input := `foo:
|
|
bar: BAR
|
|
`
|
|
want := `{"foo":{"bar":"BAR"}}`
|
|
|
|
m, err := FromYaml(input)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
got, err := json.Marshal(m)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
|
|
if d := cmp.Diff(want, string(got)); d != "" {
|
|
t.Errorf("unexpected result: want (-), got (+):\n%s", d)
|
|
}
|
|
}
|
|
|
|
func TestSetValueAtPath_OneComponent(t *testing.T) {
|
|
input := map[string]interface{}{
|
|
"foo": "",
|
|
}
|
|
expected := map[string]interface{}{
|
|
"foo": "FOO",
|
|
}
|
|
actual, err := SetValueAtPath("foo", "FOO", input)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestSetValueAtPath_TwoComponents(t *testing.T) {
|
|
input := map[string]interface{}{
|
|
"foo": map[interface{}]interface{}{
|
|
"bar": "",
|
|
},
|
|
}
|
|
expected := map[string]interface{}{
|
|
"foo": map[interface{}]interface{}{
|
|
"bar": "FOO_BAR",
|
|
},
|
|
}
|
|
actual, err := SetValueAtPath("foo.bar", "FOO_BAR", input)
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestTpl(t *testing.T) {
|
|
text := `foo: {{ .foo }}
|
|
`
|
|
expected := `foo: FOO
|
|
`
|
|
ctx := &Context{basePath: "."}
|
|
actual, err := ctx.Tpl(text, map[string]interface{}{"foo": "FOO"})
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("unexpected result: expected=%v, actual=%v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestRequired(t *testing.T) {
|
|
type args struct {
|
|
warn string
|
|
val interface{}
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want interface{}
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "required val is nil",
|
|
args: args{warn: "This value is required", val: nil},
|
|
want: nil,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "required val is empty string",
|
|
args: args{warn: "This value is required", val: ""},
|
|
want: nil,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "required val is existed",
|
|
args: args{warn: "This value is required", val: "foo"},
|
|
want: "foo",
|
|
wantErr: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
testCase := tt
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
got, err := Required(testCase.args.warn, testCase.args.val)
|
|
if (err != nil) != testCase.wantErr {
|
|
t.Errorf("Required() error = %v, wantErr %v", err, testCase.wantErr)
|
|
return
|
|
}
|
|
if !reflect.DeepEqual(got, testCase.want) {
|
|
t.Errorf("Required() got = %v, want %v", got, testCase.want)
|
|
}
|
|
})
|
|
}
|
|
}
|