[MM-13747] Add ability to list users to plugin API (#10102)

* add GetUsers in plugin api

* change GetUsers(page int, perPage int) ([]*model.User, *model.AppError) to GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError)

* Update GetUsers doc

Co-Authored-By: dom3k <szeptweb@gmail.com>

* Update doc in plugin/api.go

Co-Authored-By: dom3k <szeptweb@gmail.com>

* correct database initialization for the test

* Update plugin/api.go

Co-Authored-By: dom3k <szeptweb@gmail.com>
This commit is contained in:
dom3k
2019-01-30 12:55:02 -05:00
committed by Joram Wilander
parent 2c3a2e9235
commit 2c9cf41dad
5 changed files with 150 additions and 0 deletions
+4
View File
@@ -179,6 +179,10 @@ func (api *PluginAPI) DeleteUser(userId string) *model.AppError {
return err
}
func (api *PluginAPI) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
return api.app.GetUsers(options)
}
func (api *PluginAPI) GetUser(userId string) (*model.User, *model.AppError) {
return api.app.GetUser(userId)
}
+87
View File
@@ -47,6 +47,93 @@ func setupPluginApiTest(t *testing.T, pluginCode string, pluginManifest string,
app.SetPluginsEnvironment(env)
}
func TestPluginAPIGetUsers(t *testing.T) {
th := Setup()
defer th.TearDown()
api := th.SetupPluginAPI()
user1, err := th.App.CreateUser(&model.User{
Email: strings.ToLower(model.NewId()) + "success+test@example.com",
Password: "password",
Username: "user1" + model.NewId(),
})
require.Nil(t, err)
defer th.App.PermanentDeleteUser(user1)
user2, err := th.App.CreateUser(&model.User{
Email: strings.ToLower(model.NewId()) + "success+test@example.com",
Password: "password",
Username: "user2" + model.NewId(),
})
require.Nil(t, err)
defer th.App.PermanentDeleteUser(user2)
user3, err := th.App.CreateUser(&model.User{
Email: strings.ToLower(model.NewId()) + "success+test@example.com",
Password: "password",
Username: "user3" + model.NewId(),
})
require.Nil(t, err)
defer th.App.PermanentDeleteUser(user3)
user4, err := th.App.CreateUser(&model.User{
Email: strings.ToLower(model.NewId()) + "success+test@example.com",
Password: "password",
Username: "user4" + model.NewId(),
})
require.Nil(t, err)
defer th.App.PermanentDeleteUser(user4)
testCases := []struct {
Description string
Page int
PerPage int
ExpectedUsers []*model.User
}{
{
"page 0, perPage 0",
0,
0,
[]*model.User{},
},
{
"page 0, perPage 10",
0,
10,
[]*model.User{user1, user2, user3, user4},
},
{
"page 0, perPage 2",
0,
2,
[]*model.User{user1, user2},
},
{
"page 1, perPage 2",
1,
2,
[]*model.User{user3, user4},
},
{
"page 10, perPage 10",
10,
10,
[]*model.User{},
},
}
for _, testCase := range testCases {
t.Run(testCase.Description, func(t *testing.T) {
users, err := api.GetUsers(&model.UserGetOptions{
Page: testCase.Page,
PerPage: testCase.PerPage,
})
assert.Nil(t, err)
assert.Equal(t, testCase.ExpectedUsers, users)
})
}
}
func TestPluginAPIGetUsersInTeam(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
+5
View File
@@ -55,6 +55,11 @@ type API interface {
// DeleteUser deletes a user.
DeleteUser(userId string) *model.AppError
// GetUsers a list of users based on search options.
//
// Minimum server version: 5.10
GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError)
// GetUser gets a user.
GetUser(userId string) (*model.User, *model.AppError)
+29
View File
@@ -755,6 +755,35 @@ func (s *apiRPCServer) DeleteUser(args *Z_DeleteUserArgs, returns *Z_DeleteUserR
return nil
}
type Z_GetUsersArgs struct {
A *model.UserGetOptions
}
type Z_GetUsersReturns struct {
A []*model.User
B *model.AppError
}
func (g *apiRPCClient) GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError) {
_args := &Z_GetUsersArgs{}
_returns := &Z_GetUsersReturns{}
if err := g.client.Call("Plugin.GetUsers", _args, _returns); err != nil {
log.Printf("RPC call to GetUsers API failed: %s", err.Error())
}
return _returns.A, _returns.B
}
func (s *apiRPCServer) GetUsers(args *Z_GetUsersArgs, returns *Z_GetUsersReturns) error {
if hook, ok := s.impl.(interface {
GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError)
}); ok {
returns.A, returns.B = hook.GetUsers(args.A)
} else {
return encodableError(fmt.Errorf("API GetUsers called but not implemented."))
}
return nil
}
type Z_GetUserArgs struct {
A string
}
+25
View File
@@ -1516,6 +1516,31 @@ func (_m *API) GetUserStatusesByIds(userIds []string) ([]*model.Status, *model.A
return r0, r1
}
// GetUsers provides a mock function with given fields: _a0
func (_m *API) GetUsers(_a0 *model.UserGetOptions) ([]*model.User, *model.AppError) {
ret := _m.Called(_a0)
var r0 []*model.User
if rf, ok := ret.Get(0).(func(*model.UserGetOptions) []*model.User); ok {
r0 = rf(_a0)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]*model.User)
}
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok {
r1 = rf(_a0)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// GetUsersByUsernames provides a mock function with given fields: usernames
func (_m *API) GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError) {
ret := _m.Called(usernames)