diff --git a/pkg/bot/export_test.go b/pkg/bot/export_test.go new file mode 100644 index 000000000..9b84f8848 --- /dev/null +++ b/pkg/bot/export_test.go @@ -0,0 +1,5 @@ +package bot + +func (b *SlackBot) StripUnmarshallingErrEventDetails(errMessage string) string { + return b.stripUnmarshallingErrEventDetails(errMessage) +} diff --git a/pkg/bot/slack.go b/pkg/bot/slack.go index 135c337fa..a02890f07 100644 --- a/pkg/bot/slack.go +++ b/pkg/bot/slack.go @@ -112,7 +112,7 @@ func (b *SlackBot) Start() { log.Errorf("Slack outgoing event error: %+v", ev.Error()) case *slack.UnmarshallingErrorEvent: - log.Errorf("Slack unmarshalling error: %+v", ev.Error()) + log.Errorf("Slack unmarshalling error: %+v", b.stripUnmarshallingErrEventDetails(ev.Error())) case *slack.RateLimitedError: log.Errorf("Slack rate limiting error: %+v", ev.Error()) @@ -126,6 +126,27 @@ func (b *SlackBot) Start() { } } +// Temporary workaround until the PR is merged: https://github.com/slack-go/slack/pull/1067 +// There are just two cases when the full event details are concatenated with the error message: https://github.com/slack-go/slack/blob/v0.10.3/websocket_managed_conn.go#L474-L492 +// Also, we need keep the JSON unmarshal error intact: https://github.com/slack-go/slack/blob/v0.10.3/websocket_managed_conn.go#L405 +func (b *SlackBot) stripUnmarshallingErrEventDetails(errMessage string) string { + const errMsgSeparator = ": " + const prefix = "RTM Error" + + if !strings.HasPrefix(errMessage, prefix) { + return errMessage + } + + // has prefix, so let's split the message into parts + msgParts := strings.Split(errMessage, errMsgSeparator) + if len(msgParts) < 3 { + // impossible with current version of the dependency + return errMessage + } + + return strings.Join(msgParts[:2], errMsgSeparator) +} + func (sm *slackMessage) HandleMessage(b *SlackBot) { // Check if message posted in authenticated channel info, err := sm.SlackClient.GetConversationInfo(sm.Event.Channel, true) diff --git a/pkg/bot/slack_test.go b/pkg/bot/slack_test.go new file mode 100644 index 000000000..8349c27ee --- /dev/null +++ b/pkg/bot/slack_test.go @@ -0,0 +1,53 @@ +package bot_test + +import ( + "fmt" + "github.com/infracloudio/botkube/pkg/bot" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSlackBot_StripUnmarshallingErrEventDetails(t *testing.T) { + //given + sampleEvent := `{"type":"user_huddle_changed","user":{"id":"id","team_id":"team_id"}, "event_ts":"1652949120.004700"}` + + testCases := []struct { + Name string + Input string + Expected string + }{ + { + Name: "Unmapped event", + Input: fmt.Sprintf(`RTM Error: Received unmapped event "user_huddle_changed": %s`, sampleEvent), + Expected: `RTM Error: Received unmapped event "user_huddle_changed"`, + }, + { + Name: "Unmarshalling error message", + Input: fmt.Sprintf(`RTM Error: Could not unmarshall event "user_huddle_changed": %s`, sampleEvent), + Expected: `RTM Error: Could not unmarshall event "user_huddle_changed"`, + }, + { + Name: "JSON unmarshal error", + Input: "cannot unmarshal bool into Go value of type string", + Expected: "cannot unmarshal bool into Go value of type string", + }, + { + Name: "JSON unmarshal error with colons", + // this is a real error when doing json.Unmarshal([]byte(`":::"`), &time) + Input: `parsing time "":::"" as ""2006-01-02T15:04:05Z07:00"": cannot parse ":::"" as "2006"`, + Expected: `parsing time "":::"" as ""2006-01-02T15:04:05Z07:00"": cannot parse ":::"" as "2006"`, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + slackBot := &bot.SlackBot{} + + // when + actual := slackBot.StripUnmarshallingErrEventDetails(testCase.Input) + + // then + assert.Equal(t, testCase.Expected, actual) + }) + } +}