summaryrefslogtreecommitdiffstats
path: root/app/plugin_hooks_test.go
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2018-07-18 16:35:12 -0700
committerGitHub <noreply@github.com>2018-07-18 16:35:12 -0700
commit5a2d46c6cbf992c8a8f155b27eb3b60807d8aed2 (patch)
tree621ce2faf53d998a783891d31bbd46ec40772338 /app/plugin_hooks_test.go
parent309a3dda605dbda6b9f6f769ea386764671ea5d3 (diff)
downloadchat-5a2d46c6cbf992c8a8f155b27eb3b60807d8aed2.tar.gz
chat-5a2d46c6cbf992c8a8f155b27eb3b60807d8aed2.tar.bz2
chat-5a2d46c6cbf992c8a8f155b27eb3b60807d8aed2.zip
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.
Diffstat (limited to 'app/plugin_hooks_test.go')
-rw-r--r--app/plugin_hooks_test.go304
1 files changed, 304 insertions, 0 deletions
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)
+ }
+}