From 5a2d46c6cbf992c8a8f155b27eb3b60807d8aed2 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Wed, 18 Jul 2018 16:35:12 -0700 Subject: MM-11028 Adding some plugin tests. (#9103) * Rearranging plugin mocks and moving some common test code out. * Adding tests. * Fixing tests after GoDoc cleanup changes. --- app/plugin_hooks_test.go | 304 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 app/plugin_hooks_test.go (limited to 'app/plugin_hooks_test.go') diff --git a/app/plugin_hooks_test.go b/app/plugin_hooks_test.go new file mode 100644 index 000000000..4b4e657ef --- /dev/null +++ b/app/plugin_hooks_test.go @@ -0,0 +1,304 @@ +// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package app + +import ( + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" + + "github.com/mattermost/mattermost-server/model" + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/plugin/plugintest" + "github.com/mattermost/mattermost-server/plugin/plugintest/mock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func compileGo(t *testing.T, sourceCode, outputPath string) { + dir, err := ioutil.TempDir(".", "") + require.NoError(t, err) + defer os.RemoveAll(dir) + require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "main.go"), []byte(sourceCode), 0600)) + cmd := exec.Command("go", "build", "-o", outputPath, "main.go") + cmd.Dir = dir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + require.NoError(t, cmd.Run()) +} + +func SetAppEnvironmentWithPlugins(t *testing.T, pluginCode []string, app *App, apiFunc func(*model.Manifest) plugin.API) { + pluginDir, err := ioutil.TempDir("", "") + require.NoError(t, err) + webappPluginDir, err := ioutil.TempDir("", "") + require.NoError(t, err) + defer os.RemoveAll(pluginDir) + defer os.RemoveAll(webappPluginDir) + + env, err := plugin.NewEnvironment(apiFunc, pluginDir, webappPluginDir, app.Log) + require.NoError(t, err) + + for _, code := range pluginCode { + pluginId := model.NewId() + backend := filepath.Join(pluginDir, pluginId, "backend.exe") + compileGo(t, code, backend) + + ioutil.WriteFile(filepath.Join(pluginDir, pluginId, "plugin.json"), []byte(`{"id": "`+pluginId+`", "backend": {"executable": "backend.exe"}}`), 0600) + env.Activate(pluginId) + } + + app.Plugins = env +} + +func TestHookMessageWillBePosted(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*model.Post, string) { + post.Message = post.Message + "fromplugin" + return post, "" + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `}, th.App, th.App.NewPluginAPI) + + post := &model.Post{ + UserId: th.BasicUser.Id, + ChannelId: th.BasicChannel.Id, + Message: "message_", + CreateAt: model.GetMillis() - 10000, + } + post, err := th.App.CreatePost(post, th.BasicChannel, false) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "message_fromplugin", post.Message) + if result := <-th.App.Srv.Store.Post().GetSingle(post.Id); result.Err != nil { + t.Fatal(err) + } else { + assert.Equal(t, "message_fromplugin", result.Data.(*model.Post).Message) + } +} + +func TestHookMessageWillBePostedMultiple(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*model.Post, string) { + + post.Message = "prefix_" + post.Message + return post, "" + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `, + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*model.Post, string) { + post.Message = post.Message + "_suffix" + return post, "" + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `, + }, th.App, th.App.NewPluginAPI) + + post := &model.Post{ + UserId: th.BasicUser.Id, + ChannelId: th.BasicChannel.Id, + Message: "message", + CreateAt: model.GetMillis() - 10000, + } + post, err := th.App.CreatePost(post, th.BasicChannel, false) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "prefix_message_suffix", post.Message) +} + +func TestHookMessageHasBeenPosted(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + var mockAPI plugintest.API + mockAPI.On("LoadPluginConfiguration", mock.Anything).Return(nil) + mockAPI.On("DeleteUser", "message").Return(nil) + + SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageHasBeenPosted(c *plugin.Context, post *model.Post) { + p.API.DeleteUser(post.Message) + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `}, th.App, func(*model.Manifest) plugin.API { return &mockAPI }) + + post := &model.Post{ + UserId: th.BasicUser.Id, + ChannelId: th.BasicChannel.Id, + Message: "message", + CreateAt: model.GetMillis() - 10000, + } + post, err := th.App.CreatePost(post, th.BasicChannel, false) + if err != nil { + t.Fatal(err) + } +} + +func TestHookMessageWillBeUpdated(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageWillBeUpdated(c *plugin.Context, newPost, oldPost *model.Post) (*model.Post, string) { + newPost.Message = newPost.Message + "fromplugin" + return newPost, "" + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `}, th.App, th.App.NewPluginAPI) + + post := &model.Post{ + UserId: th.BasicUser.Id, + ChannelId: th.BasicChannel.Id, + Message: "message_", + CreateAt: model.GetMillis() - 10000, + } + post, err := th.App.CreatePost(post, th.BasicChannel, false) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "message_", post.Message) + post.Message = post.Message + "edited_" + post, err = th.App.UpdatePost(post, true) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "message_edited_fromplugin", post.Message) +} + +func TestHookMessageHasBeenUpdated(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + var mockAPI plugintest.API + mockAPI.On("LoadPluginConfiguration", mock.Anything).Return(nil) + mockAPI.On("DeleteUser", "message_edited").Return(nil) + mockAPI.On("DeleteTeam", "message_").Return(nil) + SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/plugin" + "github.com/mattermost/mattermost-server/model" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) MessageHasBeenUpdated(c *plugin.Context, newPost, oldPost *model.Post) { + p.API.DeleteUser(newPost.Message) + p.API.DeleteTeam(oldPost.Message) + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `}, th.App, func(*model.Manifest) plugin.API { return &mockAPI }) + + post := &model.Post{ + UserId: th.BasicUser.Id, + ChannelId: th.BasicChannel.Id, + Message: "message_", + CreateAt: model.GetMillis() - 10000, + } + post, err := th.App.CreatePost(post, th.BasicChannel, false) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "message_", post.Message) + post.Message = post.Message + "edited" + post, err = th.App.UpdatePost(post, true) + if err != nil { + t.Fatal(err) + } +} -- cgit v1.2.3-1-g7c22