diff --git a/service/slack/slack_service_test.go b/service/slack/slack_service_test.go index 3c275ec..9582ead 100644 --- a/service/slack/slack_service_test.go +++ b/service/slack/slack_service_test.go @@ -5,8 +5,12 @@ import ( "fmt" "github.com/slack-go/slack" "github.com/stretchr/testify/suite" + "houston/common/util" "houston/logger" "houston/mocks" + "houston/model/incident" + "houston/model/severity" + "houston/model/team" "testing" ) @@ -307,6 +311,333 @@ func (suite *SlackServiceSuite) Test_GetUsersInfo_UsersMoreThanSplitSize() { suite.Equal(uint64(3), suite.SocketModeClientWrapper.GetUsersInfoAfterCounter(), "GetUsersInfo must be called thrice") } +func (suite *SlackServiceSuite) Test_CreateSlackChannel() { + suite.SocketModeClientWrapper.CreateConversationMock.Return(GetMockChannel(), nil) + + channel, err := suite.SlackService.CreateSlackChannel(1) + suite.NoError(err, "service must not throw error") + suite.NotNil(channel, "channel must not be nil") +} + +func (suite *SlackServiceSuite) Test_UploadFilesToChannel_AllSuccess() { + filePaths := []string{GetMockFilePath(), GetMockFilePath(), GetMockFilePath()} + suite.SocketModeClientWrapper.UploadFileMock.Return(&slack.File{}, nil) + + suite.SlackService.UploadFilesToChannel(filePaths, GetMockChannelID()) + suite.Equal(uint64(len(filePaths)), suite.SocketModeClientWrapper.UploadFileAfterCounter(), "UploadFile must be called thrice") +} + +func (suite *SlackServiceSuite) Test_UploadFilesToChannel_AllError() { + filePaths := []string{GetMockFilePath() + "1", GetMockFilePath() + "2", GetMockFilePath() + "3"} + channelId := GetMockChannelID() + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[0], + Channels: []string{channelId}, + }).Then(nil, GetMockSlackError()) + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[1], + Channels: []string{channelId}, + }).Then(nil, GetMockSlackError()) + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[2], + Channels: []string{channelId}, + }).Then(nil, GetMockSlackError()) + + suite.SlackService.UploadFilesToChannel(filePaths, channelId) + suite.Equal(uint64(len(filePaths)), suite.SocketModeClientWrapper.UploadFileAfterCounter(), "UploadFile must be called thrice") +} + +func (suite *SlackServiceSuite) Test_UploadFilesToChannel_PartialSuccessPartialError() { + filePaths := []string{GetMockFilePath() + "1", GetMockFilePath() + "2", GetMockFilePath() + "3"} + channelId := GetMockChannelID() + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[0], + Channels: []string{channelId}, + }).Then(&slack.File{}, nil) + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[1], + Channels: []string{channelId}, + }).Then(nil, GetMockSlackError()) + suite.SocketModeClientWrapper.UploadFileMock.When(slack.FileUploadParameters{ + File: filePaths[2], + Channels: []string{channelId}, + }).Then(&slack.File{}, nil) + + suite.SlackService.UploadFilesToChannel(filePaths, channelId) + suite.Equal(uint64(len(filePaths)), suite.SocketModeClientWrapper.UploadFileAfterCounter(), "UploadFile must be called thrice") +} + +func (suite *SlackServiceSuite) Test_AddBookmark_FailureCase() { + suite.SocketModeClientWrapper.AddBookmarkMock.Return(slack.Bookmark{}, GetMockSlackError()) + + suite.SlackService.AddBookmark(GetMockMessageText(), GetMockChannelID(), GetMockMessageText()) + suite.Equal(uint64(1), suite.SocketModeClientWrapper.AddBookmarkAfterCounter(), "AddBookmark must be called once") +} + +func (suite *SlackServiceSuite) Test_AddBookmark_SuccessCase() { + suite.SocketModeClientWrapper.AddBookmarkMock.Return(slack.Bookmark{}, nil) + + suite.SlackService.AddBookmark(GetMockMessageText(), GetMockChannelID(), GetMockMessageText()) + suite.Equal(uint64(1), suite.SocketModeClientWrapper.AddBookmarkAfterCounter(), "AddBookmark must be called once") +} + +func (suite *SlackServiceSuite) Test_GetConversationReplies_FailureCase() { + suite.SocketModeClientWrapper.GetConversationRepliesMock.Return(nil, false, "", GetMockSlackError()) + + msg, hasMore, nextCursor, err := suite.SlackService.GetConversationReplies(GetMockChannelID(), GetMockTimeStamp(), 1) + suite.Error(err, "service must throw error") + suite.Nil(msg, "msg must be nil") + suite.False(hasMore, "hasMore must be false") + suite.Empty(nextCursor, "nextCursor must be empty") +} + +func (suite *SlackServiceSuite) Test_GetConversationReplies_SuccessCase() { + suite.SocketModeClientWrapper.GetConversationRepliesMock.Return([]slack.Message{}, false, "", nil) + + msg, _, _, err := suite.SlackService.GetConversationReplies(GetMockChannelID(), GetMockTimeStamp(), 1) + suite.NoError(err, "service must not throw error") + suite.NotNil(msg, "msg must not be nil") +} + +func (suite *SlackServiceSuite) Test_SetChannelTopic_FailureCase() { + suite.SocketModeClientWrapper.SetTopicOfConversationMock.Return(nil, GetMockSlackError()) + + err := suite.SlackService.SetChannelTopic(GetMockChannel(), &team.TeamEntity{}, &severity.SeverityEntity{}, &incident.IncidentEntity{}) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_SetChannelTopic_SuccessCase() { + suite.SocketModeClientWrapper.SetTopicOfConversationMock.Return(GetMockChannel(), nil) + + err := suite.SlackService.SetChannelTopic(GetMockChannel(), &team.TeamEntity{}, &severity.SeverityEntity{}, &incident.IncidentEntity{}) + suite.NoError(err, "service must not throw error") +} + +func (suite *SlackServiceSuite) Test_JoinConversation_FailureCase() { + suite.SocketModeClientWrapper.JoinConversationMock.Return(nil, "", nil, GetMockSlackError()) + + channel, warning, warnings, err := suite.SlackService.JoinConversation(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(channel, "channel must be nil") + suite.Empty(warning, "warning must be empty") + suite.Empty(warnings, "warnings must be empty") +} + +func (suite *SlackServiceSuite) Test_JoinConversation_SuccessCase() { + suite.SocketModeClientWrapper.JoinConversationMock.Return(GetMockChannel(), "", nil, nil) + + channel, _, _, err := suite.SlackService.JoinConversation(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(channel, "channel must not be nil") +} + +func (suite *SlackServiceSuite) Test_GetAllUsersInConversation_FailureCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(nil, "", GetMockSlackError()) + + users, err := suite.SlackService.GetAllUsersInConversation(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(users, "users must be nil") +} + +func (suite *SlackServiceSuite) Test_GetAllUsersInConversation_SuccessCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(2), "", nil) + + users, err := suite.SlackService.GetAllUsersInConversation(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(users, "users must not be nil") + suite.NotEmpty(users, "users must not be empty") +} + +func (suite *SlackServiceSuite) Test_CheckUserInConversation_FailureCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(nil, "", GetMockSlackError()) + + result, err := suite.SlackService.CheckUserInConversation(GetMockUserID(), GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.False(result, "result must be false") +} + +func (suite *SlackServiceSuite) Test_CheckUserInConversation_NilUsersCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(nil, "", nil) + + result, err := suite.SlackService.CheckUserInConversation(GetMockUserID(), GetMockChannelID()) + suite.Nil(err, "service must not throw error") + suite.False(result, "result must be false") +} + +func (suite *SlackServiceSuite) Test_CheckUserInConversation_EmptyUsersCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(0), "", nil) + + result, err := suite.SlackService.CheckUserInConversation(GetMockUserID(), GetMockChannelID()) + suite.Nil(err, "service must not throw error") + suite.False(result, "result must be false") +} + +func (suite *SlackServiceSuite) Test_CheckUserInConversation_NonExistenceCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(2), "", nil) + + result, err := suite.SlackService.CheckUserInConversation(GetMockUserID(), GetMockChannelID()) + suite.Nil(err, "service must not throw error") + suite.False(result, "result must be false") +} + +func (suite *SlackServiceSuite) Test_CheckUserInConversation_ExistenceCase() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(2), "", nil) + + result, err := suite.SlackService.CheckUserInConversation(GetMockUserIds(1)[0], GetMockChannelID()) + suite.Nil(err, "service must not throw error") + suite.True(result, "result must be true") +} + +func (suite *SlackServiceSuite) Test_GetConversationInfo_FailureCase() { + suite.SocketModeClientWrapper.GetConversationInfoMock.Return(nil, GetMockSlackError()) + + channel, err := suite.SlackService.GetConversationInfo(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(channel, "channel must be nil") +} + +func (suite *SlackServiceSuite) Test_GetConversationInfo_SuccessCase() { + suite.SocketModeClientWrapper.GetConversationInfoMock.Return(GetMockChannel(), nil) + + channel, err := suite.SlackService.GetConversationInfo(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(channel, "channel must not be nil") +} + +func (suite *SlackServiceSuite) Test_InviteUsersToConversation_UserInfoFetchingFailure() { + userIds := GetMockUserIds(3) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(nil, GetMockSlackError()) + + err := suite.SlackService.InviteUsersToConversation(GetMockChannelID(), userIds...) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_InviteUsersToConversation_InviteUsersFailure() { + userIds := GetMockUserIds(3) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(GetMockUsers(3), nil) + suite.SocketModeClientWrapper.InviteUsersToConversationMock.Return(nil, GetMockSlackError()) + + err := suite.SlackService.InviteUsersToConversation(GetMockChannelID(), userIds...) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_InviteUsersToConversation_SuccessCase() { + userIds := GetMockUserIds(3) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(GetMockUsers(3), nil) + suite.SocketModeClientWrapper.InviteUsersToConversationMock.Return(GetMockChannel(), nil) + + err := suite.SlackService.InviteUsersToConversation(GetMockChannelID(), userIds...) + suite.NoError(err, "service must not throw error") +} + +func (suite *SlackServiceSuite) Test_GetNonBotUsersInConversation_GetUserInConversationFailure() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(nil, "", GetMockSlackError()) + + users, err := suite.SlackService.GetNonBotUsersInConversation(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(users, "users must be nil") +} + +func (suite *SlackServiceSuite) Test_GetNonBotUsersInConversation_GetUsersInfoFailure() { + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(3), "", nil) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(nil, GetMockSlackError()) + + users, _ := suite.SlackService.GetNonBotUsersInConversation(GetMockChannelID()) + suite.Nil(users, "users must be nil") +} + +func (suite *SlackServiceSuite) Test_GetNonBotUsersInConversation_SuccessCase() { + mockUsers := GetMockUsers(3) + (*mockUsers)[0].IsBot = true + + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(3), "", nil) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(mockUsers, nil) + + users, err := suite.SlackService.GetNonBotUsersInConversation(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(users, "users must not be nil") + suite.Len(users, 2, "users length must be equal") +} + +func (suite *SlackServiceSuite) Test_GetChannelConversationHistory_GetConversationHistoryGenericError() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(nil, GetMockSlackError()) + + messages, err := suite.SlackService.GetChannelConversationHistory(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(messages, "messages must be nil") +} + +func (suite *SlackServiceSuite) Test_GetChannelConversationHistory_NotInChannelErrorJoinConversationFailure() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(nil, GetMockSlackError_NotInChannel()) + suite.SocketModeClientWrapper.JoinConversationMock.Return(nil, "", nil, GetMockSlackError()) + + suite.SlackService.GetChannelConversationHistory(GetMockChannelID()) + suite.Equal(uint64(1), suite.SocketModeClientWrapper.GetConversationHistoryAfterCounter(), "GetConversationHistory must be called once") +} + +func (suite *SlackServiceSuite) Test_GetChannelConversationHistory_NotInChannelErrorJoinConversationSuccess() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(nil, GetMockSlackError_NotInChannel()) + suite.SocketModeClientWrapper.JoinConversationMock.Return(GetMockChannel(), "", nil, nil) + + suite.SlackService.GetChannelConversationHistory(GetMockChannelID()) + suite.Equal(uint64(2), suite.SocketModeClientWrapper.GetConversationHistoryAfterCounter(), "GetConversationHistory must be called twice") +} + +func (suite *SlackServiceSuite) Test_GetChannelConversationHistory_SuccessCase() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(GetMockConversationHistory(), nil) + + messages, err := suite.SlackService.GetChannelConversationHistory(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(messages, "messages must not be nil") +} + +func (suite *SlackServiceSuite) Test_GetSlackConversationHistoryWithReplies_GetChannelConversationHistoryError() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(nil, GetMockSlackError()) + + messages, err := suite.SlackService.GetSlackConversationHistoryWithReplies(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(messages, "messages must be nil") +} + +func (suite *SlackServiceSuite) Test_GetSlackConversationHistoryWithReplies_GetAllUsersInConversationError() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(GetMockConversationHistory(), nil) + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(nil, "", GetMockSlackError()) + + messages, err := suite.SlackService.GetSlackConversationHistoryWithReplies(GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(messages, "messages must be nil") +} + +func (suite *SlackServiceSuite) Test_GetSlackConversationHistoryWithReplies_GetUsersInfoError() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(GetMockConversationHistory(), nil) + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(3), "", nil) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(nil, GetMockSlackError()) + + messages, _ := suite.SlackService.GetSlackConversationHistoryWithReplies(GetMockChannelID()) + suite.NotNil(messages, "messages must not be nil") +} + +func (suite *SlackServiceSuite) Test_GetSlackConversationHistoryWithReplies_GetConversationRepliesError() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(GetMockConversationHistory(), nil) + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(3), "", nil) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(GetMockUsers(3), nil) + suite.SocketModeClientWrapper.GetConversationRepliesMock.Return(nil, false, "", GetMockSlackError()) + + messages, _ := suite.SlackService.GetSlackConversationHistoryWithReplies(GetMockChannelID()) + suite.NotNil(messages, "messages must not be nil") +} + +func (suite *SlackServiceSuite) Test_GetSlackConversationHistoryWithReplies_SuccessCase() { + suite.SocketModeClientWrapper.GetConversationHistoryMock.Return(GetMockConversationHistory(), nil) + suite.SocketModeClientWrapper.GetUsersInConversationMock.Return(GetMockUserIds(3), "", nil) + suite.SocketModeClientWrapper.GetUsersInfoMock.Return(GetMockUsers(3), nil) + suite.SocketModeClientWrapper.GetConversationRepliesMock.Return(GetMockSlackMessages(), false, "", nil) + + messages, err := suite.SlackService.GetSlackConversationHistoryWithReplies(GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(messages, "messages must not be nil") +} + func GetMockMessageText() string { return "Hello World!" } @@ -331,6 +662,10 @@ func GetMockSlackError() error { return errors.New("failed to send message") } +func GetMockSlackError_NotInChannel() error { + return errors.New(util.NotInChannelError) +} + func GetMockFilePath() string { return "mock/file/path" } @@ -385,6 +720,19 @@ func GetMockChannel() *slack.Channel { } } +func GetMockConversationHistory() *slack.GetConversationHistoryResponse { + return &slack.GetConversationHistoryResponse{ + Messages: GetMockSlackMessages(), + } +} + +func GetMockSlackMessages() []slack.Message { + return []slack.Message{ + {Msg: slack.Msg{User: "U1", Text: "Hello World!"}}, + {Msg: slack.Msg{User: "U2", Text: "Hello World!"}}, + } +} + func (suite *SlackServiceSuite) SetupTest() { logger.InitLogger() suite.SocketModeClientWrapper = *mocks.NewISocketModeClientWrapperMock(suite.T())