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}