github.com/psyb0t/mattermost-server@v4.6.1-0.20180125161845-5503a1351abf+incompatible/plugin/rpcplugin/api_test.go (about)

     1  package rpcplugin
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/mock"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/mattermost/mattermost-server/plugin"
    16  	"github.com/mattermost/mattermost-server/plugin/plugintest"
    17  )
    18  
    19  func testAPIRPC(api plugin.API, f func(plugin.API)) {
    20  	r1, w1 := io.Pipe()
    21  	r2, w2 := io.Pipe()
    22  
    23  	c1 := NewMuxer(NewReadWriteCloser(r1, w2), false)
    24  	defer c1.Close()
    25  
    26  	c2 := NewMuxer(NewReadWriteCloser(r2, w1), true)
    27  	defer c2.Close()
    28  
    29  	id, server := c1.Serve()
    30  	go ServeAPI(api, server, c1)
    31  
    32  	remote := ConnectAPI(c2.Connect(id), c2)
    33  	defer remote.Close()
    34  
    35  	f(remote)
    36  }
    37  
    38  func TestAPI(t *testing.T) {
    39  	keyValueStore := &plugintest.KeyValueStore{}
    40  	api := plugintest.API{Store: keyValueStore}
    41  	defer api.AssertExpectations(t)
    42  
    43  	type Config struct {
    44  		Foo string
    45  		Bar struct {
    46  			Baz string
    47  		}
    48  	}
    49  
    50  	api.On("LoadPluginConfiguration", mock.MatchedBy(func(x interface{}) bool { return true })).Run(func(args mock.Arguments) {
    51  		dest := args.Get(0).(interface{})
    52  		json.Unmarshal([]byte(`{"Foo": "foo", "Bar": {"Baz": "baz"}}`), dest)
    53  	}).Return(nil)
    54  
    55  	testChannel := &model.Channel{
    56  		Id: "thechannelid",
    57  	}
    58  
    59  	testChannelMember := &model.ChannelMember{
    60  		ChannelId: "thechannelid",
    61  		UserId:    "theuserid",
    62  	}
    63  
    64  	testTeam := &model.Team{
    65  		Id: "theteamid",
    66  	}
    67  	teamNotFoundError := model.NewAppError("SqlTeamStore.GetByName", "store.sql_team.get_by_name.app_error", nil, "name=notateam", http.StatusNotFound)
    68  
    69  	testUser := &model.User{
    70  		Id: "theuserid",
    71  	}
    72  
    73  	testPost := &model.Post{
    74  		Message: "hello",
    75  		Props: map[string]interface{}{
    76  			"attachments": []*model.SlackAttachment{
    77  				&model.SlackAttachment{},
    78  			},
    79  		},
    80  	}
    81  
    82  	testAPIRPC(&api, func(remote plugin.API) {
    83  		var config Config
    84  		assert.NoError(t, remote.LoadPluginConfiguration(&config))
    85  		assert.Equal(t, "foo", config.Foo)
    86  		assert.Equal(t, "baz", config.Bar.Baz)
    87  
    88  		api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(fmt.Errorf("foo")).Once()
    89  		assert.Error(t, remote.RegisterCommand(&model.Command{}))
    90  		api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(nil).Once()
    91  		assert.NoError(t, remote.RegisterCommand(&model.Command{}))
    92  
    93  		api.On("UnregisterCommand", "team", "trigger").Return(fmt.Errorf("foo")).Once()
    94  		assert.Error(t, remote.UnregisterCommand("team", "trigger"))
    95  		api.On("UnregisterCommand", "team", "trigger").Return(nil).Once()
    96  		assert.NoError(t, remote.UnregisterCommand("team", "trigger"))
    97  
    98  		api.On("CreateChannel", mock.AnythingOfType("*model.Channel")).Return(func(c *model.Channel) (*model.Channel, *model.AppError) {
    99  			c.Id = "thechannelid"
   100  			return c, nil
   101  		}).Once()
   102  		channel, err := remote.CreateChannel(testChannel)
   103  		assert.Equal(t, "thechannelid", channel.Id)
   104  		assert.Nil(t, err)
   105  
   106  		api.On("DeleteChannel", "thechannelid").Return(nil).Once()
   107  		assert.Nil(t, remote.DeleteChannel("thechannelid"))
   108  
   109  		api.On("GetChannel", "thechannelid").Return(testChannel, nil).Once()
   110  		channel, err = remote.GetChannel("thechannelid")
   111  		assert.Equal(t, testChannel, channel)
   112  		assert.Nil(t, err)
   113  
   114  		api.On("GetChannelByName", "foo", "theteamid").Return(testChannel, nil).Once()
   115  		channel, err = remote.GetChannelByName("foo", "theteamid")
   116  		assert.Equal(t, testChannel, channel)
   117  		assert.Nil(t, err)
   118  
   119  		api.On("GetDirectChannel", "user1", "user2").Return(testChannel, nil).Once()
   120  		channel, err = remote.GetDirectChannel("user1", "user2")
   121  		assert.Equal(t, testChannel, channel)
   122  		assert.Nil(t, err)
   123  
   124  		api.On("GetGroupChannel", []string{"user1", "user2", "user3"}).Return(testChannel, nil).Once()
   125  		channel, err = remote.GetGroupChannel([]string{"user1", "user2", "user3"})
   126  		assert.Equal(t, testChannel, channel)
   127  		assert.Nil(t, err)
   128  
   129  		api.On("UpdateChannel", mock.AnythingOfType("*model.Channel")).Return(func(c *model.Channel) (*model.Channel, *model.AppError) {
   130  			return c, nil
   131  		}).Once()
   132  		channel, err = remote.UpdateChannel(testChannel)
   133  		assert.Equal(t, testChannel, channel)
   134  		assert.Nil(t, err)
   135  
   136  		api.On("GetChannelMember", "thechannelid", "theuserid").Return(testChannelMember, nil).Once()
   137  		member, err := remote.GetChannelMember("thechannelid", "theuserid")
   138  		assert.Equal(t, testChannelMember, member)
   139  		assert.Nil(t, err)
   140  
   141  		api.On("CreateUser", mock.AnythingOfType("*model.User")).Return(func(u *model.User) (*model.User, *model.AppError) {
   142  			u.Id = "theuserid"
   143  			return u, nil
   144  		}).Once()
   145  		user, err := remote.CreateUser(testUser)
   146  		assert.Equal(t, "theuserid", user.Id)
   147  		assert.Nil(t, err)
   148  
   149  		api.On("DeleteUser", "theuserid").Return(nil).Once()
   150  		assert.Nil(t, remote.DeleteUser("theuserid"))
   151  
   152  		api.On("GetUser", "theuserid").Return(testUser, nil).Once()
   153  		user, err = remote.GetUser("theuserid")
   154  		assert.Equal(t, testUser, user)
   155  		assert.Nil(t, err)
   156  
   157  		api.On("GetUserByEmail", "foo@foo").Return(testUser, nil).Once()
   158  		user, err = remote.GetUserByEmail("foo@foo")
   159  		assert.Equal(t, testUser, user)
   160  		assert.Nil(t, err)
   161  
   162  		api.On("GetUserByUsername", "foo").Return(testUser, nil).Once()
   163  		user, err = remote.GetUserByUsername("foo")
   164  		assert.Equal(t, testUser, user)
   165  		assert.Nil(t, err)
   166  
   167  		api.On("UpdateUser", mock.AnythingOfType("*model.User")).Return(func(u *model.User) (*model.User, *model.AppError) {
   168  			return u, nil
   169  		}).Once()
   170  		user, err = remote.UpdateUser(testUser)
   171  		assert.Equal(t, testUser, user)
   172  		assert.Nil(t, err)
   173  
   174  		api.On("CreateTeam", mock.AnythingOfType("*model.Team")).Return(func(t *model.Team) (*model.Team, *model.AppError) {
   175  			t.Id = "theteamid"
   176  			return t, nil
   177  		}).Once()
   178  		team, err := remote.CreateTeam(testTeam)
   179  		assert.Equal(t, "theteamid", team.Id)
   180  		assert.Nil(t, err)
   181  
   182  		api.On("DeleteTeam", "theteamid").Return(nil).Once()
   183  		assert.Nil(t, remote.DeleteTeam("theteamid"))
   184  
   185  		api.On("GetTeam", "theteamid").Return(testTeam, nil).Once()
   186  		team, err = remote.GetTeam("theteamid")
   187  		assert.Equal(t, testTeam, team)
   188  		assert.Nil(t, err)
   189  
   190  		api.On("GetTeamByName", "foo").Return(testTeam, nil).Once()
   191  		team, err = remote.GetTeamByName("foo")
   192  		assert.Equal(t, testTeam, team)
   193  		assert.Nil(t, err)
   194  
   195  		api.On("GetTeamByName", "notateam").Return(nil, teamNotFoundError).Once()
   196  		team, err = remote.GetTeamByName("notateam")
   197  		assert.Nil(t, team)
   198  		assert.Equal(t, teamNotFoundError, err)
   199  
   200  		api.On("UpdateTeam", mock.AnythingOfType("*model.Team")).Return(func(t *model.Team) (*model.Team, *model.AppError) {
   201  			return t, nil
   202  		}).Once()
   203  		team, err = remote.UpdateTeam(testTeam)
   204  		assert.Equal(t, testTeam, team)
   205  		assert.Nil(t, err)
   206  
   207  		api.On("CreatePost", mock.AnythingOfType("*model.Post")).Return(func(p *model.Post) (*model.Post, *model.AppError) {
   208  			p.Id = "thepostid"
   209  			return p, nil
   210  		}).Once()
   211  		post, err := remote.CreatePost(testPost)
   212  		require.Nil(t, err)
   213  		assert.NotEmpty(t, post.Id)
   214  		assert.Equal(t, testPost.Message, post.Message)
   215  
   216  		api.On("DeletePost", "thepostid").Return(nil).Once()
   217  		assert.Nil(t, remote.DeletePost("thepostid"))
   218  
   219  		api.On("GetPost", "thepostid").Return(testPost, nil).Once()
   220  		post, err = remote.GetPost("thepostid")
   221  		assert.Equal(t, testPost, post)
   222  		assert.Nil(t, err)
   223  
   224  		api.On("UpdatePost", mock.AnythingOfType("*model.Post")).Return(func(p *model.Post) (*model.Post, *model.AppError) {
   225  			return p, nil
   226  		}).Once()
   227  		post, err = remote.UpdatePost(testPost)
   228  		assert.Equal(t, testPost, post)
   229  		assert.Nil(t, err)
   230  
   231  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Set", "thekey", []byte("thevalue")).Return(nil).Once()
   232  		err = remote.KeyValueStore().Set("thekey", []byte("thevalue"))
   233  		assert.Nil(t, err)
   234  
   235  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Get", "thekey").Return(func(key string) ([]byte, *model.AppError) {
   236  			return []byte("thevalue"), nil
   237  		}).Once()
   238  		ret, err := remote.KeyValueStore().Get("thekey")
   239  		assert.Nil(t, err)
   240  		assert.Equal(t, []byte("thevalue"), ret)
   241  
   242  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Delete", "thekey").Return(nil).Once()
   243  		err = remote.KeyValueStore().Delete("thekey")
   244  		assert.Nil(t, err)
   245  	})
   246  }