diff --git a/service/slack/slack_service_test.go b/service/slack/slack_service_test.go new file mode 100644 index 0000000..f603697 --- /dev/null +++ b/service/slack/slack_service_test.go @@ -0,0 +1,216 @@ +package slack + +import ( + "errors" + "github.com/slack-go/slack" + "github.com/stretchr/testify/suite" + "houston/logger" + "houston/mocks" + "testing" +) + +type SlackServiceSuite struct { + suite.Suite + SlackService *SlackService + SocketModeClientWrapper mocks.ISocketModeClientWrapperMock +} + +func (suite *SlackServiceSuite) Test_SendDM_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + err := suite.SlackService.SendDM(GetMockRecipientID(), GetMockMessageText()) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_SendDM_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + err := suite.SlackService.SendDM(GetMockRecipientID(), GetMockMessageText()) + suite.NoError(err, "service must not throw error") +} + +func (suite *SlackServiceSuite) Test_PostMessage_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + timeStamp, err := suite.SlackService.PostMessage(GetMockMessageText(), false, GetMockChannel()) + suite.Error(err, "service must throw error") + suite.Empty(timeStamp, "timeStamp must be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessage_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + timeStamp, err := suite.SlackService.PostMessage(GetMockMessageText(), false, GetMockChannel()) + suite.NoError(err, "service must not throw error") + suite.NotEmpty(timeStamp, "timeStamp must not be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageOption_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + timeStamp, err := suite.SlackService.PostMessageOption(GetMockChannelID(), GetMockMessageOption()) + suite.Error(err, "service must throw error") + suite.Empty(timeStamp, "timeStamp must be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageOption_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + timeStamp, err := suite.SlackService.PostMessageOption(GetMockChannelID(), GetMockMessageOption()) + suite.NoError(err, "service must not throw error") + suite.NotEmpty(timeStamp, "timeStamp must not be empty") +} + +func (suite *SlackServiceSuite) Test_UploadFileByPath_FailureCase() { + suite.SocketModeClientWrapper.UploadFileMock.Return(nil, GetMockSlackError()) + + file, err := suite.SlackService.UploadFileByPath(GetMockFilePath(), GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Nil(file, "file must be nil") +} + +func (suite *SlackServiceSuite) Test_UploadFileByPath_SuccessCase() { + suite.SocketModeClientWrapper.UploadFileMock.Return(&slack.File{}, nil) + + file, err := suite.SlackService.UploadFileByPath(GetMockFilePath(), GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotNil(file, "file must not be nil") +} + +func (suite *SlackServiceSuite) Test_PostMessageByChannelID_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + timeStamp, err := suite.SlackService.PostMessageByChannelID(GetMockMessageText(), false, GetMockChannelID()) + suite.Error(err, "service must throw error") + suite.Empty(timeStamp, "timeStamp must be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageByChannelID_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + timeStamp, err := suite.SlackService.PostMessageByChannelID(GetMockMessageText(), false, GetMockChannelID()) + suite.NoError(err, "service must not throw error") + suite.NotEmpty(timeStamp, "timeStamp must not be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageWithAttachments_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + timeStamp, err := suite.SlackService.PostMessageWithAttachments(GetMockChannelID(), GetMockAttachment()) + suite.Error(err, "service must throw error") + suite.Empty(timeStamp, "timeStamp must be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageWithAttachments_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + timeStamp, err := suite.SlackService.PostMessageWithAttachments(GetMockChannelID(), GetMockAttachment()) + suite.NoError(err, "service must not throw error") + suite.NotEmpty(timeStamp, "timeStamp must not be empty") +} + +func (suite *SlackServiceSuite) Test_UpdateMessageWithAttachments_FailureCase() { + suite.SocketModeClientWrapper.UpdateMessageMock.Return("", "", "", GetMockSlackError()) + + err := suite.SlackService.UpdateMessageWithAttachments(GetMockChannelID(), GetMockTimeStamp(), GetMockAttachment()) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_UpdateMessageWithAttachments_SuccessCase() { + suite.SocketModeClientWrapper.UpdateMessageMock.Return("", "", "", nil) + + err := suite.SlackService.UpdateMessageWithAttachments(GetMockChannelID(), GetMockTimeStamp(), GetMockAttachment()) + suite.NoError(err, "service must not throw error") +} + +func (suite *SlackServiceSuite) Test_PostEphemeralByChannelID_FailureCase() { + suite.SocketModeClientWrapper.PostEphemeralMock.Return("", GetMockSlackError()) + + err := suite.SlackService.PostEphemeralByChannelID(GetMockMessageText(), GetMockRecipientID(), false, GetMockChannelID()) + suite.Error(err, "service must throw error") +} + +func (suite *SlackServiceSuite) Test_PostEphemeralByChannelID_SuccessCase() { + suite.SocketModeClientWrapper.PostEphemeralMock.Return(GetMockTimeStamp(), nil) + + err := suite.SlackService.PostEphemeralByChannelID(GetMockMessageText(), GetMockRecipientID(), false, GetMockChannelID()) + suite.NoError(err, "service must not throw error") +} + +func (suite *SlackServiceSuite) Test_PostMessageBlocks_FailureCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return("", "", GetMockSlackError()) + + timeStamp, err := suite.SlackService.PostMessageBlocks(GetMockChannelID(), GetMockBlock(), GetMockColor()) + suite.Error(err, "service must throw error") + suite.Empty(timeStamp, "timeStamp must be empty") +} + +func (suite *SlackServiceSuite) Test_PostMessageBlocks_SuccessCase() { + suite.SocketModeClientWrapper.PostMessageMock.Return(GetMockChannelID(), GetMockTimeStamp(), nil) + + timeStamp, err := suite.SlackService.PostMessageBlocks(GetMockChannelID(), GetMockBlock(), GetMockColor()) + suite.NoError(err, "service must not throw error") + suite.NotEmpty(timeStamp, "timeStamp must not be empty") +} + +func GetMockMessageText() string { + return "Hello World!" +} + +func GetMockMessageOption() slack.MsgOption { + return slack.MsgOptionText(GetMockMessageText(), false) +} + +func GetMockChannelID() string { + return "C123" +} + +func GetMockRecipientID() string { + return "U123" +} + +func GetMockTimeStamp() string { + return "1234" +} + +func GetMockSlackError() error { + return errors.New("failed to send message") +} + +func GetMockFilePath() string { + return "mock/file/path" +} + +func GetMockAttachment() slack.Attachment { + return slack.Attachment{} +} + +func GetMockBlock() slack.Blocks { + return slack.Blocks{} +} + +func GetMockColor() string { + return "red" +} + +func GetMockChannel() *slack.Channel { + return &slack.Channel{ + GroupConversation: slack.GroupConversation{}, + IsChannel: true, + IsGeneral: true, + IsMember: true, + Locale: "", + } +} + +func (suite *SlackServiceSuite) SetupSuite() { + logger.InitLogger() + suite.SocketModeClientWrapper = *mocks.NewISocketModeClientWrapperMock(suite.T()) + suite.SlackService = &SlackService{ + SocketModeClientWrapper: &suite.SocketModeClientWrapper, + } +} + +func TestSlackServiceSuite(t *testing.T) { + suite.Run(t, new(SlackServiceSuite)) +}