github.com/coincircle/mattermost-server@v4.8.1-0.20180321182714-9d701c704416+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  	}
    76  
    77  	testAPIRPC(&api, func(remote plugin.API) {
    78  		var config Config
    79  		assert.NoError(t, remote.LoadPluginConfiguration(&config))
    80  		assert.Equal(t, "foo", config.Foo)
    81  		assert.Equal(t, "baz", config.Bar.Baz)
    82  
    83  		api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(fmt.Errorf("foo")).Once()
    84  		assert.Error(t, remote.RegisterCommand(&model.Command{}))
    85  		api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(nil).Once()
    86  		assert.NoError(t, remote.RegisterCommand(&model.Command{}))
    87  
    88  		api.On("UnregisterCommand", "team", "trigger").Return(fmt.Errorf("foo")).Once()
    89  		assert.Error(t, remote.UnregisterCommand("team", "trigger"))
    90  		api.On("UnregisterCommand", "team", "trigger").Return(nil).Once()
    91  		assert.NoError(t, remote.UnregisterCommand("team", "trigger"))
    92  
    93  		api.On("CreateChannel", mock.AnythingOfType("*model.Channel")).Return(func(c *model.Channel) (*model.Channel, *model.AppError) {
    94  			c.Id = "thechannelid"
    95  			return c, nil
    96  		}).Once()
    97  		channel, err := remote.CreateChannel(testChannel)
    98  		assert.Equal(t, "thechannelid", channel.Id)
    99  		assert.Nil(t, err)
   100  
   101  		api.On("DeleteChannel", "thechannelid").Return(nil).Once()
   102  		assert.Nil(t, remote.DeleteChannel("thechannelid"))
   103  
   104  		api.On("GetChannel", "thechannelid").Return(testChannel, nil).Once()
   105  		channel, err = remote.GetChannel("thechannelid")
   106  		assert.Equal(t, testChannel, channel)
   107  		assert.Nil(t, err)
   108  
   109  		api.On("GetChannelByName", "foo", "theteamid").Return(testChannel, nil).Once()
   110  		channel, err = remote.GetChannelByName("foo", "theteamid")
   111  		assert.Equal(t, testChannel, channel)
   112  		assert.Nil(t, err)
   113  
   114  		api.On("GetDirectChannel", "user1", "user2").Return(testChannel, nil).Once()
   115  		channel, err = remote.GetDirectChannel("user1", "user2")
   116  		assert.Equal(t, testChannel, channel)
   117  		assert.Nil(t, err)
   118  
   119  		api.On("GetGroupChannel", []string{"user1", "user2", "user3"}).Return(testChannel, nil).Once()
   120  		channel, err = remote.GetGroupChannel([]string{"user1", "user2", "user3"})
   121  		assert.Equal(t, testChannel, channel)
   122  		assert.Nil(t, err)
   123  
   124  		api.On("UpdateChannel", mock.AnythingOfType("*model.Channel")).Return(func(c *model.Channel) (*model.Channel, *model.AppError) {
   125  			return c, nil
   126  		}).Once()
   127  		channel, err = remote.UpdateChannel(testChannel)
   128  		assert.Equal(t, testChannel, channel)
   129  		assert.Nil(t, err)
   130  
   131  		api.On("GetChannelMember", "thechannelid", "theuserid").Return(testChannelMember, nil).Once()
   132  		member, err := remote.GetChannelMember("thechannelid", "theuserid")
   133  		assert.Equal(t, testChannelMember, member)
   134  		assert.Nil(t, err)
   135  
   136  		api.On("CreateUser", mock.AnythingOfType("*model.User")).Return(func(u *model.User) (*model.User, *model.AppError) {
   137  			u.Id = "theuserid"
   138  			return u, nil
   139  		}).Once()
   140  		user, err := remote.CreateUser(testUser)
   141  		assert.Equal(t, "theuserid", user.Id)
   142  		assert.Nil(t, err)
   143  
   144  		api.On("DeleteUser", "theuserid").Return(nil).Once()
   145  		assert.Nil(t, remote.DeleteUser("theuserid"))
   146  
   147  		api.On("GetUser", "theuserid").Return(testUser, nil).Once()
   148  		user, err = remote.GetUser("theuserid")
   149  		assert.Equal(t, testUser, user)
   150  		assert.Nil(t, err)
   151  
   152  		api.On("GetUserByEmail", "foo@foo").Return(testUser, nil).Once()
   153  		user, err = remote.GetUserByEmail("foo@foo")
   154  		assert.Equal(t, testUser, user)
   155  		assert.Nil(t, err)
   156  
   157  		api.On("GetUserByUsername", "foo").Return(testUser, nil).Once()
   158  		user, err = remote.GetUserByUsername("foo")
   159  		assert.Equal(t, testUser, user)
   160  		assert.Nil(t, err)
   161  
   162  		api.On("UpdateUser", mock.AnythingOfType("*model.User")).Return(func(u *model.User) (*model.User, *model.AppError) {
   163  			return u, nil
   164  		}).Once()
   165  		user, err = remote.UpdateUser(testUser)
   166  		assert.Equal(t, testUser, user)
   167  		assert.Nil(t, err)
   168  
   169  		api.On("CreateTeam", mock.AnythingOfType("*model.Team")).Return(func(t *model.Team) (*model.Team, *model.AppError) {
   170  			t.Id = "theteamid"
   171  			return t, nil
   172  		}).Once()
   173  		team, err := remote.CreateTeam(testTeam)
   174  		assert.Equal(t, "theteamid", team.Id)
   175  		assert.Nil(t, err)
   176  
   177  		api.On("DeleteTeam", "theteamid").Return(nil).Once()
   178  		assert.Nil(t, remote.DeleteTeam("theteamid"))
   179  
   180  		api.On("GetTeam", "theteamid").Return(testTeam, nil).Once()
   181  		team, err = remote.GetTeam("theteamid")
   182  		assert.Equal(t, testTeam, team)
   183  		assert.Nil(t, err)
   184  
   185  		api.On("GetTeamByName", "foo").Return(testTeam, nil).Once()
   186  		team, err = remote.GetTeamByName("foo")
   187  		assert.Equal(t, testTeam, team)
   188  		assert.Nil(t, err)
   189  
   190  		api.On("GetTeamByName", "notateam").Return(nil, teamNotFoundError).Once()
   191  		team, err = remote.GetTeamByName("notateam")
   192  		assert.Nil(t, team)
   193  		assert.Equal(t, teamNotFoundError, err)
   194  
   195  		api.On("UpdateTeam", mock.AnythingOfType("*model.Team")).Return(func(t *model.Team) (*model.Team, *model.AppError) {
   196  			return t, nil
   197  		}).Once()
   198  		team, err = remote.UpdateTeam(testTeam)
   199  		assert.Equal(t, testTeam, team)
   200  		assert.Nil(t, err)
   201  
   202  		api.On("CreatePost", mock.AnythingOfType("*model.Post")).Return(func(p *model.Post) (*model.Post, *model.AppError) {
   203  			p.Id = "thepostid"
   204  			return p, nil
   205  		}).Once()
   206  		post, err := remote.CreatePost(testPost)
   207  		require.Nil(t, err)
   208  		assert.NotEmpty(t, post.Id)
   209  		assert.Equal(t, testPost.Message, post.Message)
   210  
   211  		api.On("DeletePost", "thepostid").Return(nil).Once()
   212  		assert.Nil(t, remote.DeletePost("thepostid"))
   213  
   214  		api.On("GetPost", "thepostid").Return(testPost, nil).Once()
   215  		post, err = remote.GetPost("thepostid")
   216  		assert.Equal(t, testPost, post)
   217  		assert.Nil(t, err)
   218  
   219  		api.On("UpdatePost", mock.AnythingOfType("*model.Post")).Return(func(p *model.Post) (*model.Post, *model.AppError) {
   220  			return p, nil
   221  		}).Once()
   222  		post, err = remote.UpdatePost(testPost)
   223  		assert.Equal(t, testPost, post)
   224  		assert.Nil(t, err)
   225  
   226  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Set", "thekey", []byte("thevalue")).Return(nil).Once()
   227  		err = remote.KeyValueStore().Set("thekey", []byte("thevalue"))
   228  		assert.Nil(t, err)
   229  
   230  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Get", "thekey").Return(func(key string) ([]byte, *model.AppError) {
   231  			return []byte("thevalue"), nil
   232  		}).Once()
   233  		ret, err := remote.KeyValueStore().Get("thekey")
   234  		assert.Nil(t, err)
   235  		assert.Equal(t, []byte("thevalue"), ret)
   236  
   237  		api.KeyValueStore().(*plugintest.KeyValueStore).On("Delete", "thekey").Return(nil).Once()
   238  		err = remote.KeyValueStore().Delete("thekey")
   239  		assert.Nil(t, err)
   240  	})
   241  }
   242  
   243  func TestAPI_GobRegistration(t *testing.T) {
   244  	keyValueStore := &plugintest.KeyValueStore{}
   245  	api := plugintest.API{Store: keyValueStore}
   246  	defer api.AssertExpectations(t)
   247  
   248  	testAPIRPC(&api, func(remote plugin.API) {
   249  		api.On("CreatePost", mock.AnythingOfType("*model.Post")).Return(func(p *model.Post) (*model.Post, *model.AppError) {
   250  			p.Id = "thepostid"
   251  			return p, nil
   252  		}).Once()
   253  		_, err := remote.CreatePost(&model.Post{
   254  			Message: "hello",
   255  			Props: map[string]interface{}{
   256  				"attachments": []*model.SlackAttachment{
   257  					&model.SlackAttachment{
   258  						Actions: []*model.PostAction{
   259  							&model.PostAction{
   260  								Integration: &model.PostActionIntegration{
   261  									Context: map[string]interface{}{
   262  										"foo":  "bar",
   263  										"foos": []interface{}{"bar", "baz", 1, 2},
   264  										"foo_map": map[string]interface{}{
   265  											"1": "bar",
   266  											"2": 2,
   267  										},
   268  									},
   269  								},
   270  							},
   271  						},
   272  						Timestamp: 1,
   273  					},
   274  				},
   275  			},
   276  		})
   277  		require.Nil(t, err)
   278  	})
   279  }