From dc1b42390b9bca393d03e2ccdbb16d66cd866431 Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Wed, 23 Sep 2020 18:32:47 +0300 Subject: [PATCH] [MM-28664] model/integration_action: fix panic for uncomparable types (#15514) * model/integration_action: fix panic for uncomparable types * model/integration_action: improve performance * reflect review comments Co-authored-by: Mattermod --- model/integration_action.go | 13 +++++-- model/integration_action_test.go | 62 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/model/integration_action.go b/model/integration_action.go index 3f362d64c1..a572c9dec3 100644 --- a/model/integration_action.go +++ b/model/integration_action.go @@ -16,6 +16,7 @@ import ( "io" "math/big" "net/http" + "reflect" "strconv" "strings" ) @@ -124,13 +125,19 @@ func (p *PostAction) Equals(input *PostAction) bool { for key, value := range p.Integration.Context { inputValue, ok := input.Integration.Context[key] - if !ok { return false } - if value != inputValue { - return false + switch inputValue.(type) { + case string, bool, int, float64: + if value != inputValue { + return false + } + default: + if !reflect.DeepEqual(value, inputValue) { + return false + } } } diff --git a/model/integration_action_test.go b/model/integration_action_test.go index 5b453dd6b7..a60ea55c9f 100644 --- a/model/integration_action_test.go +++ b/model/integration_action_test.go @@ -161,3 +161,65 @@ func TestSubmitDialogResponseToJson(t *testing.T) { assert.Nil(t, r) }) } + +func TestPostActionIntegrationEquals(t *testing.T) { + t.Run("equal uncomparable types", func(t *testing.T) { + pa1 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": map[string]interface{}{ + "a": 0, + }, + }, + }, + } + pa2 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": map[string]interface{}{ + "a": 0, + }, + }, + }, + } + require.True(t, pa1.Equals(pa2)) + }) + + t.Run("equal comparable types", func(t *testing.T) { + pa1 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": "test", + }, + }, + } + pa2 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": "test", + }, + }, + } + require.True(t, pa1.Equals(pa2)) + }) + + t.Run("non-equal types", func(t *testing.T) { + pa1 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": map[string]interface{}{ + "a": 0, + }, + }, + }, + } + pa2 := &PostAction{ + Integration: &PostActionIntegration{ + Context: map[string]interface{}{ + "a": "test", + }, + }, + } + require.False(t, pa1.Equals(pa2)) + }) +}