1 package objx_test
2
3 import (
4 "net/url"
5 "testing"
6
7 "github.com/stretchr/objx"
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10 )
11
12 func TestConversionJSON(t *testing.T) {
13 jsonString := `{"name":"Mat"}`
14 o := objx.MustFromJSON(jsonString)
15
16 result, err := o.JSON()
17
18 require.NoError(t, err)
19 assert.Equal(t, jsonString, result)
20 assert.Equal(t, jsonString, o.MustJSON())
21
22 i := objx.Map{
23 "a": map[interface{}]interface{}{"b": objx.Map{"c": map[interface{}]interface{}{"d": "e"}},
24 "f": []objx.Map{{"g": map[interface{}]interface{}{"h": "i"}}},
25 "j": []map[string]interface{}{{"k": map[interface{}]interface{}{"l": "m"}}},
26 "n": []interface{}{objx.Map{"o": "p"}},
27 },
28 }
29
30 jsonString = `{"a":{"b":{"c":{"d":"e"}},"f":[{"g":{"h":"i"}}],"j":[{"k":{"l":"m"}}],"n":[{"o":"p"}]}}`
31 result, err = i.JSON()
32 require.NoError(t, err)
33 assert.Equal(t, jsonString, result)
34 assert.Equal(t, jsonString, i.MustJSON())
35 }
36
37 func TestConversionJSONWithError(t *testing.T) {
38 o := objx.MSI()
39 o["test"] = func() {}
40
41 assert.Panics(t, func() {
42 o.MustJSON()
43 })
44
45 _, err := o.JSON()
46
47 assert.Error(t, err)
48 }
49
50 func TestConversionBase64(t *testing.T) {
51 o := objx.Map{"name": "Mat"}
52
53 result, err := o.Base64()
54
55 require.NoError(t, err)
56 assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", result)
57 assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", o.MustBase64())
58 }
59
60 func TestConversionBase64WithError(t *testing.T) {
61 o := objx.MSI()
62 o["test"] = func() {}
63
64 assert.Panics(t, func() {
65 o.MustBase64()
66 })
67
68 _, err := o.Base64()
69
70 assert.Error(t, err)
71 }
72
73 func TestConversionSignedBase64(t *testing.T) {
74 o := objx.Map{"name": "Mat"}
75
76 result, err := o.SignedBase64("key")
77
78 require.NoError(t, err)
79 assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", result)
80 assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", o.MustSignedBase64("key"))
81 }
82
83 func TestConversionSignedBase64WithError(t *testing.T) {
84 o := objx.MSI()
85 o["test"] = func() {}
86
87 assert.Panics(t, func() {
88 o.MustSignedBase64("key")
89 })
90
91 _, err := o.SignedBase64("key")
92
93 assert.Error(t, err)
94 }
95
96 func TestConversionURLValues(t *testing.T) {
97 m := getURLQueryMap()
98 u := m.URLValues()
99
100 assert.Equal(t, url.Values{
101 "abc": []string{"123"},
102 "name": []string{"Mat"},
103 "data[age]": []string{"30"},
104 "data[height]": []string{"162"},
105 "data[arr][]": []string{"1", "2"},
106 "stats[]": []string{"1", "2"},
107 "bools[]": []string{"true", "false"},
108 "mapSlice[][age]": []string{"40"},
109 "mapSlice[][height]": []string{"152"},
110 "msiData[age]": []string{"30"},
111 "msiData[height]": []string{"162"},
112 "msiData[arr][]": []string{"1", "2"},
113 "msiSlice[][age]": []string{"40"},
114 "msiSlice[][height]": []string{"152"},
115 }, u)
116 }
117
118 func TestConversionURLQuery(t *testing.T) {
119 m := getURLQueryMap()
120 u, err := m.URLQuery()
121
122 assert.Nil(t, err)
123 require.NotNil(t, u)
124
125 ue, err := url.QueryUnescape(u)
126 assert.Nil(t, err)
127 require.NotNil(t, ue)
128
129 assert.Equal(t, "abc=123&bools[]=true&bools[]=false&data[age]=30&data[arr][]=1&data[arr][]=2&data[height]=162&mapSlice[][age]=40&mapSlice[][height]=152&msiData[age]=30&msiData[arr][]=1&msiData[arr][]=2&msiData[height]=162&msiSlice[][age]=40&msiSlice[][height]=152&name=Mat&stats[]=1&stats[]=2", ue)
130 }
131
132 func TestConversionURLQueryNoSliceKeySuffix(t *testing.T) {
133 m := getURLQueryMap()
134 err := objx.SetURLValuesSliceKeySuffix(objx.URLValuesSliceKeySuffixEmpty)
135 require.Nil(t, err)
136 u, err := m.URLQuery()
137
138 assert.Nil(t, err)
139 require.NotNil(t, u)
140
141 ue, err := url.QueryUnescape(u)
142 assert.Nil(t, err)
143 require.NotNil(t, ue)
144
145 assert.Equal(t, "abc=123&bools=true&bools=false&data[age]=30&data[arr]=1&data[arr]=2&data[height]=162&mapSlice[age]=40&mapSlice[height]=152&msiData[age]=30&msiData[arr]=1&msiData[arr]=2&msiData[height]=162&msiSlice[age]=40&msiSlice[height]=152&name=Mat&stats=1&stats=2", ue)
146 }
147
148 func TestConversionURLQueryIndexSliceKeySuffix(t *testing.T) {
149 m := getURLQueryMap()
150 m.Set("mapSlice", []objx.Map{{"age": 40, "sex": "male"}, {"height": 152}})
151 err := objx.SetURLValuesSliceKeySuffix(objx.URLValuesSliceKeySuffixIndex)
152 require.Nil(t, err)
153 u, err := m.URLQuery()
154
155 assert.Nil(t, err)
156 require.NotNil(t, u)
157
158 ue, err := url.QueryUnescape(u)
159 assert.Nil(t, err)
160 require.NotNil(t, ue)
161
162 assert.Equal(t, "abc=123&bools[0]=true&bools[1]=false&data[age]=30&data[arr][0]=1&data[arr][1]=2&data[height]=162&mapSlice[0][age]=40&mapSlice[0][sex]=male&mapSlice[1][height]=152&msiData[age]=30&msiData[arr][0]=1&msiData[arr][1]=2&msiData[height]=162&msiSlice[0][age]=40&msiSlice[1][height]=152&name=Mat&stats[0]=1&stats[1]=2", ue)
163 }
164
165 func TestValidityURLQuerySliceKeySuffix(t *testing.T) {
166 err := objx.SetURLValuesSliceKeySuffix("")
167 assert.Nil(t, err)
168 err = objx.SetURLValuesSliceKeySuffix("[]")
169 assert.Nil(t, err)
170 err = objx.SetURLValuesSliceKeySuffix("[i]")
171 assert.Nil(t, err)
172 err = objx.SetURLValuesSliceKeySuffix("{}")
173 assert.Error(t, err)
174 }
175
176 func getURLQueryMap() objx.Map {
177 return objx.Map{
178 "abc": 123,
179 "name": "Mat",
180 "data": objx.Map{"age": 30, "height": 162, "arr": []int{1, 2}},
181 "mapSlice": []objx.Map{{"age": 40}, {"height": 152}},
182 "msiData": map[string]interface{}{"age": 30, "height": 162, "arr": []int{1, 2}},
183 "msiSlice": []map[string]interface{}{{"age": 40}, {"height": 152}},
184 "stats": []string{"1", "2"},
185 "bools": []bool{true, false},
186 }
187 }
188
View as plain text