From bc16ae1794ebb16f60b8c66e2d5ea533789bc4a0 Mon Sep 17 00:00:00 2001 From: TwinProduction Date: Tue, 29 Sep 2020 19:32:59 -0400 Subject: [PATCH] Add tests for comparing two placeholders --- README.md | 2 +- core/condition_test.go | 18 ++++++++++++++++++ core/util.go | 3 ++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8540417e..5d616c6c 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Here are some examples of conditions you can use: | `[BODY].data[0].id == 1` | JSONPath value of `$.data[0].id` is equal to 1 | `{"data":[{"id":1}]}` | | | `len([BODY].data) < 5` | Array at JSONPath `$.data` has less than 5 elements | `{"data":[{"id":1}]}` | | | `len([BODY].name) == 8` | String at JSONPath `$.name` has a length of 8 | `{"name":"john.doe"}` | `{"name":"bob"}` | - +| `[BODY].age == [BODY].id` | JSONPath value of `$.age` is equal JSONPath `$.id` | `{"user":{"name":"john"}}` | | ### Alerting diff --git a/core/condition_test.go b/core/condition_test.go index 845690b2..d72bd38b 100644 --- a/core/condition_test.go +++ b/core/condition_test.go @@ -113,6 +113,24 @@ func TestCondition_evaluateWithBodyJsonPathComplex(t *testing.T) { } } +func TestCondition_evaluateWithBodyJsonPathDoublePlaceholders(t *testing.T) { + condition := Condition("[BODY].user.firstName != [BODY].user.lastName") + result := &Result{Body: []byte("{\"user\": {\"firstName\": \"john\", \"lastName\": \"doe\"}}")} + condition.evaluate(result) + if !result.ConditionResults[0].Success { + t.Errorf("Condition '%s' should have been a success", condition) + } +} + +func TestCondition_evaluateWithBodyJsonPathDoublePlaceholdersFailure(t *testing.T) { + condition := Condition("[BODY].user.firstName == [BODY].user.lastName") + result := &Result{Body: []byte("{\"user\": {\"firstName\": \"john\", \"lastName\": \"doe\"}}")} + condition.evaluate(result) + if result.ConditionResults[0].Success { + t.Errorf("Condition '%s' should have been a failure", condition) + } +} + func TestCondition_evaluateWithBodyJsonPathLongInt(t *testing.T) { condition := Condition("[BODY].data.id == 1") result := &Result{Body: []byte("{\"data\": {\"id\": 1}}")} diff --git a/core/util.go b/core/util.go index 3d087e67..bc63dffb 100644 --- a/core/util.go +++ b/core/util.go @@ -19,6 +19,7 @@ const ( InvalidConditionElementSuffix = "(INVALID)" ) +// sanitizeAndResolve sanitizes and resolves a list of element and returns the list of resolved elements func sanitizeAndResolve(list []string, result *Result) []string { var sanitizedList []string body := strings.TrimSpace(string(result.Body)) @@ -34,7 +35,7 @@ func sanitizeAndResolve(list []string, result *Result) []string { case BodyPlaceHolder: element = body default: - // if starts with BodyPlaceHolder, then evaluate json path + // if contains the BodyPlaceHolder, then evaluate json path if strings.Contains(element, BodyPlaceHolder) { wantLength := false if strings.HasPrefix(element, LengthFunctionPrefix) && strings.HasSuffix(element, FunctionSuffix) {