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  }