github.com/wuhuizuo/gomplate@v3.5.0+incompatible/coll/jsonpath_test.go (about)

     1  package coll
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  type m = map[string]interface{}
    10  type ar = []interface{}
    11  
    12  func TestJSONPath(t *testing.T) {
    13  	in := m{
    14  		"store": m{
    15  			"book": ar{
    16  				m{
    17  					"category": "reference",
    18  					"author":   "Nigel Rees",
    19  					"title":    "Sayings of the Century",
    20  					"price":    8.95,
    21  				},
    22  				m{
    23  					"category": "fiction",
    24  					"author":   "Evelyn Waugh",
    25  					"title":    "Sword of Honour",
    26  					"price":    12.99,
    27  				},
    28  				m{
    29  					"category": "fiction",
    30  					"author":   "Herman Melville",
    31  					"title":    "Moby Dick",
    32  					"isbn":     "0-553-21311-3",
    33  					"price":    8.99,
    34  				},
    35  				m{
    36  					"category": "fiction",
    37  					"author":   "J. R. R. Tolkien",
    38  					"title":    "The Lord of the Rings",
    39  					"isbn":     "0-395-19395-8",
    40  					"price":    22.99,
    41  				},
    42  			},
    43  			"bicycle": m{
    44  				"color": "red",
    45  				"price": 19.95,
    46  			},
    47  		},
    48  	}
    49  	out, err := JSONPath(".store.bicycle.color", in)
    50  	assert.NoError(t, err)
    51  	assert.Equal(t, "red", out)
    52  
    53  	out, err = JSONPath(".store.bicycle.price", in)
    54  	assert.NoError(t, err)
    55  	assert.Equal(t, 19.95, out)
    56  
    57  	_, err = JSONPath(".store.bogus", in)
    58  	assert.Error(t, err)
    59  
    60  	_, err = JSONPath("{.store.unclosed", in)
    61  	assert.Error(t, err)
    62  
    63  	out, err = JSONPath(".store", in)
    64  	assert.NoError(t, err)
    65  	assert.EqualValues(t, in["store"], out)
    66  
    67  	out, err = JSONPath("$.store.book[*].author", in)
    68  	assert.NoError(t, err)
    69  	assert.Len(t, out, 4)
    70  	assert.Contains(t, out, "Nigel Rees")
    71  	assert.Contains(t, out, "Evelyn Waugh")
    72  	assert.Contains(t, out, "Herman Melville")
    73  	assert.Contains(t, out, "J. R. R. Tolkien")
    74  
    75  	out, err = JSONPath("$..book[?( @.price < 10.0 )]", in)
    76  	assert.NoError(t, err)
    77  	expected := ar{
    78  		m{
    79  			"category": "reference",
    80  			"author":   "Nigel Rees",
    81  			"title":    "Sayings of the Century",
    82  			"price":    8.95,
    83  		},
    84  		m{
    85  			"category": "fiction",
    86  			"author":   "Herman Melville",
    87  			"title":    "Moby Dick",
    88  			"isbn":     "0-553-21311-3",
    89  			"price":    8.99,
    90  		},
    91  	}
    92  	assert.EqualValues(t, expected, out)
    93  
    94  	in = m{
    95  		"a": m{
    96  			"aa": m{
    97  				"foo": m{
    98  					"aaa": m{
    99  						"aaaa": m{
   100  							"bar": 1234,
   101  						},
   102  					},
   103  				},
   104  			},
   105  			"ab": m{
   106  				"aba": m{
   107  					"foo": m{
   108  						"abaa": true,
   109  						"abab": "baz",
   110  					},
   111  				},
   112  			},
   113  		},
   114  	}
   115  	out, err = JSONPath("..foo.*", in)
   116  	assert.NoError(t, err)
   117  	assert.Len(t, out, 3)
   118  	assert.Contains(t, out, m{"aaaa": m{"bar": 1234}})
   119  	assert.Contains(t, out, true)
   120  	assert.Contains(t, out, "baz")
   121  
   122  	type bicycleType struct {
   123  		Color string
   124  	}
   125  	type storeType struct {
   126  		Bicycle *bicycleType
   127  		safe    interface{}
   128  	}
   129  
   130  	structIn := &storeType{
   131  		Bicycle: &bicycleType{
   132  			Color: "red",
   133  		},
   134  		safe: "hidden",
   135  	}
   136  
   137  	out, err = JSONPath(".Bicycle.Color", structIn)
   138  	assert.NoError(t, err)
   139  	assert.Equal(t, "red", out)
   140  
   141  	_, err = JSONPath(".safe", structIn)
   142  	assert.Error(t, err)
   143  
   144  	_, err = JSONPath(".*", structIn)
   145  	assert.Error(t, err)
   146  }