@@ -22,6 +22,9 @@ import (
2222 "github.com/stretchr/testify/require"
2323)
2424
25+ // errInvalidFieldPath is the common prefix returned when a field path fails validation.
26+ const errInvalidFieldPath = "invalid field path"
27+
2528func TestBuildEntSelectorFromJSONFilter (t * testing.T ) {
2629 tests := []struct {
2730 name string
@@ -81,13 +84,52 @@ func TestBuildEntSelectorFromJSONFilter(t *testing.T) {
8184 filter : & JSONFilter {Column : "metadata" , FieldPath : "env" , Operator : OpIN , Value : []string {"prod" , "dev" }},
8285 wantErr : "invalid value for 'in' operator: must be a slice of strings" ,
8386 },
87+ {
88+ name : "field path with array index" ,
89+ filter : & JSONFilter {Column : "metadata" , FieldPath : "items[0].name" , Operator : OpEQ , Value : "foo" },
90+ },
91+ {
92+ name : "field path with single quote breaks out of literal" ,
93+ filter : & JSONFilter {Column : "metadata" , FieldPath : "x'='x' OR (SELECT 1 FROM pg_sleep(2)) IS NOT NULL OR 'z" , Operator : OpEQ , Value : "true" },
94+ wantErr : errInvalidFieldPath ,
95+ },
96+ {
97+ name : "field path with double quote" ,
98+ filter : & JSONFilter {Column : "metadata" , FieldPath : `name"` , Operator : OpEQ , Value : "foo" },
99+ wantErr : errInvalidFieldPath ,
100+ },
101+ {
102+ name : "field path with semicolon" ,
103+ filter : & JSONFilter {Column : "metadata" , FieldPath : "name;DROP TABLE workflows" , Operator : OpEQ , Value : "foo" },
104+ wantErr : errInvalidFieldPath ,
105+ },
106+ {
107+ name : "field path with whitespace" ,
108+ filter : & JSONFilter {Column : "metadata" , FieldPath : "name OR 1=1" , Operator : OpEQ , Value : "foo" },
109+ wantErr : errInvalidFieldPath ,
110+ },
111+ {
112+ name : "field path with parenthesis" ,
113+ filter : & JSONFilter {Column : "metadata" , FieldPath : "pg_sleep(2)" , Operator : OpEQ , Value : "foo" },
114+ wantErr : errInvalidFieldPath ,
115+ },
116+ {
117+ name : "field path with leading digit segment" ,
118+ filter : & JSONFilter {Column : "metadata" , FieldPath : "1name" , Operator : OpEQ , Value : "foo" },
119+ wantErr : errInvalidFieldPath ,
120+ },
121+ {
122+ name : "field path with trailing dot" ,
123+ filter : & JSONFilter {Column : "metadata" , FieldPath : "name." , Operator : OpEQ , Value : "foo" },
124+ wantErr : errInvalidFieldPath ,
125+ },
84126 }
85127
86128 for _ , tc := range tests {
87129 t .Run (tc .name , func (t * testing.T ) {
88130 pred , err := BuildEntSelectorFromJSONFilter (tc .filter )
89131 if tc .wantErr != "" {
90- require .EqualError (t , err , tc .wantErr )
132+ require .ErrorContains (t , err , tc .wantErr )
91133 assert .Nil (t , pred )
92134 } else {
93135 require .NoError (t , err )
0 commit comments