[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>
Этот коммит содержится в:
коммит произвёл
Joram Wilander
родитель
2c3a2e9235
Коммит
2c9cf41dad
@@ -179,6 +179,10 @@ func (api *PluginAPI) DeleteUser(userId string) *model.AppError {
|
|||||||
return err
|
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) {
|
func (api *PluginAPI) GetUser(userId string) (*model.User, *model.AppError) {
|
||||||
return api.app.GetUser(userId)
|
return api.app.GetUser(userId)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,93 @@ func setupPluginApiTest(t *testing.T, pluginCode string, pluginManifest string,
|
|||||||
app.SetPluginsEnvironment(env)
|
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) {
|
func TestPluginAPIGetUsersInTeam(t *testing.T) {
|
||||||
th := Setup().InitBasic()
|
th := Setup().InitBasic()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|||||||
@@ -55,6 +55,11 @@ type API interface {
|
|||||||
// DeleteUser deletes a user.
|
// DeleteUser deletes a user.
|
||||||
DeleteUser(userId string) *model.AppError
|
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 gets a user.
|
||||||
GetUser(userId string) (*model.User, *model.AppError)
|
GetUser(userId string) (*model.User, *model.AppError)
|
||||||
|
|
||||||
|
|||||||
@@ -755,6 +755,35 @@ func (s *apiRPCServer) DeleteUser(args *Z_DeleteUserArgs, returns *Z_DeleteUserR
|
|||||||
return nil
|
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 {
|
type Z_GetUserArgs struct {
|
||||||
A string
|
A string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1516,6 +1516,31 @@ func (_m *API) GetUserStatusesByIds(userIds []string) ([]*model.Status, *model.A
|
|||||||
return r0, r1
|
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
|
// GetUsersByUsernames provides a mock function with given fields: usernames
|
||||||
func (_m *API) GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError) {
|
func (_m *API) GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError) {
|
||||||
ret := _m.Called(usernames)
|
ret := _m.Called(usernames)
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user