From dcb6a15f1848390f1eb6cdca7f1c8a8a4f11e9fc Mon Sep 17 00:00:00 2001 From: Jayachand Date: Mon, 4 Sep 2023 22:39:12 +0530 Subject: [PATCH] chore: populate context with validation errors when context is nil (#3815) --- processor/trackingplan.go | 20 ++++++-- processor/trackingplan_test.go | 88 ++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/processor/trackingplan.go b/processor/trackingplan.go index 7a6555dcb6..10ca7a983f 100644 --- a/processor/trackingplan.go +++ b/processor/trackingplan.go @@ -29,12 +29,22 @@ func reportViolations(validateEvent *transformer.TransformerResponse, trackingPl validationErrors := validateEvent.ValidationErrors output := validateEvent.Output - eventContext, castOk := output["context"].(map[string]interface{}) - if castOk { - eventContext["trackingPlanId"] = trackingPlanId - eventContext["trackingPlanVersion"] = trackingPlanVersion - eventContext["violationErrors"] = validationErrors + eventContext, ok := output["context"] + if !ok || eventContext == nil { + context := make(map[string]interface{}) + context["trackingPlanId"] = trackingPlanId + context["trackingPlanVersion"] = trackingPlanVersion + context["violationErrors"] = validationErrors + output["context"] = context + return + } + context, castOk := eventContext.(map[string]interface{}) + if !castOk { + return } + context["trackingPlanId"] = trackingPlanId + context["trackingPlanVersion"] = trackingPlanVersion + context["violationErrors"] = validationErrors } // enhanceWithViolation It enhances extra information of ValidationErrors in context for: diff --git a/processor/trackingplan_test.go b/processor/trackingplan_test.go index 6383128cc5..88366df505 100644 --- a/processor/trackingplan_test.go +++ b/processor/trackingplan_test.go @@ -58,6 +58,56 @@ func TestReportViolations(t *testing.T) { } }) + t.Run("Not propagating validation errors when context is not map", func(t *testing.T) { + var ( + trackingPlanId string + trackingPlanVersion int + ) + + response := transformer.Response{ + Events: []transformer.TransformerResponse{ + { + Metadata: transformer.Metadata{ + MergedTpConfig: map[string]interface{}{ + "propagateValidationErrors": "false", + }, + }, + Output: map[string]interface{}{ + "context": "some context", + }, + }, + }, + FailedEvents: []transformer.TransformerResponse{ + { + Metadata: transformer.Metadata{ + MergedTpConfig: map[string]interface{}{ + "propagateValidationErrors": "true", + }, + }, + Output: map[string]interface{}{ + "context": 1234, + }, + ValidationErrors: []transformer.ValidationError{ + { + Type: "Datatype-Mismatch", + Meta: map[string]string{ + "schemaPath": "#/properties/properties/properties/price/type", + "instacePath": "/properties/price", + }, + Message: "must be number", + }, + }, + }, + }, + } + + enhanceWithViolation(response, trackingPlanId, trackingPlanVersion) + for _, event := range eventsFromTransformerResponse(&response) { + _, castOk := event.Output["context"].(map[string]interface{}) + assert.False(t, castOk) + } + }) + t.Run("Propagate validation errors", func(t *testing.T) { response := transformer.Response{ Events: []transformer.TransformerResponse{ @@ -81,6 +131,26 @@ func TestReportViolations(t *testing.T) { }, }, }, + { + Metadata: transformer.Metadata{ + MergedTpConfig: map[string]interface{}{ + "propagateValidationErrors": "true", + }, + }, + Output: map[string]interface{}{ + "context": nil, + }, + ValidationErrors: []transformer.ValidationError{ + { + Type: "Datatype-Mismatch", + Meta: map[string]string{ + "schemaPath": "#/properties/properties/properties/price/type", + "instacePath": "/properties/price", + }, + Message: "must be number", + }, + }, + }, }, FailedEvents: []transformer.TransformerResponse{ { @@ -103,6 +173,24 @@ func TestReportViolations(t *testing.T) { }, }, }, + { + Metadata: transformer.Metadata{ + MergedTpConfig: map[string]interface{}{ + "propagateValidationErrors": "true", + }, + }, + Output: map[string]interface{}{}, + ValidationErrors: []transformer.ValidationError{ + { + Type: "Datatype-Mismatch", + Meta: map[string]string{ + "schemaPath": "#/properties/properties/properties/price/type", + "instacePath": "/properties/price", + }, + Message: "must be number", + }, + }, + }, }, } trackingPlanId := "tp_2BFrdaslxH9A7B2hSDFKxw8wPN6knOb57"