Skip to content

Commit

Permalink
Merge pull request #17 from Brightscout/MI-809
Browse files Browse the repository at this point in the history
MI-809 Add test cases for channel subscription methods
  • Loading branch information
jatinkksharma authored Feb 14, 2020
2 parents e46727d + e34028a commit e09faa1
Show file tree
Hide file tree
Showing 15 changed files with 748 additions and 20 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ module github.com/Brightscout/mattermost-plugin-confluence
go 1.13

require (
bou.ke/monkey v1.0.2
github.com/blang/semver v3.6.1+incompatible // indirect
github.com/gorilla/mux v1.7.3
github.com/mattermost/mattermost-server v1.4.1-0.20191016162522-6597fdb40134 // Mattermost Server 5.16.0
github.com/oklog/run v1.0.1-0.20180308005104-6934b124db28 // indirect
github.com/pkg/errors v0.8.1
github.com/stretchr/testify v1.4.0
github.com/thoas/go-funk v0.5.0
go.uber.org/atomic v1.5.1
go.uber.org/multierr v1.4.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI=
bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
Expand Down
5 changes: 3 additions & 2 deletions server/command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ const (
"* `/confluence subscribe` - Subscribe the current channel to notifications from Confluence.\n" +
"* `/confluence unsubscribe \"<alias>\"` - Unsubscribe the current channel from notifications associated with the given alias.\n" +
"* `/confluence list` - List all subscriptions for the current channel.\n" +
"* `/confluence edit \"<alias>\"` - Edit the subscription settings associated with the given alias.\n"
"* `/confluence edit \"<alias>\"` - Edit the subscription settings associated with the given alias."
invalidCommand = "Invalid command parameters. Please use `/confluence help` for more information."
)

var ConfluenceCommandHandler = Handler{
Expand All @@ -52,7 +53,7 @@ func GetCommand() *model.Command {
func executeConfluenceDefault(context *model.CommandArgs, args ...string) *model.CommandResponse {
return &model.CommandResponse{
ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
Text: "Invalid command parameters. Please use `/confluence help` for more information.",
Text: invalidCommand,
}
}

Expand Down
16 changes: 14 additions & 2 deletions server/controller/save_subscription.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@ import (
"encoding/json"
"net/http"

"github.com/mattermost/mattermost-server/model"

"github.com/Brightscout/mattermost-plugin-confluence/server/config"
"github.com/Brightscout/mattermost-plugin-confluence/server/serializer"
"github.com/Brightscout/mattermost-plugin-confluence/server/service"
)

const subscriptionSaveSuccess = "Your subscription has been saved."

var saveChannelSubscription = &Endpoint{
RequiresAuth: true,
Path: "/subscription",
Expand All @@ -31,11 +35,19 @@ func handleSaveChannelSubscription(w http.ResponseWriter, r *http.Request) {
return
}

userID := r.Header.Get(config.HeaderMattermostUserID)
if errCode, err := service.SaveNewSubscription(subscription, userID); err != nil {
if errCode, err := service.SaveNewSubscription(subscription); err != nil {
config.Mattermost.LogError(err.Error(), "channelID", subscription.ChannelID)
http.Error(w, err.Error(), errCode)
return
}

userID := r.Header.Get(config.HeaderMattermostUserID)
post := &model.Post{
UserId: config.BotUserID,
ChannelId: subscription.ChannelID,
Message: subscriptionSaveSuccess,
}
_ = config.Mattermost.SendEphemeralPost(userID, post)

ReturnStatusOK(w)
}
6 changes: 3 additions & 3 deletions server/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import (

"github.com/pkg/errors"

"github.com/Brightscout/mattermost-plugin-confluence/server/command"
"github.com/Brightscout/mattermost-plugin-confluence/server/util"

"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin"

"github.com/Brightscout/mattermost-plugin-confluence/server/command"
"github.com/Brightscout/mattermost-plugin-confluence/server/util"

"github.com/Brightscout/mattermost-plugin-confluence/server/config"
"github.com/Brightscout/mattermost-plugin-confluence/server/controller"
)
Expand Down
114 changes: 114 additions & 0 deletions server/plugin_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package main

import (
"fmt"
"testing"

"bou.ke/monkey"
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin"
"github.com/mattermost/mattermost-server/plugin/plugintest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"

"github.com/Brightscout/mattermost-plugin-confluence/server/config"
"github.com/Brightscout/mattermost-plugin-confluence/server/serializer"
"github.com/Brightscout/mattermost-plugin-confluence/server/service"
)

const (
specifyAlias = "Please specify an alias."
subscriptionDeleteSuccess = "**%s** has been deleted."
noChannelSubscription = "No subscriptions found for this channel."
helpText = "###### Mattermost Confluence Plugin - Slash Command Help\n\n" +
"* `/confluence subscribe` - Subscribe the current channel to notifications from Confluence.\n" +
"* `/confluence unsubscribe \"<alias>\"` - Unsubscribe the current channel from notifications associated with the given alias.\n" +
"* `/confluence list` - List all subscriptions for the current channel.\n" +
"* `/confluence edit \"<alias>\"` - Edit the subscription settings associated with the given alias."
invalidCommand = "Invalid command parameters. Please use `/confluence help` for more information."
)

func baseMock() *plugintest.API {
mockAPI := &plugintest.API{}
config.Mattermost = mockAPI

return mockAPI
}

func TestExecuteCommand(t *testing.T) {
p := Plugin{}
mockAPI := baseMock()

for name, val := range map[string]struct {
commandArgs *model.CommandArgs
patchFunctionCalls func()
ephemeralMessage string
}{
"empty command ": {
commandArgs: &model.CommandArgs{Command: "/confluence", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
ephemeralMessage: helpText,
},
"list command": {
commandArgs: &model.CommandArgs{Command: "/confluence list", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
patchFunctionCalls: func() {
channelSubscriptions := map[string]serializer.Subscription{
"test": {
Alias: "test",
BaseURL: "https://test.com",
SpaceKey: "TS",
ChannelID: "testtesttesttest",
Events: []string{serializer.CommentRemovedEvent, serializer.CommentUpdatedEvent},
},
}
monkey.Patch(service.GetChannelSubscriptions, func(channelID string) (map[string]serializer.Subscription, string, error) {
return channelSubscriptions, "testSub", nil
})
},
ephemeralMessage: "| Alias | Base Url | Space Key | Events|\n| :----|:--------| :--------| :-----|\n|test|https://test.com|TS|Comment Remove, Comment Update|",
},
"list command empty list": {
commandArgs: &model.CommandArgs{Command: "/confluence list", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
patchFunctionCalls: func() {
monkey.Patch(service.GetChannelSubscriptions, func(channelID string) (map[string]serializer.Subscription, string, error) {
return map[string]serializer.Subscription{}, "testSub", nil
})
},
ephemeralMessage: noChannelSubscription,
},
"help command": {
commandArgs: &model.CommandArgs{Command: "/confluence help", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
ephemeralMessage: helpText,
},
"unsubscribe command ": {
commandArgs: &model.CommandArgs{Command: "/confluence unsubscribe \"abc\"", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
patchFunctionCalls: func() {
monkey.Patch(service.DeleteSubscription, func(channelID, alias string) error {
return nil
})
},
ephemeralMessage: fmt.Sprintf(subscriptionDeleteSuccess, "abc"),
},
"unsubscribe command no alias": {
commandArgs: &model.CommandArgs{Command: "/confluence unsubscribe", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
ephemeralMessage: specifyAlias,
},
"invalid command": {
commandArgs: &model.CommandArgs{Command: "/confluence xyz", UserId: "abcdabcdabcdabcd", ChannelId: "testtesttesttest"},
ephemeralMessage: invalidCommand,
},
} {
t.Run(name, func(t *testing.T) {
defer monkey.UnpatchAll()
mockAPI.On("SendEphemeralPost", mock.AnythingOfType("string"), mock.AnythingOfType("*model.Post")).Run(func(args mock.Arguments) {
post := args.Get(1).(*model.Post)
assert.Equal(t, val.ephemeralMessage, post.Message)
}).Once().Return(&model.Post{})
if val.patchFunctionCalls != nil {
val.patchFunctionCalls()
}
res, err := p.ExecuteCommand(&plugin.Context{}, val.commandArgs)
assert.Nil(t, err)
assert.NotNil(t, res)
})
}
}
64 changes: 64 additions & 0 deletions server/service/delete_subscription_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package service

import (
"fmt"
"testing"

"bou.ke/monkey"
"github.com/stretchr/testify/mock"

"github.com/stretchr/testify/assert"

"github.com/Brightscout/mattermost-plugin-confluence/server/serializer"
)

func TestDeleteSubscription(t *testing.T) {
for name, val := range map[string]struct {
channelID string
alias string
apiCalls func(t *testing.T, channelID, alias string)
}{
"subscription delete success": {
channelID: "testtestesttest",
alias: "test",
apiCalls: func(t *testing.T, channelID, alias string) {
err := DeleteSubscription(channelID, alias)
assert.Nil(t, err)
},
},
"subscription not found": {
channelID: "testtestesttest",
alias: "test1",
apiCalls: func(t *testing.T, channelID, alias string) {
err := DeleteSubscription(channelID, alias)
assert.NotNil(t, err)
assert.Equal(t, fmt.Sprintf(subscriptionNotFound, alias), err.Error())
},
},
} {
t.Run(name, func(t *testing.T) {
defer monkey.UnpatchAll()
mockAPI := baseMock()
channelSubscriptions := map[string]serializer.Subscription{
"test": {
Alias: "test",
BaseURL: "https://test.com",
SpaceKey: "TS",
ChannelID: "testtesttesttest",
Events: []string{serializer.CommentRemovedEvent, serializer.CommentUpdatedEvent},
},
}
urlSpaceKeyCombinationSubscriptions := map[string][]string{
"testtesttesttest": {serializer.CommentRemovedEvent, serializer.CommentUpdatedEvent},
}
monkey.Patch(GetChannelSubscriptions, func(channelID string) (map[string]serializer.Subscription, string, error) {
return channelSubscriptions, "testSub", nil
})
monkey.Patch(GetURLSpaceKeyCombinationSubscriptions, func(baseURL, spaceKey string) (map[string][]string, string, error) {
return urlSpaceKeyCombinationSubscriptions, "testSub", nil
})
mockAPI.On("KVSet", mock.AnythingOfType("string"), mock.Anything).Return(nil)
val.apiCalls(t, val.channelID, val.alias)
})
}
}
Loading

0 comments on commit e09faa1

Please sign in to comment.