diff --git a/framework/h/qs.go b/framework/h/qs.go index 75fad83..996cf8e 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -14,7 +14,7 @@ func NewQs(pairs ...string) *Qs { m: make(map[string]string), } if len(pairs)%2 != 0 { - return q + pairs = append(pairs, "") } for i := 0; i < len(pairs); i++ { q.m[pairs[i]] = pairs[i+1] @@ -38,8 +38,10 @@ func (q *Qs) ToString() string { index := 0 for k, v := range q.m { builder.WriteString(k) - builder.WriteString("=") - builder.WriteString(v) + if v != "" { + builder.WriteString("=") + builder.WriteString(v) + } if index < len(q.m)-1 { builder.WriteString("&") } diff --git a/framework/h/qs_test.go b/framework/h/qs_test.go new file mode 100644 index 0000000..31067fd --- /dev/null +++ b/framework/h/qs_test.go @@ -0,0 +1,49 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func assertHas(t *testing.T, qs *Qs, key string, value string) { + str := qs.ToString() + if value == "" { + assert.Contains(t, str, key) + assert.NotContains(t, str, key+"=") + } else { + assert.Contains(t, str, key+"="+value) + } +} + +func TestQs(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c") + assertHas(t, qs, "a", "b") + assertHas(t, qs, "c", "") + + qs2 := NewQs("a", "b", "c", "d") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + + qs2.Add("e", "f") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + assertHas(t, qs2, "e", "f") + + qs2.Remove("e") + assert.NotContains(t, qs2.ToString(), "e") +} + +func TestSetQsOnUrl(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c", "d") + set := SetQueryParams("https://example.com/path", qs) + assert.Equal(t, "https://example.com/path?a=b&c=d", set) +} + +func TestSetQsOnUrlWithDelete(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b2", "c", "") + set := SetQueryParams("https://example.com/path?a=b&c=d", qs) + assert.Equal(t, "https://example.com/path?a=b2", set) +}