Skip to content

Commit

Permalink
Validate predicates (#236)
Browse files Browse the repository at this point in the history
* Validate predicates

* Tests
  • Loading branch information
Jleagle authored Jan 31, 2025
1 parent 4686ad4 commit 32addd9
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
29 changes: 29 additions & 0 deletions utils/validate.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package utils

import (
"bytes"
"fmt"
"strings"

"github.com/chargehive/configuration/connectorconfig"
Expand Down Expand Up @@ -32,6 +34,12 @@ func Validate(rawJson []byte, version string) map[string]string {
return result
}

errs := validatePredicates(o.Selector.Expressions)
if errs != "" {
result["validation expressions"] = errs
return result
}

validate = validator.New()
// register custom validators
err = validate.RegisterValidation("predicate-key", PredicateKeysValidator)
Expand Down Expand Up @@ -99,3 +107,24 @@ func ConnectorLibraryValidator(fl validator.FieldLevel) bool {
_, ok := connectorconfig.LibraryRegister[connectorconfig.Library(fl.Field().String())]
return ok
}

func validatePredicates(predicates []selector.Predicate) string {

buff := bytes.NewBufferString("")

for _, predicate := range predicates {

switch predicate.Operator {
case selector.PredicateOperatorEqual, selector.PredicateOperatorNotEqual:
if len(predicate.Values) != 1 {
buff.WriteString(fmt.Sprintf("An %s operator must have exactly one value\n", predicate.Operator))
}
case selector.PredicateOperatorIn, selector.PredicateOperatorNotIn, selector.PredicateOperatorInLike, selector.PredicateOperatorNotInLike:
if len(predicate.Values) <= 1 {
buff.WriteString(fmt.Sprintf("An %s operator must have at least two values\n", predicate.Operator))
}
}
}

return strings.TrimSpace(buff.String())
}
51 changes: 51 additions & 0 deletions utils/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"testing"

"github.com/chargehive/configuration"
"github.com/chargehive/configuration/selector"
"github.com/go-playground/assert/v2"
)

Expand Down Expand Up @@ -80,6 +81,56 @@ func TestEmptyFields(t *testing.T) {
assert.Equal(t, 0, len(errs))
}

// Test for invalid predicates
func TestInvalidPredicates(t *testing.T) {

var tests = []struct {
operator selector.PredicateOperator
values []string
valid bool
}{
{selector.PredicateOperatorEqual, []string{}, false},
{selector.PredicateOperatorEqual, []string{"one"}, true},
{selector.PredicateOperatorEqual, []string{"one", "two"}, false},

{selector.PredicateOperatorNotEqual, []string{}, false},
{selector.PredicateOperatorNotEqual, []string{"one"}, true},
{selector.PredicateOperatorNotEqual, []string{"one", "two"}, false},

{selector.PredicateOperatorIn, []string{}, false},
{selector.PredicateOperatorIn, []string{"one"}, false},
{selector.PredicateOperatorIn, []string{"one", "two"}, true},

{selector.PredicateOperatorNotIn, []string{}, false},
{selector.PredicateOperatorNotIn, []string{"one"}, false},
{selector.PredicateOperatorNotIn, []string{"one", "two"}, true},

{selector.PredicateOperatorInLike, []string{}, false},
{selector.PredicateOperatorInLike, []string{"one"}, false},
{selector.PredicateOperatorInLike, []string{"one", "two"}, true},

{selector.PredicateOperatorNotInLike, []string{}, false},
{selector.PredicateOperatorNotInLike, []string{"one"}, false},
{selector.PredicateOperatorNotInLike, []string{"one", "two"}, true},
}

configuration.Initialise()

for _, v := range tests {

values, _ := json.Marshal(v.values)
rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.label.unsubscribed","operator":"` + string(v.operator) + `","values":` + string(values) + `}]},"spec":{"library":"paysafe","configuration":"eyJtZXJjaGFudFVybCI6ImNoYW5nZS1tZSIsImFjcXVpcmVyIjoiY2hhbmdlLW1lIiwiYWNjb3VudElEIjoiY2hhbmdlLW1lIiwiYXBpVXNlcm5hbWUiOiJjaGFuZ2UtbWUiLCJhcGlQYXNzd29yZCI6ImNoYW5nZS1tZSIsImVudmlyb25tZW50IjoiTU9DSyIsImNvdW50cnkiOiIiLCJjdXJyZW5jeSI6IlVTRCIsInVzZVZhdWx0IjpmYWxzZSwic2luZ2xlVXNlVG9rZW5QYXNzd29yZCI6IiIsInNpbmdsZVVzZVRva2VuVXNlcm5hbWUiOiIifQ=="}}`)

errs := Validate(rawJson, "v1")
if v.valid {
assert.Equal(t, 0, len(errs))
} else {
fmt.Println(errs)
assert.Equal(t, 1, len(errs))
}
}
}

func PrettyPrint(v interface{}) (err error) {
b, err := json.MarshalIndent(v, "", " ")
if err == nil {
Expand Down

0 comments on commit 32addd9

Please sign in to comment.