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 }