Search Apps Documentation Source Content File Folder Download Copy Actions Download

query_test.gno

3.81 Kb ยท 146 lines
  1package query
  2
  3import (
  4	"net/url"
  5	"testing"
  6
  7	"gno.land/p/nt/uassert"
  8	"gno.land/p/nt/urequire"
  9)
 10
 11func TestUpdateQueryValue(t *testing.T) {
 12	raw := "/blog?foo=bar"
 13	updated, err := UpdateQueryValue(raw, "foo", "baz")
 14	urequire.NoError(t, err, "no error")
 15	uassert.Equal(t, "/blog?foo=baz", updated)
 16}
 17
 18func TestUpdateQueryFirstValues(t *testing.T) {
 19	raw := "/blog?sort=alpha"
 20	updated, err := UpdateQueryFirstValues(raw, map[string]string{
 21		"sort":  "recent",
 22		"order": "asc",
 23	})
 24	urequire.NoError(t, err, "no error")
 25	expected1 := "/blog?order=asc&sort=recent"
 26	expected2 := "/blog?sort=recent&order=asc"
 27	if updated != expected1 && updated != expected2 {
 28		t.Errorf("got %s, expected %s or %s", updated, expected1, expected2)
 29	}
 30}
 31
 32func TestGetQueryValueFromURL(t *testing.T) {
 33	raw := "/blog?view=grid&sort=alpha"
 34	val, err := GetQueryValueFromURL("sort", raw)
 35	urequire.NoError(t, err, "no error")
 36	uassert.Equal(t, "alpha", val)
 37}
 38
 39func TestParseQueryFirstValuesMap(t *testing.T) {
 40	raw := "/blog?sort=alpha&order=desc"
 41	m, err := ParseQueryFirstValuesMap(raw)
 42	urequire.NoError(t, err, "no error")
 43	uassert.Equal(t, "alpha", m["sort"])
 44	uassert.Equal(t, "desc", m["order"])
 45}
 46
 47func TestDeleteQuery(t *testing.T) {
 48	raw := "/blog?sort=alpha&mode=grid"
 49	deleted, err := DeleteQuery(raw, "sort")
 50	urequire.NoError(t, err, "no error")
 51	uassert.Equal(t, "/blog?mode=grid", deleted)
 52}
 53
 54func TestMalformedURLHandling(t *testing.T) {
 55	_, err := ParseQueryFirstValuesMap(":::")
 56	urequire.Error(t, err)
 57
 58	_, err = UpdateQueryValue(":::", "a", "b")
 59	urequire.Error(t, err)
 60
 61	val, err := GetQueryValueFromURL("x", ":::")
 62	urequire.Error(t, err)
 63	urequire.Equal(t, "", val)
 64}
 65
 66func TestGetQueryValues(t *testing.T) {
 67	values := url.Values{
 68		"foo": {"1", "2"},
 69	}
 70	got := GetQueryValues(values, "foo")
 71	uassert.Equal(t, "1", got[0])
 72	uassert.Equal(t, "2", got[1])
 73}
 74
 75func TestGetQueryFirstValue(t *testing.T) {
 76	values := url.Values{
 77		"foo": {"1", "2"},
 78	}
 79	uassert.Equal(t, "1", GetQueryFirstValue(values, "foo"))
 80	uassert.Equal(t, "", GetQueryFirstValue(values, "bar")) // key doesn't exist
 81}
 82
 83func TestHasQueryKey(t *testing.T) {
 84	values := url.Values{
 85		"foo": {"1"},
 86	}
 87	uassert.Equal(t, true, HasQueryKey(values, "foo"))
 88	uassert.Equal(t, false, HasQueryKey(values, "bar"))
 89}
 90
 91func TestUpdateQueryValues(t *testing.T) {
 92	raw := "/blog?foo=bar"
 93	updated, err := UpdateQueryValues(raw, "foo", []string{"1", "2"})
 94	urequire.NoError(t, err, "no error")
 95	uassert.Equal(t, "/blog?foo=1&foo=2", updated)
 96}
 97
 98func TestUpdateQueryAllValues(t *testing.T) {
 99	raw := "/blog?foo=1"
100	updated, err := UpdateQueryAllValues(raw, map[string][]string{
101		"foo": {"2", "3"},
102		"bar": {"4"},
103	})
104	urequire.NoError(t, err, "no error")
105	// order may vary
106	expected1 := "/blog?bar=4&foo=2&foo=3"
107	expected2 := "/blog?foo=2&foo=3&bar=4"
108	if updated != expected1 && updated != expected2 {
109		t.Errorf("got %s, expected %s or %s", updated, expected1, expected2)
110	}
111}
112
113func TestSetQueries(t *testing.T) {
114	raw := "/blog?foo=1"
115	updated, err := SetQueries(raw, map[string]string{
116		"foo": "2",
117		"bar": "3",
118	})
119	urequire.NoError(t, err, "no error")
120	expected1 := "/blog?bar=3&foo=2"
121	expected2 := "/blog?foo=2&bar=3"
122	if updated != expected1 && updated != expected2 {
123		t.Errorf("got %s, expected %s or %s", updated, expected1, expected2)
124	}
125}
126
127func TestSetQueriesMulti(t *testing.T) {
128	raw := "/blog?foo=1"
129	updated, err := SetQueriesMulti(raw, map[string][]string{
130		"foo": {"2", "3"},
131		"bar": {"4"},
132	})
133	urequire.NoError(t, err, "no error")
134	expected1 := "/blog?bar=4&foo=2&foo=3"
135	expected2 := "/blog?foo=2&foo=3&bar=4"
136	if updated != expected1 && updated != expected2 {
137		t.Errorf("got %s, expected %s or %s", updated, expected1, expected2)
138	}
139}
140
141func TestResetQuery(t *testing.T) {
142	raw := "/blog?foo=1&bar=2"
143	updated, err := ResetQuery(raw)
144	urequire.NoError(t, err, "no error")
145	uassert.Equal(t, "/blog", updated)
146}