map_test.go 5.4 KB

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