1package objx_test
2
3import (
4	"testing"
5
6	"github.com/stretchr/objx"
7	"github.com/stretchr/testify/assert"
8	"github.com/stretchr/testify/require"
9)
10
11var TestMap = objx.Map{
12	"name": "Tyler",
13	"address": objx.Map{
14		"city":  "Salt Lake City",
15		"state": "UT",
16	},
17	"numbers": []interface{}{"one", "two", "three", "four", "five"},
18}
19
20type Convertable struct {
21	name string
22}
23
24type Unconvertable struct {
25	name string
26}
27
28func (c *Convertable) MSI() map[string]interface{} {
29	return objx.Map{"name": c.name}
30}
31
32func TestMapCreation(t *testing.T) {
33	o := objx.New(nil)
34	assert.Nil(t, o)
35
36	o = objx.New("Tyler")
37	assert.Nil(t, o)
38
39	unconvertable := &Unconvertable{name: "Tyler"}
40	o = objx.New(unconvertable)
41	assert.Nil(t, o)
42
43	convertable := &Convertable{name: "Tyler"}
44	o = objx.New(convertable)
45	require.NotNil(t, convertable)
46	assert.Equal(t, "Tyler", o["name"])
47
48	o = objx.MSI()
49	assert.NotNil(t, o)
50
51	o = objx.MSI("name", "Tyler")
52	require.NotNil(t, o)
53	assert.Equal(t, o["name"], "Tyler")
54
55	o = objx.MSI(1, "a")
56	assert.Nil(t, o)
57
58	o = objx.MSI("a")
59	assert.Nil(t, o)
60
61	o = objx.MSI("a", "b", "c")
62	assert.Nil(t, o)
63}
64
65func TestMapValure(t *testing.T) {
66	m := objx.Map{
67		"a": 1,
68	}
69	v := m.Value()
70
71	assert.Equal(t, m, v.ObjxMap())
72}
73
74func TestMapMustFromJSONWithError(t *testing.T) {
75	_, err := objx.FromJSON(`"name":"Mat"}`)
76	assert.Error(t, err)
77}
78
79func TestMapFromJSON(t *testing.T) {
80	o := objx.MustFromJSON(`{"name":"Mat"}`)
81
82	require.NotNil(t, o)
83	assert.Equal(t, "Mat", o["name"])
84}
85
86func TestMapFromJSONWithError(t *testing.T) {
87	var m objx.Map
88
89	assert.Panics(t, func() {
90		m = objx.MustFromJSON(`"name":"Mat"}`)
91	})
92	assert.Nil(t, m)
93}
94
95func TestMapFromBase64String(t *testing.T) {
96	base64String := "eyJuYW1lIjoiTWF0In0="
97	o, err := objx.FromBase64(base64String)
98
99	require.NoError(t, err)
100	assert.Equal(t, o.Get("name").Str(), "Mat")
101	assert.Equal(t, objx.MustFromBase64(base64String).Get("name").Str(), "Mat")
102}
103
104func TestMapFromBase64StringWithError(t *testing.T) {
105	base64String := "eyJuYW1lIjoiTWFasd0In0="
106	_, err := objx.FromBase64(base64String)
107
108	assert.Error(t, err)
109	assert.Panics(t, func() {
110		objx.MustFromBase64(base64String)
111	})
112}
113
114func TestMapFromSignedBase64String(t *testing.T) {
115	base64String := "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6"
116
117	o, err := objx.FromSignedBase64(base64String, "key")
118
119	require.NoError(t, err)
120	assert.Equal(t, o.Get("name").Str(), "Mat")
121	assert.Equal(t, objx.MustFromSignedBase64(base64String, "key").Get("name").Str(), "Mat")
122}
123
124func TestMapFromSignedBase64StringWithError(t *testing.T) {
125	base64String := "eyJuYW1lasdIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6"
126	_, err := objx.FromSignedBase64(base64String, "key")
127	assert.Error(t, err)
128	assert.Panics(t, func() {
129		objx.MustFromSignedBase64(base64String, "key")
130	})
131
132	base64String = "eyJuYW1lasdIjoiTWF0In0=67ee82916f90b2c0d68c903266e8998c9ef0c3d6"
133	_, err = objx.FromSignedBase64(base64String, "key")
134	assert.Error(t, err)
135	assert.Panics(t, func() {
136		objx.MustFromSignedBase64(base64String, "key")
137	})
138
139	base64String = "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6_junk"
140	_, err = objx.FromSignedBase64(base64String, "key")
141	assert.Error(t, err)
142	assert.Panics(t, func() {
143		objx.MustFromSignedBase64(base64String, "key")
144	})
145}
146
147func TestMapFromURLQuery(t *testing.T) {
148	m, err := objx.FromURLQuery("name=tyler&state=UT")
149
150	assert.NoError(t, err)
151	require.NotNil(t, m)
152	assert.Equal(t, "tyler", m.Get("name").Str())
153	assert.Equal(t, "UT", m.Get("state").Str())
154}
155
156func TestMapMustFromURLQuery(t *testing.T) {
157	m := objx.MustFromURLQuery("name=tyler&state=UT")
158
159	require.NotNil(t, m)
160	assert.Equal(t, "tyler", m.Get("name").Str())
161	assert.Equal(t, "UT", m.Get("state").Str())
162}
163
164func TestMapFromURLQueryWithError(t *testing.T) {
165	m, err := objx.FromURLQuery("%")
166
167	assert.Error(t, err)
168	assert.Nil(t, m)
169	assert.Panics(t, func() {
170		objx.MustFromURLQuery("%")
171	})
172}
173