Skip to content

Commit

Permalink
fix(server): fix trigger json encoding versioning and test (#2795)
Browse files Browse the repository at this point in the history
  • Loading branch information
schoren authored and mathnogueira committed Jun 26, 2023
1 parent 0901999 commit 40af921
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 27 deletions.
13 changes: 11 additions & 2 deletions server/test/trigger/trigger_json.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import (
"encoding/json"

"github.com/fluidtruck/deepcopy"
jsoniter "github.com/json-iterator/go"
)

type triggerJSONV3 struct {
Type TriggerType `json:"trigger"`
Type TriggerType `json:"type"`
HTTP *HTTPRequest `json:"http,omitempty"`
GRPC *GRPCRequest `json:"grpc,omitempty"`
TraceID *TraceIDRequest `json:"traceid,omitempty"`
Expand Down Expand Up @@ -65,6 +66,14 @@ func (t *Trigger) UnmarshalJSON(data []byte) error {
var err error
// start with older versions and move up to the latest
v1 := triggerJSONV1{}

// DO NOT USE encoding/json here. the match is case insensitive, and can lead to unexpected results.
// see https://stackoverflow.com/a/49006601
var json = jsoniter.Config{
EscapeHTML: true,
CaseSensitive: true,
}.Froze()

err = json.Unmarshal(data, &v1)
if err != nil {
return err
Expand All @@ -83,7 +92,7 @@ func (t *Trigger) UnmarshalJSON(data []byte) error {
return deepcopy.DeepCopy(v2, t)
}

// v2
// v3
v3 := triggerJSONV3{}
err = json.Unmarshal(data, &v3)
if err != nil {
Expand Down
82 changes: 57 additions & 25 deletions server/test/trigger/trigger_json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,37 @@ import (
"encoding/json"
"testing"

"github.com/kubeshop/tracetest/server/model"
"github.com/kubeshop/tracetest/server/test/trigger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestTriggerFormatV1(t *testing.T) {
v1 := struct {
Type model.TriggerType
HTTP *model.HTTPRequest
GRPC *model.GRPCRequest
TraceID *model.TRACEIDRequest
Type trigger.TriggerType
HTTP *trigger.HTTPRequest
GRPC *trigger.GRPCRequest
TraceID *trigger.TraceIDRequest
}{
Type: model.TriggerTypeHTTP,
HTTP: &model.HTTPRequest{
Method: model.HTTPMethodGET,
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

expected := model.Trigger{
Type: model.TriggerTypeHTTP,
HTTP: &model.HTTPRequest{
Method: model.HTTPMethodGET,
expected := trigger.Trigger{
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

v1Json, err := json.Marshal(v1)
require.NoError(t, err)

current := model.Trigger{}
current := trigger.Trigger{}
err = json.Unmarshal(v1Json, &current)
require.NoError(t, err)

Expand All @@ -43,32 +43,64 @@ func TestTriggerFormatV1(t *testing.T) {

func TestTriggerFormatV2(t *testing.T) {
v2 := struct {
Type model.TriggerType `json:"triggerType"`
HTTP *model.HTTPRequest `json:"http,omitempty"`
GRPC *model.GRPCRequest `json:"grpc,omitempty"`
TraceID *model.TRACEIDRequest `json:"traceid,omitempty"`
Type trigger.TriggerType `json:"triggerType"`
HTTP *trigger.HTTPRequest `json:"http,omitempty"`
GRPC *trigger.GRPCRequest `json:"grpc,omitempty"`
TraceID *trigger.TraceIDRequest `json:"traceid,omitempty"`
}{
Type: model.TriggerTypeHTTP,
HTTP: &model.HTTPRequest{
Method: model.HTTPMethodGET,
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

expected := model.Trigger{
Type: model.TriggerTypeHTTP,
HTTP: &model.HTTPRequest{
Method: model.HTTPMethodGET,
expected := trigger.Trigger{
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

v2Json, err := json.Marshal(v2)
require.NoError(t, err)

current := model.Trigger{}
current := trigger.Trigger{}
err = json.Unmarshal(v2Json, &current)
require.NoError(t, err)

assert.Equal(t, expected, current)
}

func TestTriggerFormatV3(t *testing.T) {
v3 := struct {
Type trigger.TriggerType `json:"type"`
HTTP *trigger.HTTPRequest `json:"http,omitempty"`
GRPC *trigger.GRPCRequest `json:"grpc,omitempty"`
TraceID *trigger.TraceIDRequest `json:"traceid,omitempty"`
}{
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

expected := trigger.Trigger{
Type: trigger.TriggerTypeHTTP,
HTTP: &trigger.HTTPRequest{
Method: trigger.HTTPMethodGET,
URL: "http://example.com/list",
},
}

v3Json, err := json.Marshal(v3)
require.NoError(t, err)

current := trigger.Trigger{}
err = json.Unmarshal(v3Json, &current)
require.NoError(t, err)

assert.Equal(t, expected, current)
}

0 comments on commit 40af921

Please sign in to comment.