diff --git a/.gitignore b/.gitignore index 5722f21..810858c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ _obj _test .idea +vendor # Architecture specific extensions/prefixes *.[568vq] @@ -28,3 +29,6 @@ _testmain.go # Created by .ignore support plugin (hsz.mobi) dockerize + +# Test coverage related files +coverage.out \ No newline at end of file diff --git a/go.mod b/go.mod index 3cb1378..ed6f43b 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 github.com/hpcloud/tail v1.0.0 github.com/jwilder/gojq v0.0.0-20161018055142-c550732d4a52 + github.com/stretchr/testify v1.11.1 golang.org/x/net v0.48.0 ) @@ -13,16 +14,19 @@ require ( dario.cat/mergo v1.0.2 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/elgs/gosplitargs v0.0.0-20241205072753-cbd889c0f906 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/spf13/cast v1.9.2 // indirect golang.org/x/crypto v0.46.0 // indirect golang.org/x/sys v0.39.0 // indirect gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b2cdb0a..87da2ef 100644 --- a/go.sum +++ b/go.sum @@ -40,14 +40,16 @@ github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..57f41d4 --- /dev/null +++ b/main_test.go @@ -0,0 +1,148 @@ +package main + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMain(m *testing.M) { + os.Exit(m.Run()) +} + +func TestSliceVarString(t *testing.T) { + var sv sliceVar + sv.Set("test1") + sv.Set("test2") + result := sv.String() + assert.Equal(t, "test1,test2", result) +} + +func TestHostFlagsVarString(t *testing.T) { + var hf hostFlagsVar + hf.Set("host1") + hf.Set("host2") + result := hf.String() + assert.Equal(t, "[host1 host2]", result) +} + +func TestExists(t *testing.T) { + tempFile, err := os.CreateTemp("", "test-exists") + assert.NoError(t, err) + defer os.Remove(tempFile.Name()) + + existsResult, err := exists(tempFile.Name()) + assert.NoError(t, err) + assert.True(t, existsResult) + + nonExisting := "/path/that/does/not/exist" + existsResult, err = exists(nonExisting) + assert.NoError(t, err) + assert.False(t, existsResult) +} + +func TestContains(t *testing.T) { + testMap := map[string]string{ + "key1": "value1", + "key2": "value2", + } + + assert.True(t, contains(testMap, "key1")) + assert.True(t, contains(testMap, "key2")) + assert.False(t, contains(testMap, "key3")) +} + +func TestDefaultValue(t *testing.T) { + result, err := defaultValue("test-value") + assert.NoError(t, err) + assert.Equal(t, "test-value", result) + + result, err = defaultValue("test-value", "default-value") + assert.NoError(t, err) + assert.Equal(t, "test-value", result) + + result, err = defaultValue(nil, "default-value") + assert.NoError(t, err) + assert.Equal(t, "default-value", result) + + _, err = defaultValue(nil, nil) + assert.Error(t, err) + + _, err = defaultValue() + assert.Error(t, err) +} + +func TestParseUrl(t *testing.T) { + url := parseUrl("http://example.com/path") + assert.Equal(t, "http", url.Scheme) + assert.Equal(t, "example.com", url.Host) + assert.Equal(t, "/path", url.Path) + + url = parseUrl("https://api.example.com:8080/v1/users") + assert.Equal(t, "https", url.Scheme) + assert.Equal(t, "api.example.com:8080", url.Host) + assert.Equal(t, "/v1/users", url.Path) +} + +func TestAdd(t *testing.T) { + result := add(5, 3) + assert.Equal(t, 8, result) + + result = add(-1, 1) + assert.Equal(t, 0, result) + + result = add(0, 0) + assert.Equal(t, 0, result) +} + +func TestIsTrue(t *testing.T) { + assert.True(t, isTrue("true")) + assert.True(t, isTrue("TRUE")) + assert.True(t, isTrue("1")) + assert.True(t, isTrue("yes")) + assert.True(t, isTrue("on")) + + assert.False(t, isTrue("false")) + assert.False(t, isTrue("FALSE")) + assert.False(t, isTrue("0")) + assert.False(t, isTrue("no")) + assert.False(t, isTrue("off")) + assert.False(t, isTrue("")) + assert.False(t, isTrue("invalid")) +} + +func TestLoop(t *testing.T) { + ch, err := loop(3) + assert.NoError(t, err) + + var result []int + for i := range ch { + result = append(result, i) + } + assert.Equal(t, []int{0, 1, 2}, result) + + ch, err = loop(2, 5) + assert.NoError(t, err) + + result = []int{} + for i := range ch { + result = append(result, i) + } + assert.Equal(t, []int{2, 3, 4}, result) + + ch, err = loop(0, 10, 2) + assert.NoError(t, err) + + result = []int{} + for i := range ch { + result = append(result, i) + } + assert.Equal(t, []int{0, 2, 4, 6, 8}, result) + + _, err = loop() + assert.Error(t, err) + + _, err = loop(1, 2, 3, 4) + assert.Error(t, err) +} diff --git a/template.go b/template.go index b36755b..4a25b9a 100644 --- a/template.go +++ b/template.go @@ -72,11 +72,19 @@ func add(arg1, arg2 int) int { } func isTrue(s string) bool { - b, err := strconv.ParseBool(strings.ToLower(s)) - if err == nil { - return b + lower := strings.ToLower(s) + switch lower { + case "true", "1", "yes", "on": + return true + case "false", "0", "no", "off": + return false + default: + b, err := strconv.ParseBool(lower) + if err == nil { + return b + } + return false } - return false } func jsonQuery(jsonObj string, query string) (interface{}, error) {