diff --git a/util/httputil/query.go b/util/httputil/query.go index a36b0bb..30d956f 100644 --- a/util/httputil/query.go +++ b/util/httputil/query.go @@ -63,6 +63,16 @@ func StringToBool(value string, defaultValue bool) bool { return defaultValue } +// Float64Query retrieves the given query parameter from the query as a float64. Returns the default value if the query +func Float64Query(query url.Values, name string, defaultValue float64) float64 { + str := query.Get(name) + res, err := strconv.ParseFloat(str, 64) + if err != nil { + return defaultValue + } + return res +} + // DurationQuery retrieves the given query parameter from the query as a string. Returns the default value if the query // parameter does not exist. func DurationQuery(query url.Values, name string, unit duration.Spec, defaultValue duration.Spec) duration.Spec { diff --git a/util/httputil/query_test.go b/util/httputil/query_test.go new file mode 100644 index 0000000..d53e6de --- /dev/null +++ b/util/httputil/query_test.go @@ -0,0 +1,84 @@ +package httputil + +import ( + "net/url" + "testing" + + "github.com/eluv-io/common-go/format/duration" + "github.com/stretchr/testify/assert" +) + +func TestStringQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "value") + query.Add("key2", "value2") + + assert.Equal(t, "value", StringQuery(query, "key", "default")) + assert.Equal(t, "default", StringQuery(query, "key3", "default")) +} + +func TestBoolQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "true") + query.Add("key2", "false") + + assert.True(t, BoolQuery(query, "key", false)) + assert.False(t, BoolQuery(query, "key2", true)) + assert.True(t, BoolQuery(query, "key3", true)) +} + +func TestArrayQueryWithSplit(t *testing.T) { + query := url.Values{} + query.Add("key", "value1,value2") + assert.Equal(t, []string{"value1", "value2"}, ArrayQueryWithSplit(query, "key", ",")) +} + +func TestIntQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "123") + query.Add("key2", "abc") + + assert.Equal(t, 123, IntQuery(query, "key", 0)) + assert.Equal(t, 0, IntQuery(query, "key2", 0)) + assert.Equal(t, 0, IntQuery(query, "key3", 0)) +} + +func TestStringToBool(t *testing.T) { + assert.True(t, StringToBool("true", false)) + assert.True(t, StringToBool("t", false)) + assert.True(t, StringToBool("yes", false)) + assert.True(t, StringToBool("y", false)) + assert.True(t, StringToBool("1", false)) + assert.True(t, StringToBool("", false)) + + assert.False(t, StringToBool("false", false)) + assert.False(t, StringToBool("f", false)) + assert.False(t, StringToBool("no", false)) +} + +func TestFloatQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "123.45") + query.Add("key2", "abc") + + assert.Equal(t, 123.45, Float64Query(query, "key", 0)) + assert.Equal(t, 0.0, Float64Query(query, "key2", 0)) + assert.Equal(t, 0.0, Float64Query(query, "key3", 0)) +} + +func TestDurationQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "1h") + query.Add("key2", "abc") + + assert.Equal(t, duration.Spec(3600000000000), DurationQuery(query, "key", duration.Parse("1h", "0"), duration.Parse("0", "0"))) + assert.Equal(t, duration.Spec(0), DurationQuery(query, "key2", duration.Parse("1h", "0"), duration.Parse("0", "0"))) + assert.Equal(t, duration.Spec(0), DurationQuery(query, "key3", duration.Parse("1h", "0"), duration.Parse("0", "0"))) +} + +func TestUintPtrQuery(t *testing.T) { + query := url.Values{} + query.Add("key", "123") + query.Add("key2", "abc") + assert.Equal(t, uint(123), *UintPtrQuery(query, "key")) +}