github.com/diamondo25/ghz@v0.12.0/data_test.go (about) 1 package ghz 2 3 import ( 4 "testing" 5 6 "github.com/bojand/ghz/protodesc" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestData_isArrayData(t *testing.T) { 12 t.Run("false when nil", func(t *testing.T) { 13 res := isArrayData(nil) 14 assert.False(t, res) 15 }) 16 17 t.Run("false when a string", func(t *testing.T) { 18 res := isArrayData("asdf") 19 assert.False(t, res) 20 }) 21 22 t.Run("false when a number", func(t *testing.T) { 23 res := isArrayData(5) 24 assert.False(t, res) 25 }) 26 27 t.Run("false when an empty map", func(t *testing.T) { 28 m := make(map[string]interface{}) 29 res := isArrayData(m) 30 assert.False(t, res) 31 }) 32 33 t.Run("false when a map", func(t *testing.T) { 34 m := make(map[string]interface{}) 35 m["name"] = "bob" 36 res := isArrayData(m) 37 assert.False(t, res) 38 }) 39 40 t.Run("false when an empty slice", func(t *testing.T) { 41 res := isArrayData([]string{}) 42 assert.False(t, res) 43 }) 44 45 t.Run("false when a slice of strings", func(t *testing.T) { 46 res := isArrayData([]string{"foo", "bar"}) 47 assert.False(t, res) 48 }) 49 50 t.Run("false when a slice of maps as we require slice of ifaces which are maps", func(t *testing.T) { 51 m1 := make(map[string]interface{}) 52 m1["name"] = "bob" 53 m1["foo"] = "far" 54 55 m2 := make(map[string]interface{}) 56 m2["foo"] = 1 57 m2["bar"] = 2 58 59 s := []map[string]interface{}{m1, m2} 60 res := isArrayData(s) 61 assert.False(t, res) 62 }) 63 64 t.Run("true when a slice of correct maps as interfaces", func(t *testing.T) { 65 m1 := make(map[string]interface{}) 66 m1["name"] = "bob" 67 m1["foo"] = "far" 68 69 m2 := make(map[string]interface{}) 70 m2["foo"] = 1 71 m2["bar"] = 2 72 73 s := []interface{}{m1, m2} 74 res := isArrayData(s) 75 assert.True(t, res) 76 }) 77 78 t.Run("false when a slice of containing incorrect element", func(t *testing.T) { 79 m1 := make(map[string]interface{}) 80 m1["name"] = "bob" 81 m1["foo"] = "far" 82 83 m2 := make(map[string]interface{}) 84 m2["foo"] = 1 85 m2["bar"] = 2 86 87 s := []interface{}{m1, m2, "some string"} 88 res := isArrayData(s) 89 assert.False(t, res) 90 }) 91 92 t.Run("false when a slice of containing incorrect map element", func(t *testing.T) { 93 m1 := make(map[string]interface{}) 94 m1["name"] = "bob" 95 m1["foo"] = "far" 96 97 m2 := make(map[string]interface{}) 98 m2["foo"] = 1 99 m2["bar"] = 2 100 101 m3 := make(map[int]interface{}) 102 m3[5] = "foo" 103 m3[7] = "bar" 104 105 s := []interface{}{m1, m2, m3} 106 res := isArrayData(s) 107 assert.False(t, res) 108 }) 109 } 110 111 func TestData_isMapData(t *testing.T) { 112 t.Run("false when nil", func(t *testing.T) { 113 res := isMapData(nil) 114 assert.False(t, res) 115 }) 116 117 t.Run("false when a string", func(t *testing.T) { 118 res := isMapData("asdf") 119 assert.False(t, res) 120 }) 121 122 t.Run("false when a number", func(t *testing.T) { 123 res := isMapData(5) 124 assert.False(t, res) 125 }) 126 127 t.Run("false when a map of invalid keys", func(t *testing.T) { 128 m := make(map[int]interface{}) 129 res := isMapData(m) 130 assert.False(t, res) 131 }) 132 133 t.Run("true when a valid map", func(t *testing.T) { 134 m := make(map[string]interface{}) 135 m["name"] = "bob" 136 res := isMapData(m) 137 assert.True(t, res) 138 }) 139 140 t.Run("true when a valid empty map", func(t *testing.T) { 141 m := make(map[string]interface{}) 142 res := isMapData(m) 143 assert.True(t, res) 144 }) 145 146 t.Run("false when a slice of valid maps", func(t *testing.T) { 147 m1 := make(map[string]interface{}) 148 m1["name"] = "bob" 149 m1["foo"] = "far" 150 151 m2 := make(map[string]interface{}) 152 m2["foo"] = 1 153 m2["bar"] = 2 154 155 s := []map[string]interface{}{m1, m2} 156 res := isMapData(s) 157 assert.False(t, res) 158 }) 159 } 160 161 func TestData_createPayloads(t *testing.T) { 162 mtdUnary, err := protodesc.GetMethodDescFromProto( 163 "helloworld.Greeter.SayHello", 164 "./testdata/greeter.proto", 165 nil) 166 167 assert.NoError(t, err) 168 assert.NotNil(t, mtdUnary) 169 170 mtdClientStreaming, err := protodesc.GetMethodDescFromProto( 171 "helloworld.Greeter.SayHelloCS", 172 "./testdata/greeter.proto", 173 nil) 174 175 assert.NoError(t, err) 176 assert.NotNil(t, mtdClientStreaming) 177 178 mtdTestUnary, err := protodesc.GetMethodDescFromProto( 179 "data.DataTestService.TestCall", 180 "./testdata/data.proto", 181 nil) 182 183 assert.NoError(t, err) 184 assert.NotNil(t, mtdTestUnary) 185 186 mtdTestUnaryTwo, err := protodesc.GetMethodDescFromProto( 187 "data.DataTestService.TestCallTwo", 188 "./testdata/data.proto", 189 nil) 190 191 assert.NoError(t, err) 192 assert.NotNil(t, mtdTestUnaryTwo) 193 194 t.Run("fail when nil", func(t *testing.T) { 195 single, streaming, err := createPayloads(nil, mtdUnary) 196 assert.Error(t, err) 197 assert.Nil(t, single) 198 assert.Nil(t, streaming) 199 }) 200 201 t.Run("fail for invalid data shape", func(t *testing.T) { 202 m1 := make(map[string]interface{}) 203 m1["name"] = "bob" 204 m1["unknown"] = "field" 205 206 single, streaming, err := createPayloads(m1, mtdUnary) 207 assert.Error(t, err) 208 assert.Nil(t, single) 209 assert.Nil(t, streaming) 210 }) 211 212 t.Run("create single object from map for unary", func(t *testing.T) { 213 m1 := make(map[string]interface{}) 214 m1["name"] = "bob" 215 216 single, streaming, err := createPayloads(m1, mtdUnary) 217 assert.NoError(t, err) 218 assert.NotNil(t, single) 219 assert.Empty(t, streaming) 220 }) 221 222 t.Run("create array from map for client streaming", func(t *testing.T) { 223 m1 := make(map[string]interface{}) 224 m1["name"] = "bob" 225 226 single, streaming, err := createPayloads(m1, mtdClientStreaming) 227 assert.NoError(t, err) 228 assert.Nil(t, single) 229 assert.NotNil(t, streaming) 230 assert.Len(t, *streaming, 1) 231 }) 232 233 t.Run("create slice of messages from slice for client streaming", func(t *testing.T) { 234 m1 := make(map[string]interface{}) 235 m1["name"] = "bob" 236 237 m2 := make(map[string]interface{}) 238 m2["name"] = "kate" 239 240 s := []interface{}{m1, m2} 241 242 single, streaming, err := createPayloads(s, mtdClientStreaming) 243 assert.NoError(t, err) 244 assert.Nil(t, single) 245 assert.NotNil(t, streaming) 246 assert.Len(t, *streaming, 2) 247 }) 248 249 t.Run("fail on invalid shape of data in slice for client streaming", func(t *testing.T) { 250 m1 := make(map[string]interface{}) 251 m1["name"] = "bob" 252 253 m2 := make(map[string]interface{}) 254 m2["name"] = "kate" 255 256 m3 := make(map[string]interface{}) 257 m3["name"] = "Jim" 258 m3["foo"] = "bar" 259 260 s := []interface{}{m1, m2, m3} 261 262 single, streaming, err := createPayloads(s, mtdClientStreaming) 263 assert.Error(t, err) 264 assert.Nil(t, single) 265 assert.Nil(t, streaming) 266 }) 267 268 t.Run("get object for slice and unary", func(t *testing.T) { 269 m1 := make(map[string]interface{}) 270 m1["name"] = "bob" 271 272 m2 := make(map[string]interface{}) 273 m2["name"] = "kate" 274 275 m3 := make(map[string]interface{}) 276 m3["name"] = "Jim" 277 278 s := []interface{}{m1, m2, m3} 279 280 single, streaming, err := createPayloads(s, mtdUnary) 281 assert.NoError(t, err) 282 assert.NotNil(t, single) 283 assert.Empty(t, streaming) 284 }) 285 286 t.Run("create single object from map for unary with camelCase property", func(t *testing.T) { 287 m1 := make(map[string]interface{}) 288 m1["paramOne"] = "bob" 289 290 single, streaming, err := createPayloads(m1, mtdTestUnary) 291 assert.NoError(t, err) 292 assert.NotNil(t, single) 293 assert.Empty(t, streaming) 294 }) 295 296 t.Run("create single object from map for unary with snake_case property", func(t *testing.T) { 297 m1 := make(map[string]interface{}) 298 m1["param_one"] = "bob" 299 300 single, streaming, err := createPayloads(m1, mtdTestUnary) 301 assert.NoError(t, err) 302 assert.NotNil(t, single) 303 assert.Empty(t, streaming) 304 }) 305 306 t.Run("create single object from map for unary with nested camelCase property", func(t *testing.T) { 307 inner := make(map[string]interface{}) 308 inner["paramOne"] = "bob" 309 310 m1 := make(map[string]interface{}) 311 m1["nestedProp"] = inner 312 313 single, streaming, err := createPayloads(m1, mtdTestUnaryTwo) 314 assert.NoError(t, err) 315 assert.NotNil(t, single) 316 assert.Empty(t, streaming) 317 }) 318 319 t.Run("create single object from map for unary with nested snake_case property", func(t *testing.T) { 320 inner := make(map[string]interface{}) 321 inner["param_one"] = "bob" 322 323 m1 := make(map[string]interface{}) 324 m1["nested_prop"] = inner 325 326 single, streaming, err := createPayloads(m1, mtdTestUnaryTwo) 327 assert.NoError(t, err) 328 assert.NotNil(t, single) 329 assert.Empty(t, streaming) 330 }) 331 }