github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/k8s/json_path_test.go (about)

     1  package k8s
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"k8s.io/apimachinery/pkg/runtime"
     9  
    10  	"github.com/tilt-dev/tilt/internal/k8s/jsonpath"
    11  	"github.com/tilt-dev/tilt/internal/k8s/testyaml"
    12  )
    13  
    14  func TestJSONPathOneMatch(t *testing.T) {
    15  	entities := MustParseYAMLFromString(t, testyaml.SanchoYAML)
    16  	deployment := entities[0]
    17  	path, err := NewJSONPath("{.spec.template.spec.containers[].image}")
    18  	assert.NoError(t, err)
    19  	result, err := path.FindStrings(deployment.Obj)
    20  	assert.NoError(t, err)
    21  	assert.Equal(t, []string{"gcr.io/some-project-162817/sancho"}, result)
    22  }
    23  
    24  func TestJSONPathReplace(t *testing.T) {
    25  	entities := MustParseYAMLFromString(t, testyaml.SanchoYAML)
    26  	deployment := entities[0]
    27  	path, err := NewJSONPath("{.spec.template.spec.containers[].image}")
    28  	assert.NoError(t, err)
    29  
    30  	err = path.VisitStrings(deployment.Obj, func(val jsonpath.Value, s string) error {
    31  		val.Set(reflect.ValueOf("injected-image"))
    32  		return nil
    33  	})
    34  	assert.NoError(t, err)
    35  
    36  	result, err := path.FindStrings(deployment.Obj)
    37  	assert.NoError(t, err)
    38  	assert.Equal(t, []string{"injected-image"}, result)
    39  }
    40  
    41  func TestJSONPathMultipleMatches(t *testing.T) {
    42  	entities := MustParseYAMLFromString(t, testyaml.SanchoSidecarYAML)
    43  	deployment := entities[0]
    44  	path, err := NewJSONPath("{.spec.template.spec.containers[*].image}")
    45  	assert.NoError(t, err)
    46  	result, err := path.FindStrings(deployment.Obj)
    47  	assert.NoError(t, err)
    48  	assert.Equal(t, []string{
    49  		"gcr.io/some-project-162817/sancho",
    50  		"gcr.io/some-project-162817/sancho-sidecar",
    51  	}, result)
    52  }
    53  
    54  func TestJSONPathCRD(t *testing.T) {
    55  	entities := MustParseYAMLFromString(t, testyaml.CRDYAML)
    56  	crd := entities[0]
    57  	path, err := NewJSONPath("{.spec.validation.openAPIV3Schema.properties.spec.properties.image}")
    58  	assert.NoError(t, err)
    59  
    60  	content := crd.Obj.(runtime.Unstructured).UnstructuredContent()
    61  	result, err := path.FindStrings(content)
    62  	assert.NoError(t, err)
    63  	assert.Equal(t, []string{"docker.io/bitnami/minideb:latest"}, result)
    64  }
    65  
    66  func TestJSONPathCRDReplace(t *testing.T) {
    67  	entities := MustParseYAMLFromString(t, testyaml.CRDYAML)
    68  	crd := entities[0]
    69  	path, err := NewJSONPath("{.spec.validation.openAPIV3Schema.properties.spec.properties.image}")
    70  	assert.NoError(t, err)
    71  
    72  	content := crd.Obj.(runtime.Unstructured).UnstructuredContent()
    73  	err = path.VisitStrings(content, func(val jsonpath.Value, s string) error {
    74  		val.Set(reflect.ValueOf("injected-image"))
    75  		return nil
    76  	})
    77  	assert.NoError(t, err)
    78  
    79  	result, err := path.FindStrings(content)
    80  	assert.NoError(t, err)
    81  	assert.Equal(t, []string{"injected-image"}, result)
    82  }