github.com/TIBCOSoftware/flogo-lib@v0.5.9/core/mapper/exprmapper/json/get_test.go (about) 1 package json 2 3 import ( 4 "encoding/json" 5 "strconv" 6 "sync" 7 "testing" 8 9 "github.com/TIBCOSoftware/flogo-lib/core/mapper/exprmapper/json/field" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 var jsonData = `{ 15 "City": [ 16 { 17 "Array": [ 18 { 19 "id": "11111" 20 }, 21 { 22 "id": "2222" 23 } 24 ], 25 "InUS": true, 26 "Name": "Sugar Land", 27 "Park": { 28 "Emails": null, 29 "Location": "location", 30 "Maps": { 31 "bb": "bb", 32 "cc": "cc", 33 "dd": "dd" 34 }, 35 "Name": "Name" 36 } 37 } 38 ], 39 "Emails": [ 40 "123@123.com", 41 "456@456.com" 42 ], 43 "Id": 1234, 44 "In": "string222", 45 "Maps": { 46 "bb": "bb", 47 "cc": "cc", 48 "dd": "dd" 49 }, 50 "State": "Taxes", 51 "Streat": "311 wind st", 52 "ZipCode": "77477", 53 "hello world":"CHINA", 54 "tag world":"CHINA" 55 }` 56 57 func TestRootChildArray(t *testing.T) { 58 mappingField := field.NewMappingField([]string{"City[0]"}) 59 value, err := GetFieldValue(jsonData, mappingField) 60 assert.Nil(t, err) 61 assert.NotNil(t, value) 62 } 63 64 func TestRoot(t *testing.T) { 65 mappingField := field.NewMappingField([]string{"City"}) 66 value, err := GetFieldValue(jsonData, mappingField) 67 assert.Nil(t, err) 68 assert.NotNil(t, value) 69 } 70 71 func TestGetFieldWithSpaces(t *testing.T) { 72 mappingField := field.NewMappingField([]string{"hello world"}) 73 value, err := GetFieldValue(jsonData, mappingField) 74 assert.Nil(t, err) 75 assert.NotNil(t, value) 76 assert.Equal(t, "CHINA", value) 77 } 78 79 func TestGetFieldWithTag(t *testing.T) { 80 mappingField := field.NewMappingField([]string{"tag world"}) 81 value, err := GetFieldValue(jsonData, mappingField) 82 assert.Nil(t, err) 83 assert.NotNil(t, value) 84 assert.Equal(t, "CHINA", value) 85 } 86 87 func TestGetArray(t *testing.T) { 88 mappingField := field.NewMappingField([]string{"Emails[0]"}) 89 value, err := GetFieldValue(jsonData, mappingField) 90 assert.Nil(t, err) 91 assert.NotNil(t, value) 92 assert.Equal(t, "123@123.com", value) 93 94 } 95 96 func TestMultipleLevelArray(t *testing.T) { 97 mappingField := field.NewMappingField([]string{"City[0]", "Array[1]", "id"}) 98 value, err := GetFieldValue(jsonData, mappingField) 99 assert.Nil(t, err) 100 assert.NotNil(t, value) 101 assert.Equal(t, "2222", value) 102 } 103 104 func TestMultipleLevelObject(t *testing.T) { 105 mappingField := field.NewMappingField([]string{"City[0]", "Park", "Maps", "bb"}) 106 value, err := GetFieldValue(jsonData, mappingField) 107 assert.Nil(t, err) 108 assert.NotNil(t, value) 109 assert.Equal(t, "bb", value) 110 } 111 112 func TestID(t *testing.T) { 113 mappingField := field.NewMappingField([]string{"Id"}) 114 value, err := GetFieldValue(jsonData, mappingField) 115 assert.Nil(t, err) 116 assert.NotNil(t, value) 117 assert.Equal(t, float64(1234), value) 118 } 119 120 func TestGetFieldValue(t *testing.T) { 121 account := `{ 122 "Account": { 123 "records": [ 124 { 125 "AccountNumber": "12356", 126 "AccountSource": "Test Source", 127 "Active__c": "Yes", 128 "AnnualRevenue": "324556", 129 "BillingCity": "Palo Alto", 130 "BillingCountry": "USA", 131 "BillingGeocodeAccuracy": null, 132 "BillingLatitude": null, 133 "BillingLongitude": null, 134 "BillingPostalCode": "94207", 135 "BillingState": "California", 136 "BillingStreet": "3330 hillview ave", 137 "CleanStatus": "Pending", 138 "CustomerPriority__c": "High", 139 "Description": "Sample Description for the account", 140 "DunsNumber": "32653", 141 "Fax": "345272", 142 "Industry": "Engineering", 143 "Jigsaw": "Test", 144 "NaicsCode": "34583", 145 "NaicsDesc": "Test Description", 146 "Name": "may24_a", 147 "Ownership": "Private", 148 "ParentId": null, 149 "Phone": "1234567890", 150 "Rating": "Warm", 151 "SLAExpirationDate__c": "2017-08-27", 152 "SLA__c": "23453", 153 "ShippingCity": "San Francisco", 154 "ShippingCountry": "USA", 155 "ShippingGeocodeAccuracy": null, 156 "ShippingLatitude": null, 157 "ShippingLongitude": null, 158 "ShippingPostalCode": 45692, 159 "ShippingState": "California", 160 "ShippingStreet": "1234 Hillview Ave", 161 "Sic": "Gold", 162 "SicDesc": null, 163 "Site": "www.example2.com", 164 "TickerSymbol": null, 165 "Tradestyle": "Regular", 166 "Type": "Custumer-Direct", 167 "UpsellOpportunity__c": "Yes", 168 "Website": "www.example.com", 169 "YearStarted": "2015" 170 } 171 ] 172 } 173 } 174 ` 175 mappingField := field.NewMappingField([]string{"Account", "records[0]", "Name"}) 176 value, err := GetFieldValue(account, mappingField) 177 log.Infof("Value:%s", value) 178 179 assert.Nil(t, err) 180 assert.NotNil(t, value) 181 assert.Equal(t, "may24_a", value) 182 183 } 184 185 func TestConcurrentGetk(t *testing.T) { 186 w := sync.WaitGroup{} 187 var recovered interface{} 188 //Create factory 189 190 for r := 0; r < 100000; r++ { 191 w.Add(1) 192 go func(i int) { 193 defer w.Done() 194 defer func() { 195 if r := recover(); r != nil { 196 recovered = r 197 } 198 }() 199 mappingField := field.NewMappingField([]string{"City[0]", "Park", "Maps", "bb"}) 200 value, err := GetFieldValue(jsonData, mappingField) 201 assert.Nil(t, err) 202 assert.NotNil(t, value) 203 }(r) 204 205 } 206 w.Wait() 207 assert.Nil(t, recovered) 208 } 209 210 func TestRootArray(t *testing.T) { 211 jsonArray := `[ 212 { 213 "Body": "test from WI", 214 "MD5OfBody": "ec7d5c27e25bcd3d6a65362b71bd0525", 215 "MD5OfMessageAttributes": "50df80e5fea57210bb8167abfd053899", 216 "MessageAttributes": { 217 "MA1": "test" 218 }, 219 "MessageId": "1c0483d9-8166-4df0-be9f-cd03177a38c6", 220 "ReceiptHandle": "AQEBE6elNqdJKrTz5A2X/gQJETxPdtJgAktTAuT4pvBTjQgnJpSEPhfMI08fHCMrEX6ILD0fTY2FVPCCJ8LfMvAxp+LO2/Bsi1uZhUyesFoj11Y/4jvdYSCQhqWEuAI1q1pxpSj2d2QbL5SUlX979ZG+Abv/IYeDvPO8nyuZ0IWgVhZWaGcoOwADvj3mNJZ9XJh8mS3vL8EQlUO6dhIRn9PxVet2fGRmm3iY1YI4N7bZsw9nxIqIYgl5kfuBNegSRcrrTOb6u9vTnHK2uiiCwJi+Io6WNGuJGF4fyFi3skk/AvCS7fjl+4MFqoHKsm1nR06Rel7017m0/Dg5KaOJCRAJ92gV4iuUMynG1WfmELMMg/sS19hrNvcgdKW5Vd3Snn/oNcoP2Ebb7CQA08XzVcoO0maVt2KqUWgvqf0DDxVArEE=" 221 } 222 ]` 223 224 mappingField := field.NewMappingField([]string{"[0]", "MessageId"}) 225 value, err := GetFieldValue(jsonArray, mappingField) 226 assert.Nil(t, err) 227 assert.NotNil(t, value) 228 assert.Equal(t, "1c0483d9-8166-4df0-be9f-cd03177a38c6", value) 229 230 } 231 232 func TestRootArrayInvalid(t *testing.T) { 233 jsonArray := `[ 234 { 235 "Body": "test from WI", 236 "MD5OfBody": "ec7d5c27e25bcd3d6a65362b71bd0525", 237 "MD5OfMessageAttributes": "50df80e5fea57210bb8167abfd053899", 238 "MessageAttributes": { 239 "MA1": "test" 240 }, 241 "MessageId": "1c0483d9-8166-4df0-be9f-cd03177a38c6", 242 "ReceiptHandle": "AQEBE6elNqdJKrTz5A2X/gQJETxPdtJgAktTAuT4pvBTjQgnJpSEPhfMI08fHCMrEX6ILD0fTY2FVPCCJ8LfMvAxp+LO2/Bsi1uZhUyesFoj11Y/4jvdYSCQhqWEuAI1q1pxpSj2d2QbL5SUlX979ZG+Abv/IYeDvPO8nyuZ0IWgVhZWaGcoOwADvj3mNJZ9XJh8mS3vL8EQlUO6dhIRn9PxVet2fGRmm3iY1YI4N7bZsw9nxIqIYgl5kfuBNegSRcrrTOb6u9vTnHK2uiiCwJi+Io6WNGuJGF4fyFi3skk/AvCS7fjl+4MFqoHKsm1nR06Rel7017m0/Dg5KaOJCRAJ92gV4iuUMynG1WfmELMMg/sS19hrNvcgdKW5Vd3Snn/oNcoP2Ebb7CQA08XzVcoO0maVt2KqUWgvqf0DDxVArEE=" 243 }, 244 { 245 "Body": "test from WI2", 246 "MD5OfBody": "ec7d5c27e25bcd33d6a65362b71bd0525", 247 "MD5OfMessageAttributes": "50df80e5fea57210bb8167abfd053899", 248 "MessageAttributes": { 249 "MA1": "test" 250 }, 251 "MessageId": "==1c04833d9-8166-4df0-be9f-cd03177a38c6", 252 "ReceiptHandle": "AQE3BE6elNqdJKrTz5A2X/gQJETxPdtJgAktTAuT4pvBTjQgnJpSEPhfMI08fHCMrEX6ILD0fTY2FVPCCJ8LfMvAxp+LO2/Bsi1uZhUyesFoj11Y/4jvdYSCQhqWEuAI1q1pxpSj2d2QbL5SUlX979ZG+Abv/IYeDvPO8nyuZ0IWgVhZWaGcoOwADvj3mNJZ9XJh8mS3vL8EQlUO6dhIRn9PxVet2fGRmm3iY1YI4N7bZsw9nxIqIYgl5kfuBNegSRcrrTOb6u9vTnHK2uiiCwJi+Io6WNGuJGF4fyFi3skk/AvCS7fjl+4MFqoHKsm1nR06Rel7017m0/Dg5KaOJCRAJ92gV4iuUMynG1WfmELMMg/sS19hrNvcgdKW5Vd3Snn/oNcoP2Ebb7CQA08XzVcoO0maVt2KqUWgvqf0DDxVArEE=" 253 } 254 ]` 255 256 mappingField := field.NewMappingField([]string{"[0]", "MessageId[0]"}) 257 value, err := GetFieldValue(jsonArray, mappingField) 258 assert.NotNil(t, err) 259 assert.Nil(t, nil, value) 260 261 } 262 263 func TestGetStructValue(t *testing.T) { 264 value := struct { 265 ID string `json:"id"` 266 Name string `json:"name"` 267 IntV int `json:"int_v"` 268 Int64V int64 `json:"int_64"` 269 }{ 270 ID: "12222", 271 Name: "name", 272 Int64V: int64(123), 273 IntV: int(12), 274 } 275 276 mappingField := field.NewMappingField([]string{"id"}) 277 278 v, err := GetFieldValue(value, mappingField) 279 assert.Nil(t, err) 280 assert.Equal(t, "12222", v) 281 282 testMap := make(map[string]string) 283 testMap["id"] = "id" 284 testMap["id2"] = "id2" 285 286 testMap2 := make(map[string]interface{}) 287 testMap2["id"] = value 288 testMap2["id2"] = int(2) 289 290 mappingField2 := field.NewMappingField([]string{"id"}) 291 v, err = GetFieldValue(testMap, mappingField2) 292 assert.Nil(t, err) 293 assert.Equal(t, "id", v) 294 295 mappingField3 := field.NewMappingField([]string{"id2"}) 296 v, err = GetFieldValue(testMap2, mappingField3) 297 assert.Nil(t, err) 298 assert.Equal(t, int(2), v) 299 300 mappingField4 := field.NewMappingField([]string{"id", "id"}) 301 v, err = GetFieldValue(testMap2, mappingField4) 302 assert.Nil(t, err) 303 assert.Equal(t, "12222", v) 304 305 ////Int64 306 mappingFieldInt64 := field.NewMappingField([]string{"id", "int_64"}) 307 v, err = GetFieldValue(testMap2, mappingFieldInt64) 308 assert.Nil(t, err) 309 assert.Equal(t, int64(123), v) 310 //Int 311 mappingFieldint := field.NewMappingField([]string{"id", "int_v"}) 312 v, err = GetFieldValue(testMap2, mappingFieldint) 313 assert.Nil(t, err) 314 assert.Equal(t, int(12), v) 315 } 316 317 var SpecialData = `{ 318 "City": [ 319 { 320 "Array": [ 321 { 322 "id": "11111" 323 }, 324 { 325 "id": "2222" 326 } 327 ], 328 "InUS": true, 329 "Name": "Sugar Land", 330 "Park": { 331 "Emails": null, 332 "Location": "location", 333 "Maps": { 334 "bb": "bb", 335 "cc": "cc", 336 "dd": "dd" 337 }, 338 "Name": "Name" 339 } 340 } 341 ], 342 "Emails": [ 343 "123@123.com", 344 "456@456.com" 345 ], 346 "Id": 1234, 347 "In": "string222", 348 "Maps": { 349 "bb.bb": { 350 "id": "10001" 351 }, 352 "cc#cc": "cc", 353 "dd**cc": "dd" 354 }, 355 "Maps2": { 356 "bb.bb": [ 357 { 358 "id": "10001" 359 } 360 ], 361 "good":[{"id":"12", "x.y":"234"}], 362 "cc#cc": "cc", 363 "dd**cc": "dd" 364 }, 365 "Maps3": { 366 "bb.bb": [ 367 { 368 "x.y": "10001" 369 } 370 ], 371 "cc#cc": [ 372 { 373 "x.y": { 374 "id": "1" 375 } 376 } 377 ], 378 "dd*cc": { 379 "x.y": { 380 "g%f": "hello" 381 }, 382 "y.x":[ 383 {"d.d":"123"} 384 ] 385 } 386 } 387 }` 388 389 func TestSpecialFieldNames(t *testing.T) { 390 mappingField := field.NewMappingField([]string{"Maps", "bb.bb"}) 391 value, err := GetFieldValue(SpecialData, mappingField) 392 assert.Nil(t, err) 393 assert.NotNil(t, value) 394 log.Info(value) 395 v, _ := json.Marshal(value) 396 assert.Equal(t, `{"id":"10001"}`, string(v)) 397 } 398 func TestGetSpecialFieldRoot(t *testing.T) { 399 mappingField := field.NewMappingField([]string{"Maps", "bb.bb"}) 400 value, err := GetFieldValue(SpecialData, mappingField) 401 assert.Nil(t, err) 402 assert.NotNil(t, value) 403 assert.Equal(t, map[string]interface{}{"id": "10001"}, value) 404 } 405 406 func TestGetSpecial2LevelObjectField(t *testing.T) { 407 mappingField := field.NewMappingField([]string{"Maps", "bb.bb", "id"}) 408 value, err := GetFieldValue(SpecialData, mappingField) 409 assert.Nil(t, err) 410 assert.NotNil(t, value) 411 assert.Equal(t, "10001", value) 412 } 413 414 func TestGetSpecial2LevelArrayField(t *testing.T) { 415 mappingField := field.NewMappingField([]string{"Maps2", "bb.bb[0]", "id"}) 416 value, err := GetFieldValue(SpecialData, mappingField) 417 assert.Nil(t, err) 418 assert.NotNil(t, value) 419 assert.Equal(t, "10001", value) 420 } 421 422 func TestGetSpecial2LevelArrayField2(t *testing.T) { 423 mappingField := field.NewMappingField([]string{"Maps3", "cc#cc[0]", "x.y", "id"}) 424 value, err := GetFieldValue(SpecialData, mappingField) 425 assert.Nil(t, err) 426 assert.NotNil(t, value) 427 assert.Equal(t, "1", value) 428 } 429 430 func TestGetSpecialSpecial(t *testing.T) { 431 mappingField := field.NewMappingField([]string{"Maps3", "dd*cc", "x.y", "g%f"}) 432 value, err := GetFieldValue(SpecialData, mappingField) 433 assert.Nil(t, err) 434 assert.NotNil(t, value) 435 assert.Equal(t, "hello", value) 436 } 437 438 func TestGetSpecialSpecial2(t *testing.T) { 439 mappingField := field.NewMappingField([]string{"Maps3", "dd*cc", "y.x[0]", "d.d"}) 440 value, err := GetFieldValue(SpecialData, mappingField) 441 assert.Nil(t, err) 442 assert.NotNil(t, value) 443 assert.Equal(t, "123", value) 444 } 445 446 func TestGetSpecialSpecial3(t *testing.T) { 447 mappingField := field.NewMappingField([]string{"Maps2", "good[0]", "x.y"}) 448 value, err := GetFieldValue(SpecialData, mappingField) 449 assert.Nil(t, err) 450 assert.NotNil(t, value) 451 assert.Equal(t, "234", value) 452 } 453 454 func TestHasArrayFieldInArray(t *testing.T) { 455 assert.False(t, hasArrayFieldInArray([]string{"[square]"})) 456 assert.True(t, hasArrayFieldInArray([]string{"bb.bb[0]"})) 457 } 458 459 func TestSpecial(t *testing.T) { 460 461 data := `{ 462 "[square]":"123", 463 "array1": [ 464 { 465 "id.1": 21907387 466 }, 467 { 468 "email": -54931037, 469 "array2": [ 470 { 471 "id.2": 3458316 472 }, 473 { 474 "id.2": 57420133 475 }, 476 { 477 "id.2": -95395610 478 }, 479 { 480 "id.2": 68243245 481 } 482 ] 483 } 484 ] 485 }` 486 487 mappingField := field.NewMappingField([]string{"array1[1]", "array2[0]", "id.2"}) 488 value, err := GetFieldValue(data, mappingField) 489 assert.Nil(t, err) 490 assert.NotNil(t, value) 491 492 assert.Equal(t, "3458316", strconv.FormatFloat(value.(float64), 'f', -1, 64)) 493 494 mappingField = field.NewMappingField([]string{"[square]"}) 495 value, err = GetFieldValue(data, mappingField) 496 assert.Nil(t, err) 497 assert.NotNil(t, value) 498 499 assert.Equal(t, "123", value) 500 501 }