mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-06 07:57:07 +00:00
246 lines
5.3 KiB
Go
246 lines
5.3 KiB
Go
|
package jmespath
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"testing"
|
||
|
|
||
|
"gotest.tools/assert"
|
||
|
)
|
||
|
|
||
|
func TestJMESPathFunctions_CompareEqualStrings(t *testing.T) {
|
||
|
jp, err := New("compare('a', 'a')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
equal, ok := result.(int)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, equal, 0)
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_CompareDifferentStrings(t *testing.T) {
|
||
|
jp, err := New("compare('a', 'b')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
equal, ok := result.(int)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, equal, -1)
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_Contains(t *testing.T) {
|
||
|
jp, err := New("contains('string', 'str')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
contains, ok := result.(bool)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Assert(t, contains)
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_EqualFold(t *testing.T) {
|
||
|
jp, err := New("equal_fold('Go', 'go')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
equal, ok := result.(bool)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Assert(t, equal)
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_Replace(t *testing.T) {
|
||
|
// Can't use integer literals due to
|
||
|
// https://github.com/jmespath/go-jmespath/issues/27
|
||
|
//
|
||
|
// TODO: fix this in https://github.com/kyverno/go-jmespath
|
||
|
//
|
||
|
|
||
|
jp, err := New("replace('Lorem ipsum dolor sit amet', 'ipsum', 'muspi', `-1`)")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
replaced, ok := result.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, replaced, "Lorem muspi dolor sit amet")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_ReplaceAll(t *testing.T) {
|
||
|
jp, err := New("replace_all('Lorem ipsum dolor sit amet', 'ipsum', 'muspi')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
replaced, ok := result.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, replaced, "Lorem muspi dolor sit amet")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_ToUpper(t *testing.T) {
|
||
|
jp, err := New("to_upper('abc')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
upper, ok := result.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, upper, "ABC")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_ToLower(t *testing.T) {
|
||
|
jp, err := New("to_lower('AbC')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
lower, ok := result.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, lower, "abc")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_Trim(t *testing.T) {
|
||
|
jp, err := New("trim('¡¡¡Hello, Gophers!!!', '!¡')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
trim, ok := result.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, trim, "Hello, Gophers")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_Split(t *testing.T) {
|
||
|
jp, err := New("split('Hello, Gophers', ', ')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
split, ok := result.([]string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, split[0], "Hello")
|
||
|
assert.Equal(t, split[1], "Gophers")
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_HasPrefix(t *testing.T) {
|
||
|
jp, err := New("starts_with('Gophers', 'Go')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
split, ok := result.(bool)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, split, true)
|
||
|
}
|
||
|
|
||
|
func TestJMESPathFunctions_HasSuffix(t *testing.T) {
|
||
|
jp, err := New("ends_with('Amigo', 'go')")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := jp.Search("")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
split, ok := result.(bool)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, split, true)
|
||
|
}
|
||
|
|
||
|
func Test_regexMatch(t *testing.T) {
|
||
|
data := make(map[string]interface{})
|
||
|
data["foo"] = "hgf'b1a2r'b12g"
|
||
|
|
||
|
query, err := New("regex_match('12.*', foo)")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := query.Search(data)
|
||
|
assert.NilError(t, err)
|
||
|
assert.Equal(t, true, result)
|
||
|
}
|
||
|
|
||
|
func Test_regexMatchWithNumber(t *testing.T) {
|
||
|
data := make(map[string]interface{})
|
||
|
data["foo"] = -12.0
|
||
|
|
||
|
query, err := New("regex_match('12.*', abs(foo))")
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, err := query.Search(data)
|
||
|
assert.NilError(t, err)
|
||
|
assert.Equal(t, true, result)
|
||
|
}
|
||
|
|
||
|
func Test_regexReplaceAll(t *testing.T) {
|
||
|
resourceRaw := []byte(`
|
||
|
{
|
||
|
"metadata": {
|
||
|
"name": "temp",
|
||
|
"namespace": "ns_first"
|
||
|
},
|
||
|
"spec": {
|
||
|
"namespace": "ns_first",
|
||
|
"name": "temp_other",
|
||
|
"field" : "Hello world, helworldlo"
|
||
|
}
|
||
|
}
|
||
|
`)
|
||
|
expected := "Glo world, Gworldlo"
|
||
|
|
||
|
var resource interface{}
|
||
|
err := json.Unmarshal(resourceRaw, &resource)
|
||
|
assert.NilError(t, err)
|
||
|
query, err := New(`regex_replace_all('([Hh]e|G)l', spec.field, '${2}G')`)
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
res, err := query.Search(resource)
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, ok := res.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
assert.Equal(t, string(result), expected)
|
||
|
}
|
||
|
|
||
|
func Test_regexReplaceAllLiteral(t *testing.T) {
|
||
|
resourceRaw := []byte(`
|
||
|
{
|
||
|
"metadata": {
|
||
|
"name": "temp",
|
||
|
"namespace": "ns_first"
|
||
|
},
|
||
|
"spec": {
|
||
|
"namespace": "ns_first",
|
||
|
"name": "temp_other",
|
||
|
"field" : "Hello world, helworldlo"
|
||
|
}
|
||
|
}
|
||
|
`)
|
||
|
expected := "Glo world, Gworldlo"
|
||
|
|
||
|
var resource interface{}
|
||
|
err := json.Unmarshal(resourceRaw, &resource)
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
query, err := New(`regex_replace_all_literal('[Hh]el?', spec.field, 'G')`)
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
res, err := query.Search(resource)
|
||
|
assert.NilError(t, err)
|
||
|
|
||
|
result, ok := res.(string)
|
||
|
assert.Assert(t, ok)
|
||
|
|
||
|
assert.Equal(t, string(result), expected)
|
||
|
}
|