github.com/nats-io/nsc/v2@v2.8.7-0.20240307184528-efd7023c6896/cmd/jsonpath_test.go (about)

     1  /*
     2   * Copyright 2020 The NATS Authors
     3   * Licensed under the Apache License, Version 2.0 (the "License");
     4   * you may not use this file except in compliance with the License.
     5   * You may obtain a copy of the License at
     6   *
     7   * http://www.apache.org/licenses/LICENSE-2.0
     8   *
     9   * Unless required by applicable law or agreed to in writing, software
    10   * distributed under the License is distributed on an "AS IS" BASIS,
    11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12   * See the License for the specific language governing permissions and
    13   * limitations under the License.
    14   */
    15  
    16  package cmd
    17  
    18  import (
    19  	"encoding/json"
    20  	"testing"
    21  
    22  	"github.com/stretchr/testify/require"
    23  )
    24  
    25  func TestJsonPath_String(t *testing.T) {
    26  	d, err := json.Marshal("helloworld")
    27  	require.NoError(t, err)
    28  	_, err = GetField(d, "hello")
    29  	require.Error(t, err)
    30  }
    31  
    32  func TestJsonPath_Int(t *testing.T) {
    33  	d, err := json.Marshal(100)
    34  	require.NoError(t, err)
    35  	_, err = GetField(d, "hello")
    36  	require.Error(t, err)
    37  }
    38  
    39  func TestJsonPath_Bool(t *testing.T) {
    40  	d, err := json.Marshal(true)
    41  	require.NoError(t, err)
    42  	_, err = GetField(d, "hello")
    43  	require.Error(t, err)
    44  }
    45  
    46  func TestJsonPath_Nil(t *testing.T) {
    47  	d, err := json.Marshal(nil)
    48  	require.NoError(t, err)
    49  	v, err := GetField(d, "hello")
    50  	require.NoError(t, err)
    51  	require.Equal(t, "null", string(v))
    52  }
    53  
    54  func TestJsonPath_BadArrayExpression(t *testing.T) {
    55  	d := []byte(`{"a": [0,1,2]}`)
    56  	_, err := GetField(d, "a[1")
    57  	require.Error(t, err)
    58  	require.Contains(t, err.Error(), "unterminated index expression")
    59  }
    60  
    61  func TestJsonPath_BadArrayIndex(t *testing.T) {
    62  	d := []byte(`{"a": [0,1,2]}`)
    63  	_, err := GetField(d, "a[]")
    64  	require.Error(t, err)
    65  	require.Contains(t, err.Error(), "error parsing index")
    66  }
    67  
    68  func TestJsonPath_BadArrayBadIndex(t *testing.T) {
    69  	d := []byte(`{"a": [0,1,2]}`)
    70  	_, err := GetField(d, "a[ab]")
    71  	require.Error(t, err)
    72  	require.Contains(t, err.Error(), "error parsing index")
    73  }
    74  
    75  func TestJsonPath_OutOfBoundsIndex(t *testing.T) {
    76  	d := []byte(`{"a": [0,1,2]}`)
    77  	_, err := GetField(d, "a[4]")
    78  	require.Error(t, err)
    79  	require.Contains(t, err.Error(), "index is out of bounds")
    80  }
    81  
    82  func TestJsonPath_PrimitiveCannotBeInspected(t *testing.T) {
    83  	d := []byte(`{"a": [0,1,2]}`)
    84  	_, err := GetField(d, "a[1].hello")
    85  	require.Error(t, err)
    86  	require.Contains(t, err.Error(), "unable to extract")
    87  }
    88  
    89  func TestSimple(t *testing.T) {
    90  	d := `{"a":[1,"hello",true],"b": "hello","c": {"key": "one","value": "two"}}`
    91  	ba := []byte(d)
    92  	v, err := GetField(ba, "a")
    93  	require.NoError(t, err)
    94  	require.Equal(t, `[1,"hello",true]`, string(v))
    95  
    96  	v, err = GetField(ba, "a[1]")
    97  	require.NoError(t, err)
    98  	require.Equal(t, `"hello"`, string(v))
    99  
   100  	v, err = GetField(ba, "a[0]")
   101  	require.NoError(t, err)
   102  	require.Equal(t, "1", string(v))
   103  
   104  	v, err = GetField(ba, "a[2]")
   105  	require.NoError(t, err)
   106  	require.Equal(t, "true", string(v))
   107  
   108  	v, err = GetField(ba, "b")
   109  	require.NoError(t, err)
   110  	require.Equal(t, `"hello"`, string(v))
   111  
   112  	v, err = GetField(ba, "c")
   113  	require.NoError(t, err)
   114  	require.Equal(t, `{"key":"one","value":"two"}`, string(v))
   115  
   116  	v, err = GetField(ba, "c.key")
   117  	require.NoError(t, err)
   118  	require.Equal(t, `"one"`, string(v))
   119  }