From a8ca5c423f25e186fa9ccf4b78bfb95d32eaf289 Mon Sep 17 00:00:00 2001 From: Ben Schumacher Date: Fri, 13 Aug 2021 13:12:16 +0200 Subject: [PATCH] [MM-37557] Move error out of client4 response (#18101) * Return an error seperately from Response * Remove BuildErrorResponse * Drop Response.Error from model/client4.go * Migrate require.Nil checks * Migrate require.NotNil checks * More manual fixes * Move error check out of CheckOKStatus and CheckCreatedStatus * Move error check out of CheckForbiddenStatus * Move error check out of CheckUnauthorizedStatus * Move error check out of CheckNotFoundStatus * Move error check out of CheckBadRequestStatus * Move error check out of CheckNotImplementedStatus and CheckRequestEntityTooLargeStatus * Move error check out of CheckInternalErrorStatus * Move error check out of CheckServiceUnavailableStatus * Remove error check from checkHTTPStatus * Remove remaining references to Response.Error * Check previously unchecked errors * Manually fix compile and linter errors * Return error in CreateWebSocket methods * Return error instead of *AppError in DoApi methods * Manually fix bad replacments * Conistently return Response and error * Use err instead of seperate bool return value to indicate success * Reduce ussage of model.AppError in web/oauth_test.go * Remove client4.Must * Check error in buf.ReadFrom * Fix failing tests --- api4/apitestlib.go | 145 +- api4/bleve_test.go | 13 +- api4/bot_test.go | 377 ++- api4/brand_test.go | 41 +- api4/channel_category_test.go | 176 +- api4/channel_test.go | 2206 ++++++------ api4/cluster_test.go | 10 +- api4/command_help_test.go | 6 +- api4/command_test.go | 329 +- api4/commands_test.go | 210 +- api4/config_test.go | 306 +- api4/data_retention_test.go | 5 +- api4/elasticsearch_test.go | 19 +- api4/emoji_test.go | 308 +- api4/export_test.go | 67 +- api4/file_test.go | 284 +- api4/group_test.go | 548 +-- api4/import_test.go | 30 +- api4/integration_action_test.go | 65 +- api4/job_test.go | 107 +- api4/ldap_test.go | 99 +- api4/license_test.go | 95 +- api4/oauth_test.go | 347 +- api4/openGraph_test.go | 9 +- api4/permissions_test.go | 12 +- api4/plugin_test.go | 477 +-- api4/post_test.go | 1142 ++++--- api4/preference_test.go | 305 +- api4/reaction_test.go | 278 +- api4/role_test.go | 82 +- api4/saml_test.go | 11 +- api4/scheme_test.go | 370 +- api4/shared_channel_test.go | 59 +- api4/status_test.go | 119 +- api4/system_test.go | 326 +- api4/team_test.go | 1528 +++++---- api4/terms_of_service_test.go | 26 +- api4/upload_test.go | 128 +- api4/user_test.go | 2652 ++++++++------- api4/user_viewmembers_test.go | 83 +- api4/webhook_test.go | 589 ++-- api4/websocket_norace_test.go | 6 +- api4/websocket_test.go | 36 +- app/plugin_api_test.go | 4 +- app/slashcommands/auto_environment.go | 18 +- app/slashcommands/auto_teams.go | 6 +- app/slashcommands/auto_users.go | 18 +- app/slashcommands/command_loadtest.go | 18 +- cmd/mattermost/commands/channel_test.go | 9 +- cmd/mattermost/commands/command_test.go | 5 +- cmd/mattermost/commands/team_test.go | 13 +- cmd/mattermost/commands/user_test.go | 3 +- cmd/mattermost/commands/webhook_test.go | 25 +- manualtesting/manual_testing.go | 25 +- manualtesting/test_autolink.go | 15 +- model/client4.go | 4103 +++++++++++------------ model/client4_test.go | 9 +- model/websocket_client.go | 8 +- model/websocket_client_test.go | 6 +- web/oauth_test.go | 180 +- 60 files changed, 9790 insertions(+), 8706 deletions(-) diff --git a/api4/apitestlib.go b/api4/apitestlib.go index 450c123a59..ec63193677 100644 --- a/api4/apitestlib.go +++ b/api4/apitestlib.go @@ -5,6 +5,7 @@ package api4 import ( "context" + "errors" "fmt" "io/ioutil" "math/rand" @@ -473,19 +474,19 @@ func (th *TestHelper) CreateLocalClient(socketPath string) *model.Client4 { } } -func (th *TestHelper) CreateWebSocketClient() (*model.WebSocketClient, *model.AppError) { +func (th *TestHelper) CreateWebSocketClient() (*model.WebSocketClient, error) { return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", th.App.Srv().ListenAddr.Port), th.Client.AuthToken) } -func (th *TestHelper) CreateWebSocketSystemAdminClient() (*model.WebSocketClient, *model.AppError) { +func (th *TestHelper) CreateWebSocketSystemAdminClient() (*model.WebSocketClient, error) { return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", th.App.Srv().ListenAddr.Port), th.SystemAdminClient.AuthToken) } -func (th *TestHelper) CreateWebSocketSystemManagerClient() (*model.WebSocketClient, *model.AppError) { +func (th *TestHelper) CreateWebSocketSystemManagerClient() (*model.WebSocketClient, error) { return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", th.App.Srv().ListenAddr.Port), th.SystemManagerClient.AuthToken) } -func (th *TestHelper) CreateWebSocketClientWithClient(client *model.Client4) (*model.WebSocketClient, *model.AppError) { +func (th *TestHelper) CreateWebSocketClientWithClient(client *model.Client4) (*model.WebSocketClient, error) { return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", th.App.Srv().ListenAddr.Port), client.AuthToken) } @@ -501,9 +502,9 @@ func (th *TestHelper) CreateBotWithClient(client *model.Client4) *model.Bot { } utils.DisableDebugLogForTest() - rbot, resp := client.CreateBot(bot) - if resp.Error != nil { - panic(resp.Error) + rbot, _, err := client.CreateBot(bot) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rbot @@ -527,9 +528,9 @@ func (th *TestHelper) CreateTeamWithClient(client *model.Client4) *model.Team { } utils.DisableDebugLogForTest() - rteam, resp := client.CreateTeam(team) - if resp.Error != nil { - panic(resp.Error) + rteam, _, err := client.CreateTeam(team) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rteam @@ -548,13 +549,13 @@ func (th *TestHelper) CreateUserWithClient(client *model.Client4) *model.User { } utils.DisableDebugLogForTest() - ruser, response := client.CreateUser(user) - if response.Error != nil { - panic(response.Error) + ruser, _, err := client.CreateUser(user) + if err != nil { + panic(err) } ruser.Password = "Pa$$word11" - _, err := th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) + _, err = th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) if err != nil { return nil } @@ -651,9 +652,9 @@ func (th *TestHelper) CreateChannelWithClientAndTeam(client *model.Client4, chan } utils.DisableDebugLogForTest() - rchannel, resp := client.CreateChannel(channel) - if resp.Error != nil { - panic(resp.Error) + rchannel, _, err := client.CreateChannel(channel) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rchannel @@ -680,9 +681,9 @@ func (th *TestHelper) CreatePostWithClient(client *model.Client4, channel *model } utils.DisableDebugLogForTest() - rpost, resp := client.CreatePost(post) - if resp.Error != nil { - panic(resp.Error) + rpost, _, err := client.CreatePost(post) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rpost @@ -698,9 +699,9 @@ func (th *TestHelper) CreatePinnedPostWithClient(client *model.Client4, channel } utils.DisableDebugLogForTest() - rpost, resp := client.CreatePost(post) - if resp.Error != nil { - panic(resp.Error) + rpost, _, err := client.CreatePost(post) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rpost @@ -713,9 +714,9 @@ func (th *TestHelper) CreateMessagePostWithClient(client *model.Client4, channel } utils.DisableDebugLogForTest() - rpost, resp := client.CreatePost(post) - if resp.Error != nil { - panic(resp.Error) + rpost, _, err := client.CreatePost(post) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() return rpost @@ -769,45 +770,45 @@ func (th *TestHelper) LoginSystemManager() { func (th *TestHelper) LoginBasicWithClient(client *model.Client4) { utils.DisableDebugLogForTest() - _, resp := client.Login(th.BasicUser.Email, th.BasicUser.Password) - if resp.Error != nil { - panic(resp.Error) + _, _, err := client.Login(th.BasicUser.Email, th.BasicUser.Password) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() } func (th *TestHelper) LoginBasic2WithClient(client *model.Client4) { utils.DisableDebugLogForTest() - _, resp := client.Login(th.BasicUser2.Email, th.BasicUser2.Password) - if resp.Error != nil { - panic(resp.Error) + _, _, err := client.Login(th.BasicUser2.Email, th.BasicUser2.Password) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() } func (th *TestHelper) LoginTeamAdminWithClient(client *model.Client4) { utils.DisableDebugLogForTest() - _, resp := client.Login(th.TeamAdminUser.Email, th.TeamAdminUser.Password) - if resp.Error != nil { - panic(resp.Error) + _, _, err := client.Login(th.TeamAdminUser.Email, th.TeamAdminUser.Password) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() } func (th *TestHelper) LoginSystemManagerWithClient(client *model.Client4) { utils.DisableDebugLogForTest() - _, resp := client.Login(th.SystemManagerUser.Email, th.SystemManagerUser.Password) - if resp.Error != nil { - panic(resp.Error) + _, _, err := client.Login(th.SystemManagerUser.Email, th.SystemManagerUser.Password) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() } func (th *TestHelper) LoginSystemAdminWithClient(client *model.Client4) { utils.DisableDebugLogForTest() - _, resp := client.Login(th.SystemAdminUser.Email, th.SystemAdminUser.Password) - if resp.Error != nil { - panic(resp.Error) + _, _, err := client.Login(th.SystemAdminUser.Email, th.SystemAdminUser.Password) + if err != nil { + panic(err) } utils.EnableDebugLogForTest() } @@ -947,82 +948,90 @@ func CheckEtag(t *testing.T, data interface{}, resp *model.Response) { require.Equal(t, resp.StatusCode, http.StatusNotModified, "wrong status code for etag") } -func CheckNoError(t *testing.T, resp *model.Response) { +func checkHTTPStatus(t *testing.T, resp *model.Response, expectedStatus int) { t.Helper() - require.Nil(t, resp.Error, "expected no error") -} - -func checkHTTPStatus(t *testing.T, resp *model.Response, expectedStatus int, expectError bool) { - t.Helper() - - require.NotNilf(t, resp, "Unexpected nil response, expected http:%v, expectError:%v", expectedStatus, expectError) - if expectError { - require.NotNil(t, resp.Error, "Expected a non-nil error and http status:%v, got nil, %v", expectedStatus, resp.StatusCode) - } else { - require.Nil(t, resp.Error, "Expected no error and http status:%v, got %q, http:%v", expectedStatus, resp.Error, resp.StatusCode) - } - require.Equalf(t, expectedStatus, resp.StatusCode, "Expected http status:%v, got %v (err: %q)", expectedStatus, resp.StatusCode, resp.Error) + require.NotNilf(t, resp, "Unexpected nil response, expected http status:%v", expectedStatus) + require.Equalf(t, expectedStatus, resp.StatusCode, "Expected http status:%v, got %v", expectedStatus, resp.StatusCode) } func CheckOKStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusOK, false) + checkHTTPStatus(t, resp, http.StatusOK) } func CheckCreatedStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusCreated, false) + checkHTTPStatus(t, resp, http.StatusCreated) } func CheckForbiddenStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusForbidden, true) + checkHTTPStatus(t, resp, http.StatusForbidden) } func CheckUnauthorizedStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusUnauthorized, true) + checkHTTPStatus(t, resp, http.StatusUnauthorized) } func CheckNotFoundStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusNotFound, true) + checkHTTPStatus(t, resp, http.StatusNotFound) } func CheckBadRequestStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusBadRequest, true) + checkHTTPStatus(t, resp, http.StatusBadRequest) } func CheckNotImplementedStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusNotImplemented, true) + checkHTTPStatus(t, resp, http.StatusNotImplemented) } func CheckRequestEntityTooLargeStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusRequestEntityTooLarge, true) + checkHTTPStatus(t, resp, http.StatusRequestEntityTooLarge) } func CheckInternalErrorStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusInternalServerError, true) + checkHTTPStatus(t, resp, http.StatusInternalServerError) } func CheckServiceUnavailableStatus(t *testing.T, resp *model.Response) { t.Helper() - checkHTTPStatus(t, resp, http.StatusServiceUnavailable, true) + checkHTTPStatus(t, resp, http.StatusServiceUnavailable) } -func CheckErrorMessage(t *testing.T, resp *model.Response, errorId string) { +func CheckErrorID(t *testing.T, err error, errorId string) { t.Helper() - require.NotNilf(t, resp.Error, "should have errored with message: %s", errorId) - require.Equalf(t, errorId, resp.Error.Id, "incorrect error message, actual: %s, expected: %s", resp.Error.Id, errorId) + require.Error(t, err, "should have errored with id: %s", errorId) + + var appError *model.AppError + ok := errors.As(err, &appError) + require.True(t, ok, "should have been a model.AppError") + + require.Equalf(t, errorId, appError.Id, "incorrect error id, actual: %s, expected: %s", appError.Id, errorId) +} + +func CheckErrorMessage(t *testing.T, err error, message string) { + t.Helper() + + require.Error(t, err, "should have errored with message: %s", message) + + var appError *model.AppError + ok := errors.As(err, &appError) + require.True(t, ok, "should have been a model.AppError") + + require.Equalf(t, message, appError.Message, "incorrect error message, actual: %s, expected: %s", appError.Id, message) } func CheckStartsWith(t *testing.T, value, prefix, message string) { + t.Helper() + require.True(t, strings.HasPrefix(value, prefix), message, value) } diff --git a/api4/bleve_test.go b/api4/bleve_test.go index a7c63a2958..9f6cc17238 100644 --- a/api4/bleve_test.go +++ b/api4/bleve_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/mattermost/mattermost-server/v6/model" + "github.com/stretchr/testify/require" ) func TestBlevePurgeIndexes(t *testing.T) { @@ -14,26 +15,30 @@ func TestBlevePurgeIndexes(t *testing.T) { defer th.TearDown() t.Run("as system user", func(t *testing.T) { - _, resp := th.Client.PurgeBleveIndexes() + resp, err := th.Client.PurgeBleveIndexes() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system user with write experimental permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionPurgeBleveIndexes.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionSysconsoleWriteExperimental.Id, model.SystemUserRoleId) - _, resp := th.Client.PurgeBleveIndexes() + resp, err := th.Client.PurgeBleveIndexes() + require.NoError(t, err) CheckOKStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.PurgeBleveIndexes() + resp, err := th.SystemAdminClient.PurgeBleveIndexes() + require.NoError(t, err) CheckOKStatus(t, resp) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.PurgeBleveIndexes() + resp, err := th.SystemAdminClient.PurgeBleveIndexes() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } diff --git a/api4/bot_test.go b/api4/bot_test.go index 470e0a75f5..41f9050300 100644 --- a/api4/bot_test.go +++ b/api4/bot_test.go @@ -23,13 +23,13 @@ func TestCreateBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - _, resp := th.Client.CreateBot(&model.Bot{ + _, _, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("create bot without config permissions", func(t *testing.T) { @@ -40,13 +40,13 @@ func TestCreateBot(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) th.App.Config().ServiceSettings.EnableBotAccountCreation = model.NewBool(false) - _, resp := th.Client.CreateBot(&model.Bot{ + _, _, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) - CheckErrorMessage(t, resp, "api.bot.create_disabled") + CheckErrorID(t, err, "api.bot.create_disabled") }) t.Run("create bot with permissions", func(t *testing.T) { @@ -66,7 +66,8 @@ func TestCreateBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) require.Equal(t, bot.Username, createdBot.Username) @@ -85,13 +86,13 @@ func TestCreateBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - _, resp := th.Client.CreateBot(&model.Bot{ + _, _, err := th.Client.CreateBot(&model.Bot{ Username: "username", DisplayName: "a bot", Description: strings.Repeat("x", 1025), }) - CheckErrorMessage(t, resp, "model.bot.is_valid.description.app_error") + CheckErrorID(t, err, "model.bot.is_valid.description.app_error") }) t.Run("bot attempt to create bot fails", func(t *testing.T) { @@ -107,26 +108,27 @@ func TestCreateBot(t *testing.T) { th.AddPermissionToRole(model.PermissionEditOtherUsers.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - bot, resp := th.Client.CreateBot(&model.Bot{ + bot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) th.App.UpdateUserRoles(bot.UserId, model.TeamUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - rtoken, resp := th.Client.CreateUserAccessToken(bot.UserId, "test token") - CheckNoError(t, resp) + rtoken, _, err := th.Client.CreateUserAccessToken(bot.UserId, "test token") + require.NoError(t, err) th.Client.AuthToken = rtoken.Token - _, resp = th.Client.CreateBot(&model.Bot{ + _, _, err = th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), OwnerId: bot.UserId, DisplayName: "a bot2", Description: "bot2", }) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + CheckErrorID(t, err, "api.context.permissions.app_error") }) } @@ -138,7 +140,8 @@ func TestPatchBot(t *testing.T) { defer th.RestoreDefaultRolePermissions(th.SaveDefaultRolePermissions()) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.PatchBot(model.NewId(), &model.BotPatch{}) + _, resp, err := client.PatchBot(model.NewId(), &model.BotPatch{}) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) }) @@ -154,11 +157,12 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot created by a user", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -168,7 +172,8 @@ func TestPatchBot(t *testing.T) { DisplayName: sToP("an updated bot"), Description: sToP("updated bot"), } - patchedBot, patchResp := client.PatchBot(createdBot.UserId, botPatch) + patchedBot, patchResp, err2 := client.PatchBot(createdBot.UserId, botPatch) + require.NoError(t, err2) CheckOKStatus(t, patchResp) require.Equal(t, *botPatch.Username, patchedBot.Username) require.Equal(t, *botPatch.DisplayName, patchedBot.DisplayName) @@ -176,11 +181,12 @@ func TestPatchBot(t *testing.T) { require.Equal(t, th.BasicUser.Id, patchedBot.OwnerId) }, "bot created by user") - createdBotSystemAdmin, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBotSystemAdmin, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "another bot", Description: "bot created by system admin user", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBotSystemAdmin.UserId) @@ -190,7 +196,8 @@ func TestPatchBot(t *testing.T) { DisplayName: sToP("an updated bot"), Description: sToP("updated bot"), } - patchedBot, patchResp := client.PatchBot(createdBotSystemAdmin.UserId, botPatch) + patchedBot, patchResp, err := client.PatchBot(createdBotSystemAdmin.UserId, botPatch) + require.NoError(t, err) CheckOKStatus(t, patchResp) require.Equal(t, *botPatch.Username, patchedBot.Username) require.Equal(t, *botPatch.DisplayName, patchedBot.DisplayName) @@ -208,16 +215,17 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.Client.PatchBot(createdBot.UserId, &model.BotPatch{}) - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err = th.Client.PatchBot(createdBot.UserId, &model.BotPatch{}) + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("patch someone else's bot without permission, but with read others permission", func(t *testing.T) { @@ -231,16 +239,17 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.Client.PatchBot(createdBot.UserId, &model.BotPatch{}) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.PatchBot(createdBot.UserId, &model.BotPatch{}) + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("patch someone else's bot with permission", func(t *testing.T) { @@ -254,11 +263,12 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -268,7 +278,8 @@ func TestPatchBot(t *testing.T) { Description: sToP("updated bot"), } - patchedBot, resp := th.Client.PatchBot(createdBot.UserId, botPatch) + patchedBot, resp, err := th.Client.PatchBot(createdBot.UserId, botPatch) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *botPatch.Username, patchedBot.Username) require.Equal(t, *botPatch.DisplayName, patchedBot.DisplayName) @@ -282,11 +293,12 @@ func TestPatchBot(t *testing.T) { th.AddPermissionToRole(model.PermissionManageRoles.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - success, resp := th.Client.UpdateUserRoles(createdBot.UserId, model.SystemUserRoleId) + resp, err = th.Client.UpdateUserRoles(createdBot.UserId, model.SystemUserRoleId) + require.NoError(t, err) CheckOKStatus(t, resp) - require.True(t, success) - bots, resp := th.Client.GetBots(0, 2, "") + bots, resp, err := th.Client.GetBots(0, 2, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Len(t, bots, 1) require.Equal(t, []*model.Bot{patchedBot}, bots) @@ -303,11 +315,12 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -317,8 +330,8 @@ func TestPatchBot(t *testing.T) { Description: sToP("updated bot"), } - _, resp = th.Client.PatchBot(createdBot.UserId, botPatch) - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err = th.Client.PatchBot(createdBot.UserId, botPatch) + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("patch my bot without permission, but with read permission", func(t *testing.T) { @@ -333,11 +346,12 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -347,8 +361,8 @@ func TestPatchBot(t *testing.T) { Description: sToP("updated bot"), } - _, resp = th.Client.PatchBot(createdBot.UserId, botPatch) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.PatchBot(createdBot.UserId, botPatch) + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("patch my bot with permission", func(t *testing.T) { @@ -363,11 +377,12 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -377,7 +392,8 @@ func TestPatchBot(t *testing.T) { Description: sToP("updated bot"), } - patchedBot, resp := th.Client.PatchBot(createdBot.UserId, botPatch) + patchedBot, resp, err := th.Client.PatchBot(createdBot.UserId, botPatch) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *botPatch.Username, patchedBot.Username) require.Equal(t, *botPatch.DisplayName, patchedBot.DisplayName) @@ -403,7 +419,8 @@ func TestPatchBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) @@ -411,7 +428,8 @@ func TestPatchBot(t *testing.T) { Username: sToP(GenerateTestUsername()), } - patchedBot, resp := th.Client.PatchBot(createdBot.UserId, botPatch) + patchedBot, resp, err := th.Client.PatchBot(createdBot.UserId, botPatch) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *botPatch.Username, patchedBot.Username) require.Equal(t, bot.DisplayName, patchedBot.DisplayName) @@ -431,22 +449,23 @@ func TestPatchBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - r, appErr := th.Client.DoApiPut(th.Client.GetBotRoute(createdBot.UserId), `{"creator_id":"`+th.BasicUser2.Id+`"}`) - require.Nil(t, appErr) + r, err := th.Client.DoApiPut(th.Client.GetBotRoute(createdBot.UserId), `{"creator_id":"`+th.BasicUser2.Id+`"}`) + require.NoError(t, err) defer func() { _, _ = ioutil.ReadAll(r.Body) _ = r.Body.Close() }() var patchedBot *model.Bot - err := json.NewDecoder(r.Body).Decode(&patchedBot) + err = json.NewDecoder(r.Body).Decode(&patchedBot) require.NoError(t, err) resp = model.BuildResponse(r) @@ -464,29 +483,33 @@ func TestGetBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - bot1, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot1, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "the first bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot1.UserId) - bot2, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot2, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "another bot", Description: "the second bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot2.UserId) - deletedBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + deletedBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "a deleted bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(deletedBot.UserId) - deletedBot, resp = th.SystemAdminClient.DisableBot(deletedBot.UserId) + deletedBot, resp, err = th.SystemAdminClient.DisableBot(deletedBot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) th.AddPermissionToRole(model.PermissionCreateBot.Id, model.TeamUserRoleId) @@ -495,11 +518,12 @@ func TestGetBot(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - myBot, resp := th.Client.CreateBot(&model.Bot{ + myBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "my bot", Description: "a bot created by non-admin", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(myBot.UserId) th.RemovePermissionFromRole(model.PermissionCreateBot.Id, model.TeamUserRoleId) @@ -511,7 +535,8 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - _, resp := th.Client.GetBot(model.NewId(), "") + _, resp, err := th.Client.GetBot(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -522,11 +547,12 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - bot, resp := th.Client.GetBot(bot1.UserId, "") + bot, resp, err := th.Client.GetBot(bot1.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, bot1, bot) - bot, resp = th.Client.GetBot(bot1.UserId, bot.Etag()) + bot, resp, _ = th.Client.GetBot(bot1.UserId, bot.Etag()) CheckEtag(t, bot, resp) }) @@ -537,11 +563,12 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - bot, resp := th.Client.GetBot(bot2.UserId, "") + bot, resp, err := th.Client.GetBot(bot2.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, bot2, bot) - bot, resp = th.Client.GetBot(bot2.UserId, bot.Etag()) + bot, resp, _ = th.Client.GetBot(bot2.UserId, bot.Etag()) CheckEtag(t, bot, resp) }) @@ -554,8 +581,8 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - _, resp := th.Client.GetBot(bot1.UserId, "") - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err := th.Client.GetBot(bot1.UserId, "") + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("get myBot without ReadBots OR ReadOthersBots permissions", func(t *testing.T) { @@ -566,8 +593,8 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - _, resp := th.Client.GetBot(myBot.UserId, "") - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err := th.Client.GetBot(myBot.UserId, "") + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("get deleted bot", func(t *testing.T) { @@ -577,7 +604,8 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - _, resp := th.Client.GetBot(deletedBot.UserId, "") + _, resp, err := th.Client.GetBot(deletedBot.UserId, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -588,14 +616,15 @@ func TestGetBot(t *testing.T) { th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - bot, resp := th.Client.GetBotIncludeDeleted(deletedBot.UserId, "") + bot, resp, err := th.Client.GetBotIncludeDeleted(deletedBot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.NotEqual(t, 0, bot.DeleteAt) deletedBot.UpdateAt = bot.UpdateAt deletedBot.DeleteAt = bot.DeleteAt require.Equal(t, deletedBot, bot) - bot, resp = th.Client.GetBotIncludeDeleted(deletedBot.UserId, bot.Etag()) + bot, resp, _ = th.Client.GetBotIncludeDeleted(deletedBot.UserId, bot.Etag()) CheckEtag(t, bot, resp) }) } @@ -608,55 +637,63 @@ func TestGetBots(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - bot1, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot1, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "the first bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot1.UserId) - deletedBot1, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + deletedBot1, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "a deleted bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(deletedBot1.UserId) - deletedBot1, resp = th.SystemAdminClient.DisableBot(deletedBot1.UserId) + deletedBot1, resp, err = th.SystemAdminClient.DisableBot(deletedBot1.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) - bot2, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot2, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "another bot", Description: "the second bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot2.UserId) - bot3, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot3, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "another bot", Description: "the third bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot3.UserId) - deletedBot2, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + deletedBot2, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "a deleted bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(deletedBot2.UserId) - deletedBot2, resp = th.SystemAdminClient.DisableBot(deletedBot2.UserId) + deletedBot2, resp, err = th.SystemAdminClient.DisableBot(deletedBot2.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) th.AddPermissionToRole(model.PermissionCreateBot.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser2.Id, model.TeamUserRoleId, false) th.LoginBasic2() - orphanedBot, resp := th.Client.CreateBot(&model.Bot{ + orphanedBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "an oprphaned bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.LoginBasic() defer th.App.PermanentDeleteBot(orphanedBot.UserId) @@ -664,7 +701,8 @@ func TestGetBots(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.DisableBotsWhenOwnerIsDeactivated = false }) - _, resp = th.SystemAdminClient.DeleteUser(th.BasicUser2.Id) + resp, err = th.SystemAdminClient.DeleteUser(th.BasicUser2.Id) + require.NoError(t, err) CheckOKStatus(t, resp) t.Run("get bots, page=0, perPage=10", func(t *testing.T) { @@ -676,13 +714,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot1, bot2, bot3, orphanedBot} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBots(0, 10, "") + bots, resp, err := client.GetBots(0, 10, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBots(0, 10, botList.Etag()) + bots, resp, _ := th.Client.GetBots(0, 10, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -695,13 +734,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot1} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBots(0, 1, "") + bots, resp, err := client.GetBots(0, 1, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBots(0, 1, botList.Etag()) + bots, resp, _ := th.Client.GetBots(0, 1, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -714,13 +754,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot3, orphanedBot} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBots(1, 2, "") + bots, resp, err := client.GetBots(1, 2, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBots(1, 2, botList.Etag()) + bots, resp, _ := th.Client.GetBots(1, 2, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -733,13 +774,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBots(2, 2, "") + bots, resp, err := client.GetBots(2, 2, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBots(2, 2, botList.Etag()) + bots, resp, _ := th.Client.GetBots(2, 2, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -752,13 +794,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot1, deletedBot1, bot2, bot3, deletedBot2, orphanedBot} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBotsIncludeDeleted(0, 10, "") + bots, resp, err := client.GetBotsIncludeDeleted(0, 10, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBotsIncludeDeleted(0, 10, botList.Etag()) + bots, resp, _ := th.Client.GetBotsIncludeDeleted(0, 10, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -771,13 +814,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot1} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBotsIncludeDeleted(0, 1, "") + bots, resp, err := client.GetBotsIncludeDeleted(0, 1, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBotsIncludeDeleted(0, 1, botList.Etag()) + bots, resp, _ := th.Client.GetBotsIncludeDeleted(0, 1, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -790,13 +834,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{bot2, bot3} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBotsIncludeDeleted(1, 2, "") + bots, resp, err := client.GetBotsIncludeDeleted(1, 2, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBotsIncludeDeleted(1, 2, botList.Etag()) + bots, resp, _ := th.Client.GetBotsIncludeDeleted(1, 2, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -809,13 +854,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{deletedBot2, orphanedBot} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBotsIncludeDeleted(2, 2, "") + bots, resp, err := client.GetBotsIncludeDeleted(2, 2, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBotsIncludeDeleted(2, 2, botList.Etag()) + bots, resp, _ := th.Client.GetBotsIncludeDeleted(2, 2, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -828,13 +874,14 @@ func TestGetBots(t *testing.T) { expectedBotList := []*model.Bot{orphanedBot} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bots, resp := client.GetBotsOrphaned(0, 10, "") + bots, resp, err := client.GetBotsOrphaned(0, 10, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, expectedBotList, bots) }) botList := model.BotList(expectedBotList) - bots, resp := th.Client.GetBotsOrphaned(0, 10, botList.Etag()) + bots, resp, _ := th.Client.GetBotsOrphaned(0, 10, botList.Etag()) CheckEtag(t, bots, resp) }) @@ -846,8 +893,8 @@ func TestGetBots(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) th.App.UpdateUserRoles(th.BasicUser.Id, model.TeamUserRoleId, false) - _, resp := th.Client.GetBots(0, 10, "") - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err := th.Client.GetBots(0, 10, "") + CheckErrorID(t, err, "api.context.permissions.app_error") }) } @@ -857,7 +904,8 @@ func TestDisableBot(t *testing.T) { defer th.TearDown() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.DisableBot(model.NewId()) + _, resp, err := client.DisableBot(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) }) @@ -878,12 +926,13 @@ func TestDisableBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.Client.DisableBot(createdBot.UserId) - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err = th.Client.DisableBot(createdBot.UserId) + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("disable bot without permission, but with read permission", func(t *testing.T) { @@ -903,12 +952,13 @@ func TestDisableBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.Client.DisableBot(createdBot.UserId) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.DisableBot(createdBot.UserId) + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("disable bot with permission", func(t *testing.T) { @@ -924,26 +974,30 @@ func TestDisableBot(t *testing.T) { }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bot, resp := th.Client.CreateBot(&model.Bot{ + bot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) - disabledBot, resp := client.DisableBot(bot.UserId) + disabledBot, resp, err := client.DisableBot(bot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) bot.UpdateAt = disabledBot.UpdateAt bot.DeleteAt = disabledBot.DeleteAt require.Equal(t, bot, disabledBot) // Check bot disabled - disab, resp := th.SystemAdminClient.GetBotIncludeDeleted(bot.UserId, "") + disab, resp, err := th.SystemAdminClient.GetBotIncludeDeleted(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.NotZero(t, disab.DeleteAt) // Disabling should be idempotent. - disabledBot2, resp := client.DisableBot(bot.UserId) + disabledBot2, resp, err := client.DisableBot(bot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, bot, disabledBot2) }) @@ -955,7 +1009,8 @@ func TestEnableBot(t *testing.T) { defer th.TearDown() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := th.Client.EnableBot(model.NewId()) + _, resp, err := th.Client.EnableBot(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) }) @@ -976,15 +1031,17 @@ func TestEnableBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.SystemAdminClient.DisableBot(createdBot.UserId) + _, resp, err = th.SystemAdminClient.DisableBot(createdBot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) - _, resp = th.Client.EnableBot(createdBot.UserId) - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err = th.Client.EnableBot(createdBot.UserId) + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") }) t.Run("enable bot without permission, but with read permission", func(t *testing.T) { @@ -1004,15 +1061,17 @@ func TestEnableBot(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - _, resp = th.SystemAdminClient.DisableBot(createdBot.UserId) + _, resp, err = th.SystemAdminClient.DisableBot(createdBot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) - _, resp = th.Client.EnableBot(createdBot.UserId) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.EnableBot(createdBot.UserId) + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("enable bot with permission", func(t *testing.T) { @@ -1028,29 +1087,34 @@ func TestEnableBot(t *testing.T) { }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - bot, resp := th.Client.CreateBot(&model.Bot{ + bot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) - _, resp = th.SystemAdminClient.DisableBot(bot.UserId) + _, resp, err = th.SystemAdminClient.DisableBot(bot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) - enabledBot1, resp := client.EnableBot(bot.UserId) + enabledBot1, resp, err := client.EnableBot(bot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) bot.UpdateAt = enabledBot1.UpdateAt bot.DeleteAt = enabledBot1.DeleteAt require.Equal(t, bot, enabledBot1) // Check bot enabled - enab, resp := th.SystemAdminClient.GetBotIncludeDeleted(bot.UserId, "") + enab, resp, err := th.SystemAdminClient.GetBotIncludeDeleted(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Zero(t, enab.DeleteAt) // Disabling should be idempotent. - enabledBot2, resp := client.EnableBot(bot.UserId) + enabledBot2, resp, err := client.EnableBot(bot.UserId) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, bot, enabledBot2) }) @@ -1063,7 +1127,8 @@ func TestAssignBot(t *testing.T) { t.Run("claim non-existent bot", func(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.AssignBot(model.NewId(), model.NewId()) + _, resp, err := client.AssignBot(model.NewId(), model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) }) @@ -1081,31 +1146,38 @@ func TestAssignBot(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - bot, resp := th.Client.CreateBot(bot) + bot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) - before, resp := th.Client.GetBot(bot.UserId, "") + before, resp, err := th.Client.GetBot(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, th.BasicUser.Id, before.OwnerId) - _, resp = th.SystemAdminClient.AssignBot(bot.UserId, th.SystemAdminUser.Id) + _, resp, err = th.SystemAdminClient.AssignBot(bot.UserId, th.SystemAdminUser.Id) + require.NoError(t, err) CheckOKStatus(t, resp) // Original owner doesn't have read others bots permission, therefore can't see bot anymore - _, resp = th.Client.GetBot(bot.UserId, "") + _, resp, err = th.Client.GetBot(bot.UserId, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) // System admin can see creator ID has changed - after, resp := th.SystemAdminClient.GetBot(bot.UserId, "") + after, resp, err := th.SystemAdminClient.GetBot(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, th.SystemAdminUser.Id, after.OwnerId) // Assign back to user without permissions to manage, using local mode - _, resp = th.LocalClient.AssignBot(bot.UserId, th.BasicUser.Id) + _, resp, err = th.LocalClient.AssignBot(bot.UserId, th.BasicUser.Id) + require.NoError(t, err) CheckOKStatus(t, resp) - after, resp = th.SystemAdminClient.GetBot(bot.UserId, "") + after, resp, err = th.SystemAdminClient.GetBot(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, th.BasicUser.Id, after.OwnerId) }) @@ -1123,20 +1195,21 @@ func TestAssignBot(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) th.LoginBasic2() // Without permission to read others bots it doesn't exist - _, resp = th.Client.AssignBot(createdBot.UserId, th.BasicUser2.Id) - CheckErrorMessage(t, resp, "store.sql_bot.get.missing.app_error") + _, _, err = th.Client.AssignBot(createdBot.UserId, th.BasicUser2.Id) + CheckErrorID(t, err, "store.sql_bot.get.missing.app_error") // With permissions to read we don't have permissions to modify th.AddPermissionToRole(model.PermissionReadOthersBots.Id, model.SystemUserRoleId) - _, resp = th.Client.AssignBot(createdBot.UserId, th.BasicUser2.Id) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.AssignBot(createdBot.UserId, th.BasicUser2.Id) + CheckErrorID(t, err, "api.context.permissions.app_error") th.LoginBasic() }) @@ -1154,7 +1227,8 @@ func TestAssignBot(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - bot, resp := th.Client.CreateBot(bot) + bot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) @@ -1166,10 +1240,12 @@ func TestAssignBot(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.SystemUserRoleId) th.LoginBasic2() - _, resp = th.Client.AssignBot(bot.UserId, th.BasicUser2.Id) + _, resp, err = th.Client.AssignBot(bot.UserId, th.BasicUser2.Id) + require.NoError(t, err) CheckOKStatus(t, resp) - after, resp := th.SystemAdminClient.GetBot(bot.UserId, "") + after, resp, err := th.SystemAdminClient.GetBot(bot.UserId, "") + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, th.BasicUser2.Id, after.OwnerId) }) @@ -1187,21 +1263,22 @@ func TestAssignBot(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - bot, resp := th.Client.CreateBot(bot) + bot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) - bot2, resp := th.Client.CreateBot(&model.Bot{ + bot2, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) - + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot2.UserId) - _, resp = th.Client.AssignBot(bot.UserId, bot2.UserId) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err = th.Client.AssignBot(bot.UserId, bot2.UserId) + CheckErrorID(t, err, "api.context.permissions.app_error") }) } @@ -1220,14 +1297,17 @@ func TestConvertBotToUser(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - bot, resp := th.Client.CreateBot(bot) + bot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(bot.UserId) - _, resp = th.Client.ConvertBotToUser(bot.UserId, &model.UserPatch{}, false) + _, resp, err = th.Client.ConvertBotToUser(bot.UserId, &model.UserPatch{}, false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - user, resp := th.Client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, false) + user, resp, err := th.Client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, false) + require.Error(t, err) CheckForbiddenStatus(t, resp) require.Nil(t, user) @@ -1236,35 +1316,40 @@ func TestConvertBotToUser(t *testing.T) { Username: GenerateTestUsername(), Description: "bot", } - bot, resp := th.SystemAdminClient.CreateBot(bot) + bot, resp, err := th.SystemAdminClient.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) - user, resp := client.ConvertBotToUser(bot.UserId, &model.UserPatch{}, false) + user, resp, err := client.ConvertBotToUser(bot.UserId, &model.UserPatch{}, false) + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, user) - user, resp = client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, false) - CheckNoError(t, resp) + user, _, err = client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, false) + require.NoError(t, err) require.NotNil(t, user) require.Equal(t, bot.UserId, user.Id) - _, resp = client.GetBot(bot.UserId, "") + _, resp, err = client.GetBot(bot.UserId, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) bot = &model.Bot{ Username: GenerateTestUsername(), Description: "systemAdminBot", } - bot, resp = th.SystemAdminClient.CreateBot(bot) + bot, resp, err = th.SystemAdminClient.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) - user, resp = client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, true) - CheckNoError(t, resp) + user, _, err = client.ConvertBotToUser(bot.UserId, &model.UserPatch{Password: model.NewString("password")}, true) + require.NoError(t, err) require.NotNil(t, user) require.Equal(t, bot.UserId, user.Id) require.Contains(t, user.GetRoles(), model.SystemAdminRoleId) - _, resp = client.GetBot(bot.UserId, "") + _, resp, err = client.GetBot(bot.UserId, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } diff --git a/api4/brand_test.go b/api4/brand_test.go index e2e9e048a9..854b3c32f8 100644 --- a/api4/brand_test.go +++ b/api4/brand_test.go @@ -15,34 +15,39 @@ import ( func TestGetBrandImage(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - _, resp := Client.GetBrandImage() + _, resp, err := client.GetBrandImage() + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetBrandImage() + client.Logout() + _, resp, err = client.GetBrandImage() + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = th.SystemAdminClient.GetBrandImage() + _, resp, err = th.SystemAdminClient.GetBrandImage() + require.Error(t, err) CheckNotFoundStatus(t, resp) } func TestUploadBrandImage(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - _, resp := Client.UploadBrandImage(data) + resp, err := client.UploadBrandImage(data) + require.Error(t, err) CheckForbiddenStatus(t, resp) // status code returns either forbidden or unauthorized // note: forbidden is set as default at Client4.SetProfileImage when request is terminated early by server - Client.Logout() - _, resp = Client.UploadBrandImage(data) + client.Logout() + resp, err = client.UploadBrandImage(data) + require.Error(t, err) if resp.StatusCode == http.StatusForbidden { CheckForbiddenStatus(t, resp) } else if resp.StatusCode == http.StatusUnauthorized { @@ -51,7 +56,8 @@ func TestUploadBrandImage(t *testing.T) { require.Fail(t, "Should have failed either forbidden or unauthorized") } - _, resp = th.SystemAdminClient.UploadBrandImage(data) + resp, err = th.SystemAdminClient.UploadBrandImage(data) + require.NoError(t, err) CheckCreatedStatus(t, resp) } @@ -62,20 +68,25 @@ func TestDeleteBrandImage(t *testing.T) { data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - _, resp := th.SystemAdminClient.UploadBrandImage(data) + resp, err := th.SystemAdminClient.UploadBrandImage(data) + require.NoError(t, err) CheckCreatedStatus(t, resp) - resp = th.Client.DeleteBrandImage() + resp, err = th.Client.DeleteBrandImage() + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - resp = th.Client.DeleteBrandImage() + resp, err = th.Client.DeleteBrandImage() + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - resp = th.SystemAdminClient.DeleteBrandImage() + resp, err = th.SystemAdminClient.DeleteBrandImage() + require.NoError(t, err) CheckOKStatus(t, resp) - resp = th.SystemAdminClient.DeleteBrandImage() + resp, err = th.SystemAdminClient.DeleteBrandImage() + require.Error(t, err) CheckNotFoundStatus(t, resp) } diff --git a/api4/channel_category_test.go b/api4/channel_category_test.go index d6f3a8ed0a..28876a3c8c 100644 --- a/api4/channel_category_test.go +++ b/api4/channel_category_test.go @@ -19,8 +19,8 @@ func TestCreateCategoryForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from creating a category with an invalid channel ID", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -34,8 +34,8 @@ func TestCreateCategoryForTeamForUser(t *testing.T) { Channels: []string{th.BasicChannel.Id, "notachannel", th.BasicChannel2.Id}, } - received, resp := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, category) - require.Nil(t, resp.Error) + received, _, err := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, category) + require.NoError(t, err) assert.NotContains(t, received.Channels, "notachannel") assert.Equal(t, []string{th.BasicChannel.Id, th.BasicChannel2.Id}, received.Channels) }) @@ -43,18 +43,18 @@ func TestCreateCategoryForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from creating a category with a channel that they're not a member of", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) // Have another user create a channel that user isn't a part of - channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{ + channel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ TeamId: th.BasicTeam.Id, Type: model.ChannelTypeOpen, Name: "testchannel", }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Attempt to create the category category := &model.SidebarCategoryWithChannels{ @@ -66,8 +66,8 @@ func TestCreateCategoryForTeamForUser(t *testing.T) { Channels: []string{th.BasicChannel.Id, channel.Id}, } - received, resp := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, category) - require.Nil(t, resp.Error) + received, _, err := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, category) + require.NoError(t, err) assert.NotContains(t, received.Channels, channel.Id) assert.Equal(t, []string{th.BasicChannel.Id}, received.Channels) }) @@ -80,8 +80,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should update the channel order of the Channels category", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -95,14 +95,14 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: []string{channelsCategory.Channels[1], channelsCategory.Channels[0], channelsCategory.Channels[4], channelsCategory.Channels[3], channelsCategory.Channels[2]}, } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) - assert.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) + assert.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.Equal(t, updatedCategory.Channels, received.Channels) // And when requesting the category later - received, resp = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, "") - assert.Nil(t, resp.Error) + received, _, err = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, "") + assert.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.Equal(t, updatedCategory.Channels, received.Channels) }) @@ -110,8 +110,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should update the sort order of the DM category", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -126,14 +126,14 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { } updatedCategory.Sorting = model.SidebarCategorySortAlphabetical - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, updatedCategory) - assert.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, updatedCategory) + assert.NoError(t, err) assert.Equal(t, dmsCategory.Id, received.Id) assert.Equal(t, model.SidebarCategorySortAlphabetical, received.Sorting) // And when requesting the category later - received, resp = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, "") - assert.Nil(t, resp.Error) + received, _, err = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, "") + assert.NoError(t, err) assert.Equal(t, dmsCategory.Id, received.Id) assert.Equal(t, model.SidebarCategorySortAlphabetical, received.Sorting) }) @@ -141,14 +141,14 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should update the display name of a custom category", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - customCategory, resp := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, &model.SidebarCategoryWithChannels{ + customCategory, _, err := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, &model.SidebarCategoryWithChannels{ SidebarCategory: model.SidebarCategory{ UserId: user.Id, TeamId: th.BasicTeam.Id, DisplayName: "custom123", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Equal(t, "custom123", customCategory.DisplayName) // Should return the correct values from the API @@ -158,14 +158,14 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { } updatedCategory.DisplayName = "abcCustom" - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, customCategory.Id, updatedCategory) - assert.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, customCategory.Id, updatedCategory) + assert.NoError(t, err) assert.Equal(t, customCategory.Id, received.Id) assert.Equal(t, updatedCategory.DisplayName, received.DisplayName) // And when requesting the category later - received, resp = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, customCategory.Id, "") - assert.Nil(t, resp.Error) + received, _, err = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, customCategory.Id, "") + assert.NoError(t, err) assert.Equal(t, customCategory.Id, received.Id) assert.Equal(t, updatedCategory.DisplayName, received.DisplayName) }) @@ -173,8 +173,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should update the channel order of the category even if it contains archived channels", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -183,8 +183,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { require.Len(t, channelsCategory.Channels, 5) // Town Square, Off Topic, and the 3 channels created by InitBasic // Delete one of the channels - _, resp = client.DeleteChannel(th.BasicChannel.Id) - require.Nil(t, resp.Error) + _, err = client.DeleteChannel(th.BasicChannel.Id) + require.NoError(t, err) // Should still be able to reorder the channels updatedCategory := &model.SidebarCategoryWithChannels{ @@ -192,8 +192,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: []string{channelsCategory.Channels[1], channelsCategory.Channels[0], channelsCategory.Channels[4], channelsCategory.Channels[3], channelsCategory.Channels[2]}, } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.Equal(t, updatedCategory.Channels, received.Channels) }) @@ -201,8 +201,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from adding an invalid channel ID", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -214,8 +214,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: append(channelsCategory.Channels, "notachannel"), } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.NotContains(t, received.Channels, "notachannel") assert.Equal(t, channelsCategory.Channels, received.Channels) @@ -224,8 +224,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from adding a channel that they're not a member of", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -233,12 +233,12 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) // Have another user create a channel that user isn't a part of - channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{ + channel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ TeamId: th.BasicTeam.Id, Type: model.ChannelTypeOpen, Name: "testchannel", }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Attempt to update the category updatedCategory := &model.SidebarCategoryWithChannels{ @@ -246,8 +246,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: append(channelsCategory.Channels, channel.Id), } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.NotContains(t, received.Channels, channel.Id) assert.Equal(t, channelsCategory.Channels, received.Channels) @@ -256,8 +256,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { t.Run("muting a category should mute all of its channels", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -277,28 +277,28 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: channelsCategory.Channels, } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, updatedCategory) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.True(t, received.Muted) // Check that the muted category was saved in the database - received, resp = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, "") - require.Nil(t, resp.Error) + received, _, err = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, channelsCategory.Id, "") + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received.Id) assert.True(t, received.Muted) // Confirm that the channels in the category were muted - member, resp := client.GetChannelMember(channelsCategory.Channels[0], user.Id, "") - require.Nil(t, resp.Error) + member, _, err := client.GetChannelMember(channelsCategory.Channels[0], user.Id, "") + require.NoError(t, err) assert.True(t, member.IsChannelMuted()) }) t.Run("should not be able to mute DM category", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -307,8 +307,8 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { require.Len(t, dmsCategory.Channels, 0) // Ensure a DM channel exists - dmChannel, resp := client.CreateDirectChannel(user.Id, th.BasicUser.Id) - require.Nil(t, resp.Error) + dmChannel, _, err := client.CreateDirectChannel(user.Id, th.BasicUser.Id) + require.NoError(t, err) // Attempt to mute the category updatedCategory := &model.SidebarCategoryWithChannels{ @@ -322,20 +322,20 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) { Channels: []string{dmChannel.Id}, } - received, resp := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, updatedCategory) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, updatedCategory) + require.NoError(t, err) assert.Equal(t, dmsCategory.Id, received.Id) assert.False(t, received.Muted) // Check that the muted category was not saved in the database - received, resp = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, "") - require.Nil(t, resp.Error) + received, _, err = client.GetSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, dmsCategory.Id, "") + require.NoError(t, err) assert.Equal(t, dmsCategory.Id, received.Id) assert.False(t, received.Muted) // Confirm that the channels in the category were not muted - member, resp := client.GetChannelMember(dmChannel.Id, user.Id, "") - require.Nil(t, resp.Error) + member, _, err := client.GetChannelMember(dmChannel.Id, user.Id, "") + require.NoError(t, err) assert.False(t, member.IsChannelMuted()) }) } @@ -347,8 +347,8 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from adding an invalid channel ID", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -360,8 +360,8 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { Channels: append(channelsCategory.Channels, "notachannel"), } - received, resp := client.UpdateSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, []*model.SidebarCategoryWithChannels{updatedCategory}) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, []*model.SidebarCategoryWithChannels{updatedCategory}) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received[0].Id) assert.NotContains(t, received[0].Channels, "notachannel") assert.Equal(t, channelsCategory.Channels, received[0].Channels) @@ -370,8 +370,8 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { t.Run("should silently prevent the user from adding a channel that they're not a member of", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -379,12 +379,12 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) // Have another user create a channel that user isn't a part of - channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{ + channel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ TeamId: th.BasicTeam.Id, Type: model.ChannelTypeOpen, Name: "testchannel", }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Attempt to update the category updatedCategory := &model.SidebarCategoryWithChannels{ @@ -392,8 +392,8 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { Channels: append(channelsCategory.Channels, channel.Id), } - received, resp := client.UpdateSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, []*model.SidebarCategoryWithChannels{updatedCategory}) - require.Nil(t, resp.Error) + received, _, err := client.UpdateSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, []*model.SidebarCategoryWithChannels{updatedCategory}) + require.NoError(t, err) assert.Equal(t, channelsCategory.Id, received[0].Id) assert.NotContains(t, received[0].Channels, channel.Id) assert.Equal(t, channelsCategory.Channels, received[0].Channels) @@ -402,19 +402,19 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { t.Run("should update order", func(t *testing.T) { user, client := setupUserForSubtest(t, th) - categories, resp := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err := client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) channelsCategory := categories.Categories[1] require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) - _, resp = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], categories.Order[2]}) - require.Nil(t, resp.Error) + _, _, err = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], categories.Order[2]}) + require.NoError(t, err) - categories, resp = client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client.GetSidebarCategoriesForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, categories.Categories, 3) require.Len(t, categories.Order, 3) @@ -422,28 +422,28 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) { require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) // validate order - newOrder, resp := client.GetSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, "") - require.Nil(t, resp.Error) + newOrder, _, err := client.GetSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.EqualValues(t, newOrder, categories.Order) // try to update with missing category - _, resp = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0]}) - require.NotNil(t, resp.Error) + _, _, err = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0]}) + require.Error(t, err) // try to update with invalid category - _, resp = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], "asd"}) - require.NotNil(t, resp.Error) + _, _, err = client.UpdateSidebarCategoryOrderForTeamForUser(user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], "asd"}) + require.Error(t, err) }) } func setupUserForSubtest(t *testing.T, th *TestHelper) (*model.User, *model.Client4) { password := "password" - user, err := th.App.CreateUser(th.Context, &model.User{ + user, appErr := th.App.CreateUser(th.Context, &model.User{ Email: th.GenerateTestEmail(), Username: "user_" + model.NewId(), Password: password, }) - require.Nil(t, err) + require.Nil(t, appErr) th.LinkUserToTeam(user, th.BasicTeam) th.AddUserToChannel(user, th.BasicChannel) @@ -451,8 +451,8 @@ func setupUserForSubtest(t *testing.T, th *TestHelper) (*model.User, *model.Clie th.AddUserToChannel(user, th.BasicPrivateChannel) client := th.CreateClient() - user, resp := client.Login(user.Email, password) - require.Nil(t, resp.Error) + user, _, err := client.Login(user.Email, password) + require.NoError(t, err) return user, client } diff --git a/api4/channel_test.go b/api4/channel_test.go index 1dc2d07dbc..efd7544c34 100644 --- a/api4/channel_test.go +++ b/api4/channel_test.go @@ -27,47 +27,50 @@ import ( func TestCreateChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id} private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypePrivate, TeamId: team.Id} - rchannel, resp := Client.CreateChannel(channel) - CheckNoError(t, resp) + rchannel, resp, err := client.CreateChannel(channel) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, channel.Name, rchannel.Name, "names did not match") require.Equal(t, channel.DisplayName, rchannel.DisplayName, "display names did not match") require.Equal(t, channel.TeamId, rchannel.TeamId, "team ids did not match") - rprivate, resp := Client.CreateChannel(private) - CheckNoError(t, resp) + rprivate, _, err := client.CreateChannel(private) + require.NoError(t, err) require.Equal(t, private.Name, rprivate.Name, "names did not match") require.Equal(t, model.ChannelTypePrivate, rprivate.Type, "wrong channel type") require.Equal(t, th.BasicUser.Id, rprivate.CreatorId, "wrong creator id") - _, resp = Client.CreateChannel(channel) - CheckErrorMessage(t, resp, "store.sql_channel.save_channel.exists.app_error") + _, resp, err = client.CreateChannel(channel) + CheckErrorID(t, err, "store.sql_channel.save_channel.exists.app_error") CheckBadRequestStatus(t, resp) direct := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeDirect, TeamId: team.Id} - _, resp = Client.CreateChannel(direct) - CheckErrorMessage(t, resp, "api.channel.create_channel.direct_channel.app_error") + _, resp, err = client.CreateChannel(direct) + CheckErrorID(t, err, "api.channel.create_channel.direct_channel.app_error") CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.CreateChannel(channel) + client.Logout() + _, resp, err = client.CreateChannel(channel) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) userNotOnTeam := th.CreateUser() - Client.Login(userNotOnTeam.Email, userNotOnTeam.Password) + client.Login(userNotOnTeam.Email, userNotOnTeam.Password) - _, resp = Client.CreateChannel(channel) + _, resp, err = client.CreateChannel(channel) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.CreateChannel(private) + _, resp, err = client.CreateChannel(private) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Check the appropriate permissions are enforced. @@ -82,53 +85,55 @@ func TestCreateChannel(t *testing.T) { th.LoginBasic() channel.Name = GenerateTestChannelName() - _, resp = Client.CreateChannel(channel) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(channel) + require.NoError(t, err) private.Name = GenerateTestChannelName() - _, resp = Client.CreateChannel(private) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(private) + require.NoError(t, err) th.AddPermissionToRole(model.PermissionCreatePublicChannel.Id, model.TeamAdminRoleId) th.AddPermissionToRole(model.PermissionCreatePrivateChannel.Id, model.TeamAdminRoleId) th.RemovePermissionFromRole(model.PermissionCreatePublicChannel.Id, model.TeamUserRoleId) th.RemovePermissionFromRole(model.PermissionCreatePrivateChannel.Id, model.TeamUserRoleId) - _, resp = Client.CreateChannel(channel) + _, resp, err = client.CreateChannel(channel) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.CreateChannel(private) + _, resp, err = client.CreateChannel(private) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginTeamAdmin() channel.Name = GenerateTestChannelName() - _, resp = Client.CreateChannel(channel) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(channel) + require.NoError(t, err) private.Name = GenerateTestChannelName() - _, resp = Client.CreateChannel(private) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(private) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { channel.Name = GenerateTestChannelName() - _, resp = client.CreateChannel(channel) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(channel) + require.NoError(t, err) private.Name = GenerateTestChannelName() - _, resp = client.CreateChannel(private) - CheckNoError(t, resp) + _, _, err = client.CreateChannel(private) + require.NoError(t, err) }) // Test posting Garbage - r, err := Client.DoApiPost("/channels", "garbage") - require.NotNil(t, err, "expected error") + r, err := client.DoApiPost("/channels", "garbage") + require.Error(t, err, "expected error") require.Equal(t, http.StatusBadRequest, r.StatusCode, "Expected 400 Bad Request") // Test GroupConstrained flag groupConstrainedChannel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id, GroupConstrained: model.NewBool(true)} - rchannel, resp = Client.CreateChannel(groupConstrainedChannel) - CheckNoError(t, resp) + rchannel, _, err = client.CreateChannel(groupConstrainedChannel) + require.NoError(t, err) require.Equal(t, *groupConstrainedChannel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match") } @@ -136,22 +141,22 @@ func TestCreateChannel(t *testing.T) { func TestUpdateChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id} private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypePrivate, TeamId: team.Id} - channel, _ = Client.CreateChannel(channel) - private, _ = Client.CreateChannel(private) + channel, _, _ = client.CreateChannel(channel) + private, _, _ = client.CreateChannel(private) //Update a open channel channel.DisplayName = "My new display name" channel.Header = "My fancy header" channel.Purpose = "Mattermost ftw!" - newChannel, resp := Client.UpdateChannel(channel) - CheckNoError(t, resp) + newChannel, _, err := client.UpdateChannel(channel) + require.NoError(t, err) require.Equal(t, channel.DisplayName, newChannel.DisplayName, "Update failed for DisplayName") require.Equal(t, channel.Header, newChannel.Header, "Update failed for Header") @@ -159,8 +164,8 @@ func TestUpdateChannel(t *testing.T) { // Test GroupConstrained flag channel.GroupConstrained = model.NewBool(true) - rchannel, resp := Client.UpdateChannel(channel) - CheckNoError(t, resp) + rchannel, resp, err := client.UpdateChannel(channel) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *channel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match") @@ -170,8 +175,8 @@ func TestUpdateChannel(t *testing.T) { private.Header = "My fancy private header" private.Purpose = "Mattermost ftw! in private mode" - newPrivateChannel, resp := Client.UpdateChannel(private) - CheckNoError(t, resp) + newPrivateChannel, _, err := client.UpdateChannel(private) + require.NoError(t, err) require.Equal(t, private.DisplayName, newPrivateChannel.DisplayName, "Update failed for DisplayName in private channel") require.Equal(t, private.Header, newPrivateChannel.Header, "Update failed for Header in private channel") @@ -180,31 +185,35 @@ func TestUpdateChannel(t *testing.T) { // Test that changing the type fails and returns error private.Type = model.ChannelTypeOpen - _, resp = Client.UpdateChannel(private) + _, resp, err = client.UpdateChannel(private) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test that keeping the same type succeeds private.Type = model.ChannelTypePrivate - _, resp = Client.UpdateChannel(private) - CheckNoError(t, resp) + _, _, err = client.UpdateChannel(private) + require.NoError(t, err) //Non existing channel channel1 := &model.Channel{DisplayName: "Test API Name for apiv4", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id} - _, resp = Client.UpdateChannel(channel1) + _, resp, err = client.UpdateChannel(channel1) + require.Error(t, err) CheckNotFoundStatus(t, resp) //Try to update with not logged user - Client.Logout() - _, resp = Client.UpdateChannel(channel) + client.Logout() + _, resp, err = client.UpdateChannel(channel) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) //Try to update using another user user := th.CreateUser() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) channel.DisplayName = "Should not update" - _, resp = Client.UpdateChannel(channel) + _, resp, err = client.UpdateChannel(channel) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test updating the header of someone else's GM channel. @@ -212,33 +221,35 @@ func TestUpdateChannel(t *testing.T) { user2 := th.CreateUser() user3 := th.CreateUser() - groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id}) - CheckNoError(t, resp) + groupChannel, _, err := client.CreateGroupChannel([]string{user1.Id, user2.Id}) + require.NoError(t, err) groupChannel.Header = "lolololol" - Client.Logout() - Client.Login(user3.Email, user3.Password) - _, resp = Client.UpdateChannel(groupChannel) + client.Logout() + client.Login(user3.Email, user3.Password) + _, resp, err = client.UpdateChannel(groupChannel) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test updating the header of someone else's GM channel. - Client.Logout() - Client.Login(user.Email, user.Password) + client.Logout() + client.Login(user.Email, user.Password) - directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id) - CheckNoError(t, resp) + directChannel, _, err := client.CreateDirectChannel(user.Id, user1.Id) + require.NoError(t, err) directChannel.Header = "lolololol" - Client.Logout() - Client.Login(user3.Email, user3.Password) - _, resp = Client.UpdateChannel(directChannel) + client.Logout() + client.Login(user3.Email, user3.Password) + _, resp, err = client.UpdateChannel(directChannel) + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestPatchChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client patch := &model.ChannelPatch{ Name: new(string), @@ -251,8 +262,8 @@ func TestPatchChannel(t *testing.T) { *patch.Header = model.NewId() *patch.Purpose = model.NewId() - channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) - CheckNoError(t, resp) + channel, _, err := client.PatchChannel(th.BasicChannel.Id, patch) + require.NoError(t, err) require.Equal(t, *patch.Name, channel.Name, "do not match") require.Equal(t, *patch.DisplayName, channel.DisplayName, "do not match") @@ -261,37 +272,40 @@ func TestPatchChannel(t *testing.T) { patch.Name = nil oldName := channel.Name - channel, resp = Client.PatchChannel(th.BasicChannel.Id, patch) - CheckNoError(t, resp) + channel, _, err = client.PatchChannel(th.BasicChannel.Id, patch) + require.NoError(t, err) require.Equal(t, oldName, channel.Name, "should not have updated") // Test GroupConstrained flag patch.GroupConstrained = model.NewBool(true) - rchannel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) - CheckNoError(t, resp) + rchannel, resp, err := client.PatchChannel(th.BasicChannel.Id, patch) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *rchannel.GroupConstrained, *patch.GroupConstrained, "GroupConstrained flags do not match") patch.GroupConstrained = nil - _, resp = Client.PatchChannel("junk", patch) + _, resp, err = client.PatchChannel("junk", patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.PatchChannel(model.NewId(), patch) + _, resp, err = client.PatchChannel(model.NewId(), patch) + require.Error(t, err) CheckNotFoundStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.PatchChannel(th.BasicChannel.Id, patch) + client.Login(user.Email, user.Password) + _, resp, err = client.PatchChannel(th.BasicChannel.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.PatchChannel(th.BasicChannel.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchChannel(th.BasicChannel.Id, patch) + require.NoError(t, err) - _, resp = client.PatchChannel(th.BasicPrivateChannel.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchChannel(th.BasicPrivateChannel.Id, patch) + require.NoError(t, err) }) // Test updating the header of someone else's GM channel. @@ -299,36 +313,38 @@ func TestPatchChannel(t *testing.T) { user2 := th.CreateUser() user3 := th.CreateUser() - groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id}) - CheckNoError(t, resp) + groupChannel, _, err := client.CreateGroupChannel([]string{user1.Id, user2.Id}) + require.NoError(t, err) - Client.Logout() - Client.Login(user3.Email, user3.Password) + client.Logout() + client.Login(user3.Email, user3.Password) channelPatch := &model.ChannelPatch{} channelPatch.Header = new(string) *channelPatch.Header = "lolololol" - _, resp = Client.PatchChannel(groupChannel.Id, channelPatch) + _, resp, err = client.PatchChannel(groupChannel.Id, channelPatch) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test updating the header of someone else's GM channel. - Client.Logout() - Client.Login(user.Email, user.Password) + client.Logout() + client.Login(user.Email, user.Password) - directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id) - CheckNoError(t, resp) + directChannel, _, err := client.CreateDirectChannel(user.Id, user1.Id) + require.NoError(t, err) - Client.Logout() - Client.Login(user3.Email, user3.Password) - _, resp = Client.PatchChannel(directChannel.Id, channelPatch) + client.Logout() + client.Login(user3.Email, user3.Password) + _, resp, err = client.PatchChannel(directChannel.Id, channelPatch) + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestChannelUnicodeNames(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam t.Run("create channel unicode", func(t *testing.T) { @@ -338,8 +354,8 @@ func TestChannelUnicodeNames(t *testing.T) { Type: model.ChannelTypeOpen, TeamId: team.Id} - rchannel, resp := Client.CreateChannel(channel) - CheckNoError(t, resp) + rchannel, resp, err := client.CreateChannel(channel) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, "englishchannel", rchannel.Name, "bad unicode should be filtered from name") @@ -353,13 +369,13 @@ func TestChannelUnicodeNames(t *testing.T) { Type: model.ChannelTypeOpen, TeamId: team.Id, } - channel, _ = Client.CreateChannel(channel) + channel, _, _ = client.CreateChannel(channel) channel.Name = "\u206ahistorychannel" channel.DisplayName = "UFO's and \ufff9stuff\ufffb." - newChannel, resp := Client.UpdateChannel(channel) - CheckNoError(t, resp) + newChannel, _, err := client.UpdateChannel(channel) + require.NoError(t, err) require.Equal(t, "historychannel", newChannel.Name, "bad unicode should be filtered from name") require.Equal(t, "UFO's and stuff.", newChannel.DisplayName, "bad unicode should be filtered from display name") @@ -375,8 +391,8 @@ func TestChannelUnicodeNames(t *testing.T) { *patch.Name = "\u206ecommunitychannel\u206f" *patch.DisplayName = "Natalie Tran's \ufffcAwesome Channel" - channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) - CheckNoError(t, resp) + channel, _, err := client.PatchChannel(th.BasicChannel.Id, patch) + require.NoError(t, err) require.Equal(t, "communitychannel", channel.Name, "bad unicode should be filtered from name") require.Equal(t, "Natalie Tran's Awesome Channel", channel.DisplayName, "bad unicode should be filtered from display name") @@ -386,13 +402,13 @@ func TestChannelUnicodeNames(t *testing.T) { func TestCreateDirectChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user1 := th.BasicUser user2 := th.BasicUser2 user3 := th.CreateUser() - dm, resp := Client.CreateDirectChannel(user1.Id, user2.Id) - CheckNoError(t, resp) + dm, _, err := client.CreateDirectChannel(user1.Id, user2.Id) + require.NoError(t, err) channelName := "" if user2.Id > user1.Id { @@ -403,24 +419,28 @@ func TestCreateDirectChannel(t *testing.T) { require.Equal(t, channelName, dm.Name, "dm name didn't match") - _, resp = Client.CreateDirectChannel("junk", user2.Id) + _, resp, err := client.CreateDirectChannel("junk", user2.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.CreateDirectChannel(user1.Id, model.NewId()) + _, resp, err = client.CreateDirectChannel(user1.Id, model.NewId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.CreateDirectChannel(model.NewId(), user1.Id) + _, resp, err = client.CreateDirectChannel(model.NewId(), user1.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.CreateDirectChannel(model.NewId(), user2.Id) + _, resp, err = client.CreateDirectChannel(model.NewId(), user2.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - r, err := Client.DoApiPost("/channels/direct", "garbage") - require.NotNil(t, err) + r, err := client.DoApiPost("/channels/direct", "garbage") + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) - _, resp = th.SystemAdminClient.CreateDirectChannel(user3.Id, user2.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateDirectChannel(user3.Id, user2.Id) + require.NoError(t, err) // Normal client should not be allowed to create a direct channel if users are // restricted to messaging members of their own team @@ -428,21 +448,23 @@ func TestCreateDirectChannel(t *testing.T) { *cfg.TeamSettings.RestrictDirectMessage = model.DirectMessageTeam }) user4 := th.CreateUser() - _, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id) + _, resp, err = th.Client.CreateDirectChannel(user1.Id, user4.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LinkUserToTeam(user4, th.BasicTeam) - _, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id) - CheckNoError(t, resp) + _, _, err = th.Client.CreateDirectChannel(user1.Id, user4.Id) + require.NoError(t, err) - Client.Logout() - _, resp = Client.CreateDirectChannel(model.NewId(), user2.Id) + client.Logout() + _, resp, err = client.CreateDirectChannel(model.NewId(), user2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestCreateDirectChannelAsGuest(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user1 := th.BasicUser enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable @@ -461,17 +483,20 @@ func TestCreateDirectChannelAsGuest(t *testing.T) { Password: "Password1", EmailVerified: true, } - guest, err := th.App.CreateGuest(th.Context, guest) - require.Nil(t, err) + guest, appErr := th.App.CreateGuest(th.Context, guest) + require.Nil(t, appErr) - _, resp := Client.Login(guest.Username, "Password1") - CheckNoError(t, resp) + _, _, err := client.Login(guest.Username, "Password1") + require.NoError(t, err) t.Run("Try to created DM with not visible user", func(t *testing.T) { - _, resp := Client.CreateDirectChannel(guest.Id, user1.Id) + var resp *model.Response + _, resp, err = client.CreateDirectChannel(guest.Id, user1.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.CreateDirectChannel(user1.Id, guest.Id) + _, resp, err = client.CreateDirectChannel(user1.Id, guest.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -479,40 +504,39 @@ func TestCreateDirectChannelAsGuest(t *testing.T) { th.LinkUserToTeam(guest, th.BasicTeam) th.AddUserToChannel(guest, th.BasicChannel) - _, resp := Client.CreateDirectChannel(guest.Id, user1.Id) - CheckNoError(t, resp) + _, _, err = client.CreateDirectChannel(guest.Id, user1.Id) + require.NoError(t, err) }) } func TestDeleteDirectChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser user2 := th.BasicUser2 - rgc, resp := Client.CreateDirectChannel(user.Id, user2.Id) - CheckNoError(t, resp) + rgc, resp, err := client.CreateDirectChannel(user.Id, user2.Id) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.NotNil(t, rgc, "should have created a direct channel") - deleted, resp := Client.DeleteChannel(rgc.Id) - CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid") - require.False(t, deleted, "should not have been able to delete direct channel.") + _, err = client.DeleteChannel(rgc.Id) + CheckErrorID(t, err, "api.channel.delete_channel.type.invalid") } func TestCreateGroupChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser user2 := th.BasicUser2 user3 := th.CreateUser() userIds := []string{user.Id, user2.Id, user3.Id} - rgc, resp := Client.CreateGroupChannel(userIds) - CheckNoError(t, resp) + rgc, resp, err := client.CreateGroupChannel(userIds) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.NotNil(t, rgc, "should have created a group channel") @@ -522,14 +546,15 @@ func TestCreateGroupChannel(t *testing.T) { require.Len(t, *m, 3, "should have 3 channel members") // saving duplicate group channel - rgc2, resp := Client.CreateGroupChannel([]string{user3.Id, user2.Id}) - CheckNoError(t, resp) + rgc2, _, err := client.CreateGroupChannel([]string{user3.Id, user2.Id}) + require.NoError(t, err) require.Equal(t, rgc.Id, rgc2.Id, "should have returned existing channel") m2, _ := th.App.GetChannelMembersPage(rgc2.Id, 0, 10) require.Equal(t, m, m2) - _, resp = Client.CreateGroupChannel([]string{user2.Id}) + _, resp, err = client.CreateGroupChannel([]string{user2.Id}) + require.Error(t, err) CheckBadRequestStatus(t, resp) user4 := th.CreateUser() @@ -539,29 +564,33 @@ func TestCreateGroupChannel(t *testing.T) { user8 := th.CreateUser() user9 := th.CreateUser() - rgc, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, user4.Id, user5.Id, user6.Id, user7.Id, user8.Id, user9.Id}) + rgc, resp, err = client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, user4.Id, user5.Id, user6.Id, user7.Id, user8.Id, user9.Id}) + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, rgc) - _, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, GenerateTestId()}) + _, resp, err = client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, GenerateTestId()}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, "junk"}) + _, resp, err = client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, "junk"}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.CreateGroupChannel(userIds) + _, resp, err = client.CreateGroupChannel(userIds) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.CreateGroupChannel(userIds) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateGroupChannel(userIds) + require.NoError(t, err) } func TestCreateGroupChannelAsGuest(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user1 := th.BasicUser user2 := th.BasicUser2 user3 := th.CreateUser() @@ -588,17 +617,21 @@ func TestCreateGroupChannelAsGuest(t *testing.T) { Password: "Password1", EmailVerified: true, } - guest, err := th.App.CreateGuest(th.Context, guest) - require.Nil(t, err) + guest, appErr := th.App.CreateGuest(th.Context, guest) + require.Nil(t, appErr) - _, resp := Client.Login(guest.Username, "Password1") - CheckNoError(t, resp) + _, _, err := client.Login(guest.Username, "Password1") + require.NoError(t, err) + + var resp *model.Response t.Run("Try to created GM with not visible users", func(t *testing.T) { - _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) + _, resp, err = client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user3.Id}) + _, resp, err = client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user3.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -606,16 +639,18 @@ func TestCreateGroupChannelAsGuest(t *testing.T) { th.LinkUserToTeam(guest, th.BasicTeam) th.AddUserToChannel(guest, th.BasicChannel) - _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user3.Id, user4.Id, user5.Id}) + _, resp, err = client.CreateGroupChannel([]string{guest.Id, user1.Id, user3.Id, user4.Id, user5.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user4.Id, user5.Id}) + _, resp, err = client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user4.Id, user5.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("Creating GM with visible users", func(t *testing.T) { - _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) - CheckNoError(t, resp) + _, _, err = client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) + require.NoError(t, err) }) } @@ -629,13 +664,12 @@ func TestDeleteGroupChannel(t *testing.T) { userIds := []string{user.Id, user2.Id, user3.Id} th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rgc, resp := th.Client.CreateGroupChannel(userIds) - CheckNoError(t, resp) + rgc, resp, err := th.Client.CreateGroupChannel(userIds) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.NotNil(t, rgc, "should have created a group channel") - deleted, resp := client.DeleteChannel(rgc.Id) - CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid") - require.False(t, deleted, "should not have been able to delete group channel.") + _, err = client.DeleteChannel(rgc.Id) + CheckErrorID(t, err, "api.channel.delete_channel.type.invalid") }) } @@ -643,44 +677,49 @@ func TestDeleteGroupChannel(t *testing.T) { func TestGetChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - channel, resp := Client.GetChannel(th.BasicChannel.Id, "") - CheckNoError(t, resp) + channel, _, err := client.GetChannel(th.BasicChannel.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicChannel.Id, channel.Id, "ids did not match") - Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannel(th.BasicChannel.Id, "") - CheckNoError(t, resp) + client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + _, _, err = client.GetChannel(th.BasicChannel.Id, "") + require.NoError(t, err) - channel, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "") - CheckNoError(t, resp) + channel, _, err = client.GetChannel(th.BasicPrivateChannel.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicPrivateChannel.Id, channel.Id, "ids did not match") - Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "") + client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) + _, resp, err := client.GetChannel(th.BasicPrivateChannel.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannel(model.NewId(), "") + _, resp, err = client.GetChannel(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannel(th.BasicChannel.Id, "") + client.Logout() + _, resp, err = client.GetChannel(th.BasicChannel.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetChannel(th.BasicChannel.Id, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetChannel(th.BasicChannel.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.GetChannel(th.BasicChannel.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetChannel(th.BasicChannel.Id, "") + require.NoError(t, err) - _, resp = client.GetChannel(th.BasicPrivateChannel.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetChannel(th.BasicPrivateChannel.Id, "") + require.NoError(t, err) - _, resp = client.GetChannel(th.BasicUser.Id, "") + _, resp, err = client.GetChannel(th.BasicUser.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } @@ -689,67 +728,67 @@ func TestGetDeletedChannelsForTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam th.LoginTeamAdmin() - channels, resp := Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err := client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) numInitialChannelsForTeam := len(channels) // create and delete public channel publicChannel1 := th.CreatePublicChannel() - Client.DeleteChannel(publicChannel1.Id) + client.DeleteChannel(publicChannel1.Id) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, numInitialChannelsForTeam+1, "should be 1 deleted channel") }) publicChannel2 := th.CreatePublicChannel() - Client.DeleteChannel(publicChannel2.Id) + client.DeleteChannel(publicChannel2.Id) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, numInitialChannelsForTeam+2, "should be 2 deleted channels") }) th.LoginBasic() privateChannel1 := th.CreatePrivateChannel() - Client.DeleteChannel(privateChannel1.Id) + client.DeleteChannel(privateChannel1.Id) - channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, numInitialChannelsForTeam+3) // Login as different user and create private channel th.LoginBasic2() privateChannel2 := th.CreatePrivateChannel() - Client.DeleteChannel(privateChannel2.Id) + client.DeleteChannel(privateChannel2.Id) // Log back in as first user th.LoginBasic() - channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, numInitialChannelsForTeam+3) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, numInitialChannelsForTeam+2) }) - channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 1, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 0, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") - channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 1, 1, "") - CheckNoError(t, resp) + channels, _, err = client.GetDeletedChannelsForTeam(team.Id, 1, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") } @@ -759,12 +798,13 @@ func TestGetPrivateChannelsForTeam(t *testing.T) { team := th.BasicTeam // normal user - _, resp := th.Client.GetPrivateChannelsForTeam(team.Id, 0, 100, "") + _, resp, err := th.Client.GetPrivateChannelsForTeam(team.Id, 0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - channels, resp := c.GetPrivateChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err := c.GetPrivateChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) // th.BasicPrivateChannel and th.BasicPrivateChannel2 require.Len(t, channels, 2, "wrong number of private channels") for _, c := range channels { @@ -772,19 +812,20 @@ func TestGetPrivateChannelsForTeam(t *testing.T) { require.Equal(t, model.ChannelTypePrivate, c.Type, "should include private channels only") } - channels, resp = c.GetPrivateChannelsForTeam(team.Id, 0, 1, "") - CheckNoError(t, resp) + channels, _, err = c.GetPrivateChannelsForTeam(team.Id, 0, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") - channels, resp = c.GetPrivateChannelsForTeam(team.Id, 1, 1, "") - CheckNoError(t, resp) + channels, _, err = c.GetPrivateChannelsForTeam(team.Id, 1, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") - channels, resp = c.GetPrivateChannelsForTeam(team.Id, 10000, 100, "") - CheckNoError(t, resp) + channels, _, err = c.GetPrivateChannelsForTeam(team.Id, 10000, 100, "") + require.NoError(t, err) require.Empty(t, channels, "should be no channel") - _, resp = c.GetPrivateChannelsForTeam("junk", 0, 100, "") + _, resp, err = c.GetPrivateChannelsForTeam("junk", 0, 100, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } @@ -792,13 +833,13 @@ func TestGetPrivateChannelsForTeam(t *testing.T) { func TestGetPublicChannelsForTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam publicChannel1 := th.BasicChannel publicChannel2 := th.BasicChannel2 - channels, resp := Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err := client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, 4, "wrong path") for i, c := range channels { @@ -810,8 +851,8 @@ func TestGetPublicChannelsForTeam(t *testing.T) { } privateChannel := th.CreatePrivateChannel() - channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) require.Len(t, channels, 4, "incorrect length of team public channels") for _, c := range channels { @@ -819,49 +860,53 @@ func TestGetPublicChannelsForTeam(t *testing.T) { require.NotEqual(t, privateChannel.DisplayName, c.DisplayName, "should not match private channel display name") } - channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 1, "") - CheckNoError(t, resp) + channels, _, err = client.GetPublicChannelsForTeam(team.Id, 0, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") - channels, resp = Client.GetPublicChannelsForTeam(team.Id, 1, 1, "") - CheckNoError(t, resp) + channels, _, err = client.GetPublicChannelsForTeam(team.Id, 1, 1, "") + require.NoError(t, err) require.Len(t, channels, 1, "should be one channel per page") - channels, resp = Client.GetPublicChannelsForTeam(team.Id, 10000, 100, "") - CheckNoError(t, resp) + channels, _, err = client.GetPublicChannelsForTeam(team.Id, 10000, 100, "") + require.NoError(t, err) require.Empty(t, channels, "should be no channel") - _, resp = Client.GetPublicChannelsForTeam("junk", 0, 100, "") + _, resp, err := client.GetPublicChannelsForTeam("junk", 0, 100, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPublicChannelsForTeam(model.NewId(), 0, 100, "") + _, resp, err = client.GetPublicChannelsForTeam(model.NewId(), 0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + client.Logout() + _, resp, err = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") - CheckNoError(t, resp) + _, _, err = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") + require.NoError(t, err) }) } func TestGetPublicChannelsByIdsForTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client teamId := th.BasicTeam.Id input := []string{th.BasicChannel.Id} output := []string{th.BasicChannel.DisplayName} - channels, resp := Client.GetPublicChannelsByIdsForTeam(teamId, input) - CheckNoError(t, resp) + channels, _, err := client.GetPublicChannelsByIdsForTeam(teamId, input) + require.NoError(t, err) require.Len(t, channels, 1, "should return 1 channel") require.Equal(t, output[0], channels[0].DisplayName, "missing channel") @@ -871,46 +916,52 @@ func TestGetPublicChannelsByIdsForTeam(t *testing.T) { output = append(output, th.BasicChannel2.DisplayName) sort.Strings(output) - channels, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input) - CheckNoError(t, resp) + channels, _, err = client.GetPublicChannelsByIdsForTeam(teamId, input) + require.NoError(t, err) require.Len(t, channels, 2, "should return 2 channels") for i, c := range channels { require.Equal(t, output[i], c.DisplayName, "missing channel") } - _, resp = Client.GetPublicChannelsByIdsForTeam(GenerateTestId(), input) + _, resp, err := client.GetPublicChannelsByIdsForTeam(GenerateTestId(), input) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{}) + _, resp, err = client.GetPublicChannelsByIdsForTeam(teamId, []string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{"junk"}) + _, resp, err = client.GetPublicChannelsByIdsForTeam(teamId, []string{"junk"}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{GenerateTestId()}) + _, resp, err = client.GetPublicChannelsByIdsForTeam(teamId, []string{GenerateTestId()}) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{th.BasicPrivateChannel.Id}) + _, resp, err = client.GetPublicChannelsByIdsForTeam(teamId, []string{th.BasicPrivateChannel.Id}) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input) + _, resp, err = client.GetPublicChannelsByIdsForTeam(teamId, input) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetPublicChannelsByIdsForTeam(teamId, input) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetPublicChannelsByIdsForTeam(teamId, input) + require.NoError(t, err) } func TestGetChannelsForTeamForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client t.Run("get channels for the team for user", func(t *testing.T) { - channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") - CheckNoError(t, resp) + channels, resp, err := client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) found := make([]bool, 3) for _, c := range channels { @@ -929,23 +980,27 @@ func TestGetChannelsForTeamForUser(t *testing.T) { require.True(t, f, "missing a channel") } - channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag) + channels, resp, _ = client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag) CheckEtag(t, channels, resp) - _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "") + _, resp, err = client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "") + _, resp, err = client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "") + _, resp, err = client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "") + _, resp, err = client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) }) t.Run("deleted channel could be retrieved using the proper flag", func(t *testing.T) { @@ -958,24 +1013,23 @@ func TestGetChannelsForTeamForUser(t *testing.T) { } th.App.CreateChannel(th.Context, testChannel, true) defer th.App.PermanentDeleteChannel(testChannel) - channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") - CheckNoError(t, resp) + channels, _, err := client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) assert.Equal(t, 6, len(channels)) th.App.DeleteChannel(th.Context, testChannel, th.BasicUser.Id) - channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") - CheckNoError(t, resp) + channels, _, err = client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) assert.Equal(t, 5, len(channels)) // Should return all channels including basicDeleted. - channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, true, "") - CheckNoError(t, resp) + channels, _, err = client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, true, "") + require.NoError(t, err) assert.Equal(t, 7, len(channels)) // Should stil return all channels including basicDeleted. now := time.Now().Add(-time.Minute).Unix() * 1000 - Client.GetChannelsForTeamAndUserWithLastDeleteAt(th.BasicTeam.Id, th.BasicUser.Id, + client.GetChannelsForTeamAndUserWithLastDeleteAt(th.BasicTeam.Id, th.BasicUser.Id, true, int(now), "") - CheckNoError(t, resp) assert.Equal(t, 7, len(channels)) }) } @@ -983,11 +1037,11 @@ func TestGetChannelsForTeamForUser(t *testing.T) { func TestGetAllChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - channels, resp := client.GetAllChannels(0, 20, "") - CheckNoError(t, resp) + channels, _, err := client.GetAllChannels(0, 20, "") + require.NoError(t, err) // At least, all the not-deleted channels created during the InitBasic require.True(t, len(*channels) >= 3) @@ -995,67 +1049,70 @@ func TestGetAllChannels(t *testing.T) { require.NotEqual(t, c.TeamId, "") } - channels, resp = client.GetAllChannels(0, 10, "") - CheckNoError(t, resp) + channels, _, err = client.GetAllChannels(0, 10, "") + require.NoError(t, err) require.True(t, len(*channels) >= 3) - channels, resp = client.GetAllChannels(1, 1, "") - CheckNoError(t, resp) + channels, _, err = client.GetAllChannels(1, 1, "") + require.NoError(t, err) require.Len(t, *channels, 1) - channels, resp = client.GetAllChannels(10000, 10000, "") - CheckNoError(t, resp) + channels, _, err = client.GetAllChannels(10000, 10000, "") + require.NoError(t, err) require.Empty(t, *channels) - channels, resp = client.GetAllChannels(0, 10000, "") - require.Nil(t, resp.Error) + channels, _, err = client.GetAllChannels(0, 10000, "") + require.NoError(t, err) beforeCount := len(*channels) firstChannel := (*channels)[0].Channel - ok, resp := client.DeleteChannel(firstChannel.Id) - require.Nil(t, resp.Error) - require.True(t, ok) + _, err = client.DeleteChannel(firstChannel.Id) + require.NoError(t, err) - channels, resp = client.GetAllChannels(0, 10000, "") + channels, _, err = client.GetAllChannels(0, 10000, "") var ids []string for _, item := range *channels { ids = append(ids, item.Channel.Id) } - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, *channels, beforeCount-1) require.NotContains(t, ids, firstChannel.Id) - channels, resp = client.GetAllChannelsIncludeDeleted(0, 10000, "") + channels, _, err = client.GetAllChannelsIncludeDeleted(0, 10000, "") ids = []string{} for _, item := range *channels { ids = append(ids, item.Channel.Id) } - require.Nil(t, resp.Error) + require.NoError(t, err) require.True(t, len(*channels) > beforeCount) require.Contains(t, ids, firstChannel.Id) }) - _, resp := Client.GetAllChannels(0, 20, "") + _, resp, err := client.GetAllChannels(0, 20, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") + sysManagerChannels, resp, err := th.SystemManagerClient.GetAllChannels(0, 10000, "") + require.NoError(t, err) CheckOKStatus(t, resp) policyChannel := (*sysManagerChannels)[0] - policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{ + policy, err := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{ RetentionPolicy: model.RetentionPolicy{ DisplayName: "Policy 1", PostDuration: model.NewInt64(30), }, ChannelIDs: []string{policyChannel.Id}, }) - require.NoError(t, savePolicyErr) + require.NoError(t, err) t.Run("exclude policy constrained", func(t *testing.T) { - _, resp := th.SystemManagerClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") + _, resp, err := th.SystemManagerClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - channels, resp := th.SystemAdminClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") + channels, resp, err := th.SystemAdminClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") + require.NoError(t, err) CheckOKStatus(t, resp) found := false for _, channel := range *channels { @@ -1068,7 +1125,8 @@ func TestGetAllChannels(t *testing.T) { }) t.Run("does not return policy ID", func(t *testing.T) { - channels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") + channels, resp, err := th.SystemManagerClient.GetAllChannels(0, 10000, "") + require.NoError(t, err) CheckOKStatus(t, resp) found := false for _, channel := range *channels { @@ -1082,7 +1140,8 @@ func TestGetAllChannels(t *testing.T) { }) t.Run("returns policy ID", func(t *testing.T) { - channels, resp := th.SystemAdminClient.GetAllChannels(0, 10000, "") + channels, resp, err := th.SystemAdminClient.GetAllChannels(0, 10000, "") + require.NoError(t, err) CheckOKStatus(t, resp) found := false for _, channel := range *channels { @@ -1099,10 +1158,10 @@ func TestGetAllChannels(t *testing.T) { func TestGetAllChannelsWithCount(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - channels, total, resp := th.SystemAdminClient.GetAllChannelsWithCount(0, 20, "") - CheckNoError(t, resp) + channels, total, _, err := th.SystemAdminClient.GetAllChannelsWithCount(0, 20, "") + require.NoError(t, err) // At least, all the not-deleted channels created during the InitBasic require.True(t, len(*channels) >= 3) @@ -1111,31 +1170,32 @@ func TestGetAllChannelsWithCount(t *testing.T) { } require.Equal(t, int64(6), total) - channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(0, 10, "") - CheckNoError(t, resp) + channels, _, _, err = th.SystemAdminClient.GetAllChannelsWithCount(0, 10, "") + require.NoError(t, err) require.True(t, len(*channels) >= 3) - channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(1, 1, "") - CheckNoError(t, resp) + channels, _, _, err = th.SystemAdminClient.GetAllChannelsWithCount(1, 1, "") + require.NoError(t, err) require.Len(t, *channels, 1) - channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(10000, 10000, "") - CheckNoError(t, resp) + channels, _, _, err = th.SystemAdminClient.GetAllChannelsWithCount(10000, 10000, "") + require.NoError(t, err) require.Empty(t, *channels) - _, _, resp = Client.GetAllChannelsWithCount(0, 20, "") + _, _, resp, err := client.GetAllChannelsWithCount(0, 20, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestSearchChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client search := &model.ChannelSearch{Term: th.BasicChannel.Name} - channels, resp := Client.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channels, _, err := client.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) found := false for _, c := range channels { @@ -1148,8 +1208,8 @@ func TestSearchChannels(t *testing.T) { require.True(t, found, "didn't find channel") search.Term = th.BasicPrivateChannel.Name - channels, resp = Client.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channels, _, err = client.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) found = false for _, c := range channels { @@ -1160,18 +1220,20 @@ func TestSearchChannels(t *testing.T) { require.False(t, found, "shouldn't find private channel") search.Term = "" - _, resp = Client.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + _, _, err = client.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) search.Term = th.BasicChannel.Name - _, resp = Client.SearchChannels(model.NewId(), search) + _, resp, err := client.SearchChannels(model.NewId(), search) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.SearchChannels("junk", search) + _, resp, err = client.SearchChannels("junk", search) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) // Check the appropriate permissions are enforced. defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -1184,8 +1246,8 @@ func TestSearchChannels(t *testing.T) { t.Run("Search for a BasicChannel, which the user is a member of", func(t *testing.T) { search.Term = th.BasicChannel.Name - channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channelList, _, err := client.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) channelNames := []string{} for _, c := range channelList { @@ -1198,8 +1260,8 @@ func TestSearchChannels(t *testing.T) { th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicChannel) search.Term = th.BasicChannel.Name - channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channelList, _, err := client.SearchChannels(th.BasicTeam.Id, search) + require.NoError(t, err) channelNames := []string{} for _, c := range channelList { @@ -1212,14 +1274,14 @@ func TestSearchChannels(t *testing.T) { func TestSearchArchivedChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client search := &model.ChannelSearch{Term: th.BasicChannel.Name} - Client.DeleteChannel(th.BasicChannel.Id) + client.DeleteChannel(th.BasicChannel.Id) - channels, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channels, _, err := client.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) found := false for _, c := range channels { @@ -1233,10 +1295,10 @@ func TestSearchArchivedChannels(t *testing.T) { require.True(t, found) search.Term = th.BasicPrivateChannel.Name - Client.DeleteChannel(th.BasicPrivateChannel.Id) + client.DeleteChannel(th.BasicPrivateChannel.Id) - channels, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channels, _, err = client.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) found = false for _, c := range channels { @@ -1248,18 +1310,20 @@ func TestSearchArchivedChannels(t *testing.T) { require.True(t, found) search.Term = "" - _, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + _, _, err = client.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) search.Term = th.BasicDeletedChannel.Name - _, resp = Client.SearchArchivedChannels(model.NewId(), search) + _, resp, err := client.SearchArchivedChannels(model.NewId(), search) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.SearchArchivedChannels("junk", search) + _, resp, err = client.SearchArchivedChannels("junk", search) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) // Check the appropriate permissions are enforced. defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -1272,8 +1336,8 @@ func TestSearchArchivedChannels(t *testing.T) { t.Run("Search for a BasicDeletedChannel, which the user is a member of", func(t *testing.T) { search.Term = th.BasicDeletedChannel.Name - channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channelList, _, err := client.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) channelNames := []string{} for _, c := range channelList { @@ -1286,8 +1350,8 @@ func TestSearchArchivedChannels(t *testing.T) { th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicDeletedChannel) search.Term = th.BasicDeletedChannel.Name - channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) - CheckNoError(t, resp) + channelList, _, err := client.SearchArchivedChannels(th.BasicTeam.Id, search) + require.NoError(t, err) channelNames := []string{} for _, c := range channelList { @@ -1300,33 +1364,33 @@ func TestSearchArchivedChannels(t *testing.T) { func TestSearchAllChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - openChannel, chanErr := th.SystemAdminClient.CreateChannel(&model.Channel{ + openChannel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "SearchAllChannels-FOOBARDISPLAYNAME", Name: "whatever", Type: model.ChannelTypeOpen, TeamId: th.BasicTeam.Id, }) - CheckNoError(t, chanErr) + require.NoError(t, err) - privateChannel, privErr := th.SystemAdminClient.CreateChannel(&model.Channel{ + privateChannel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "SearchAllChannels-private1", Name: "private1", Type: model.ChannelTypePrivate, TeamId: th.BasicTeam.Id, }) - CheckNoError(t, privErr) + require.NoError(t, err) team := th.CreateTeam() - groupConstrainedChannel, groupErr := th.SystemAdminClient.CreateChannel(&model.Channel{ + groupConstrainedChannel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "SearchAllChannels-groupConstrained-1", Name: "groupconstrained1", Type: model.ChannelTypePrivate, GroupConstrained: model.NewBool(true), TeamId: team.Id, }) - CheckNoError(t, groupErr) + require.NoError(t, err) testCases := []struct { Description string @@ -1441,8 +1505,9 @@ func TestSearchAllChannels(t *testing.T) { } for _, testCase := range testCases { t.Run(testCase.Description, func(t *testing.T) { - channels, resp := th.SystemAdminClient.SearchAllChannels(testCase.Search) - CheckNoError(t, resp) + var channels *model.ChannelListWithTeamData + channels, _, err = th.SystemAdminClient.SearchAllChannels(testCase.Search) + require.NoError(t, err) assert.Equal(t, len(testCase.ExpectedChannelIds), len(*channels)) actualChannelIds := []string{} for _, channelWithTeamData := range *channels { @@ -1453,15 +1518,17 @@ func TestSearchAllChannels(t *testing.T) { } // Searching with no terms returns all default channels - allChannels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: ""}) - CheckNoError(t, resp) + allChannels, _, err := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: ""}) + require.NoError(t, err) assert.True(t, len(*allChannels) >= 3) - _, resp = Client.SearchAllChannels(&model.ChannelSearch{Term: ""}) + _, resp, err := client.SearchAllChannels(&model.ChannelSearch{Term: ""}) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Choose a policy which the system manager can read - sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") + sysManagerChannels, resp, err := th.SystemManagerClient.GetAllChannels(0, 10000, "") + require.NoError(t, err) CheckOKStatus(t, resp) policyChannel := (*sysManagerChannels)[0] policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{ @@ -1474,7 +1541,8 @@ func TestSearchAllChannels(t *testing.T) { require.NoError(t, savePolicyErr) t.Run("does not return policy ID", func(t *testing.T) { - channels, resp := th.SystemManagerClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) + channels, resp, err := th.SystemManagerClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) + require.NoError(t, err) CheckOKStatus(t, resp) found := false for _, channel := range *channels { @@ -1487,7 +1555,8 @@ func TestSearchAllChannels(t *testing.T) { require.True(t, found) }) t.Run("returns policy ID", func(t *testing.T) { - channels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) + channels, resp, err := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) + require.NoError(t, err) CheckOKStatus(t, resp) found := false for _, channel := range *channels { @@ -1504,50 +1573,51 @@ func TestSearchAllChannels(t *testing.T) { func TestSearchAllChannelsPaged(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client search := &model.ChannelSearch{Term: th.BasicChannel.Name} search.Term = "" search.Page = model.NewInt(0) search.PerPage = model.NewInt(2) - channelsWithCount, resp := th.SystemAdminClient.SearchAllChannelsPaged(search) - CheckNoError(t, resp) + channelsWithCount, _, err := th.SystemAdminClient.SearchAllChannelsPaged(search) + require.NoError(t, err) require.Len(t, *channelsWithCount.Channels, 2) search.Term = th.BasicChannel.Name - _, resp = Client.SearchAllChannels(search) + _, resp, err := client.SearchAllChannels(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestSearchGroupChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client u1 := th.CreateUserWithClient(th.SystemAdminClient) // Create a group channel in which base user belongs but not sysadmin - gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) - CheckNoError(t, resp) + gc1, _, err := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) + require.NoError(t, err) defer th.Client.DeleteChannel(gc1.Id) - gc2, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, th.SystemAdminUser.Id}) - CheckNoError(t, resp) + gc2, _, err := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, th.SystemAdminUser.Id}) + require.NoError(t, err) defer th.Client.DeleteChannel(gc2.Id) search := &model.ChannelSearch{Term: th.BasicUser2.Username} // sysadmin should only find gc2 as he doesn't belong to gc1 - channels, resp := th.SystemAdminClient.SearchGroupChannels(search) - CheckNoError(t, resp) + channels, _, err := th.SystemAdminClient.SearchGroupChannels(search) + require.NoError(t, err) assert.Len(t, channels, 1) assert.Equal(t, channels[0].Id, gc2.Id) // basic user should find both - Client.Login(th.BasicUser.Username, th.BasicUser.Password) - channels, resp = Client.SearchGroupChannels(search) - CheckNoError(t, resp) + client.Login(th.BasicUser.Username, th.BasicUser.Password) + channels, _, err = client.SearchGroupChannels(search) + require.NoError(t, err) assert.Len(t, channels, 2) channelIds := []string{} @@ -1558,22 +1628,23 @@ func TestSearchGroupChannels(t *testing.T) { // searching for sysadmin, it should only find gc1 search = &model.ChannelSearch{Term: th.SystemAdminUser.Username} - channels, resp = Client.SearchGroupChannels(search) - CheckNoError(t, resp) + channels, _, err = client.SearchGroupChannels(search) + require.NoError(t, err) assert.Len(t, channels, 1) assert.Equal(t, channels[0].Id, gc2.Id) // with an empty search, response should be empty search = &model.ChannelSearch{Term: ""} - channels, resp = Client.SearchGroupChannels(search) - CheckNoError(t, resp) + channels, _, err = client.SearchGroupChannels(search) + require.NoError(t, err) assert.Empty(t, channels) // search unprivileged, forbidden th.Client.Logout() - _, resp = Client.SearchAllChannels(search) + _, resp, err := client.SearchAllChannels(search) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -1588,35 +1659,33 @@ func TestDeleteChannel(t *testing.T) { // successful delete of public channel th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { publicChannel1 := th.CreatePublicChannel() - pass, resp := client.DeleteChannel(publicChannel1.Id) - CheckNoError(t, resp) + _, err := client.DeleteChannel(publicChannel1.Id) + require.NoError(t, err) - require.True(t, pass, "should have passed") - - ch, err := th.App.GetChannel(publicChannel1.Id) - require.True(t, err != nil || ch.DeleteAt != 0, "should have failed to get deleted channel, or returned one with a populated DeleteAt.") + ch, appErr := th.App.GetChannel(publicChannel1.Id) + require.True(t, appErr != nil || ch.DeleteAt != 0, "should have failed to get deleted channel, or returned one with a populated DeleteAt.") post1 := &model.Post{ChannelId: publicChannel1.Id, Message: "a" + GenerateTestId() + "a"} - _, resp = client.CreatePost(post1) + _, resp, _ := client.CreatePost(post1) require.NotNil(t, resp, "expected response to not be nil") // successful delete of private channel privateChannel2 := th.CreatePrivateChannel() - _, resp = client.DeleteChannel(privateChannel2.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(privateChannel2.Id) + require.NoError(t, err) // successful delete of channel with multiple members publicChannel3 := th.CreatePublicChannel() th.App.AddUserToChannel(user, publicChannel3, false) th.App.AddUserToChannel(user2, publicChannel3, false) - _, resp = client.DeleteChannel(publicChannel3.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(publicChannel3.Id) + require.NoError(t, err) // default channel cannot be deleted. defaultChannel, _ := th.App.GetChannelByName(model.DefaultChannelName, team.Id, false) - pass, resp = client.DeleteChannel(defaultChannel.Id) + resp, err = client.DeleteChannel(defaultChannel.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, pass, "should have failed") // check system admin can delete a channel without any appropriate team or channel membership. sdTeam := th.CreateTeamWithClient(c) @@ -1626,10 +1695,10 @@ func TestDeleteChannel(t *testing.T) { Type: model.ChannelTypeOpen, TeamId: sdTeam.Id, } - sdPublicChannel, resp = c.CreateChannel(sdPublicChannel) - CheckNoError(t, resp) - _, resp = client.DeleteChannel(sdPublicChannel.Id) - CheckNoError(t, resp) + sdPublicChannel, _, err = c.CreateChannel(sdPublicChannel) + require.NoError(t, err) + _, err = client.DeleteChannel(sdPublicChannel.Id) + require.NoError(t, err) sdPrivateChannel := &model.Channel{ DisplayName: "dn_" + model.NewId(), @@ -1637,10 +1706,10 @@ func TestDeleteChannel(t *testing.T) { Type: model.ChannelTypePrivate, TeamId: sdTeam.Id, } - sdPrivateChannel, resp = c.CreateChannel(sdPrivateChannel) - CheckNoError(t, resp) - _, resp = client.DeleteChannel(sdPrivateChannel.Id) - CheckNoError(t, resp) + sdPrivateChannel, _, err = c.CreateChannel(sdPrivateChannel) + require.NoError(t, err) + _, err = client.DeleteChannel(sdPrivateChannel.Id) + require.NoError(t, err) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { @@ -1649,18 +1718,21 @@ func TestDeleteChannel(t *testing.T) { c.Logout() c.Login(user.Id, user.Password) - _, resp := c.DeleteChannel(publicChannel5.Id) + resp, err := c.DeleteChannel(publicChannel5.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = c.DeleteChannel("junk") + resp, err = c.DeleteChannel("junk") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) c.Logout() - _, resp = c.DeleteChannel(GenerateTestId()) + resp, err = c.DeleteChannel(GenerateTestId()) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = client.DeleteChannel(publicChannel5.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(publicChannel5.Id) + require.NoError(t, err) }) @@ -1669,7 +1741,7 @@ func TestDeleteChannel(t *testing.T) { func TestDeleteChannel2(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser // Check the appropriate permissions are enforced. @@ -1689,11 +1761,11 @@ func TestDeleteChannel2(t *testing.T) { th.App.AddUserToChannel(user, privateChannel7, false) // successful delete by user - _, resp := Client.DeleteChannel(publicChannel6.Id) - CheckNoError(t, resp) + _, err := client.DeleteChannel(publicChannel6.Id) + require.NoError(t, err) - _, resp = Client.DeleteChannel(privateChannel7.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(privateChannel7.Id) + require.NoError(t, err) // Restrict permissions to Channel Admins th.RemovePermissionFromRole(model.PermissionDeletePublicChannel.Id, model.ChannelUserRoleId) @@ -1709,10 +1781,12 @@ func TestDeleteChannel2(t *testing.T) { th.App.AddUserToChannel(user, privateChannel7, false) // cannot delete by user - _, resp = Client.DeleteChannel(publicChannel6.Id) + resp, err := client.DeleteChannel(publicChannel6.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.DeleteChannel(privateChannel7.Id) + resp, err = client.DeleteChannel(privateChannel7.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // successful delete by channel admin @@ -1720,11 +1794,11 @@ func TestDeleteChannel2(t *testing.T) { th.MakeUserChannelAdmin(user, privateChannel7) th.App.Srv().Store.Channel().ClearCaches() - _, resp = Client.DeleteChannel(publicChannel6.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(publicChannel6.Id) + require.NoError(t, err) - _, resp = Client.DeleteChannel(privateChannel7.Id) - CheckNoError(t, resp) + _, err = client.DeleteChannel(privateChannel7.Id) + require.NoError(t, err) // Make sure team admins don't have permission to delete channels. th.RemovePermissionFromRole(model.PermissionDeletePublicChannel.Id, model.ChannelAdminRoleId) @@ -1732,12 +1806,14 @@ func TestDeleteChannel2(t *testing.T) { // last member of a public channel should have required permission to delete publicChannel6 = th.CreateChannelWithClient(th.Client, model.ChannelTypeOpen) - _, resp = Client.DeleteChannel(publicChannel6.Id) + resp, err = client.DeleteChannel(publicChannel6.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // last member of a private channel should not be able to delete it if they don't have required permissions privateChannel7 = th.CreateChannelWithClient(th.Client, model.ChannelTypePrivate) - _, resp = Client.DeleteChannel(privateChannel7.Id) + resp, err = client.DeleteChannel(privateChannel7.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -1754,75 +1830,82 @@ func TestPermanentDeleteChannel(t *testing.T) { publicChannel1 := th.CreatePublicChannel() t.Run("Permanent deletion not available through API if EnableAPIChannelDeletion is not set", func(t *testing.T) { - _, resp := th.SystemAdminClient.PermanentDeleteChannel(publicChannel1.Id) + resp, err := th.SystemAdminClient.PermanentDeleteChannel(publicChannel1.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("Permanent deletion available through local mode even if EnableAPIChannelDeletion is not set", func(t *testing.T) { - ok, resp := th.LocalClient.PermanentDeleteChannel(publicChannel1.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err := th.LocalClient.PermanentDeleteChannel(publicChannel1.Id) + require.NoError(t, err) }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIChannelDeletion = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { publicChannel := th.CreatePublicChannel() - ok, resp := c.PermanentDeleteChannel(publicChannel.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err := c.PermanentDeleteChannel(publicChannel.Id) + require.NoError(t, err) - _, err := th.App.GetChannel(publicChannel.Id) - assert.NotNil(t, err) + _, appErr := th.App.GetChannel(publicChannel.Id) + assert.NotNil(t, appErr) - ok, resp = c.PermanentDeleteChannel("junk") + resp, err := c.PermanentDeleteChannel("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok, "should have returned false") }, "Permanent deletion with EnableAPIChannelDeletion set") } func TestConvertChannelToPrivate(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client defaultChannel, _ := th.App.GetChannelByName(model.DefaultChannelName, th.BasicTeam.Id, false) - _, resp := Client.ConvertChannelToPrivate(defaultChannel.Id) + _, resp, err := client.ConvertChannelToPrivate(defaultChannel.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) privateChannel := th.CreatePrivateChannel() - _, resp = Client.ConvertChannelToPrivate(privateChannel.Id) + _, resp, err = client.ConvertChannelToPrivate(privateChannel.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) publicChannel := th.CreatePublicChannel() - _, resp = Client.ConvertChannelToPrivate(publicChannel.Id) + _, resp, err = client.ConvertChannelToPrivate(publicChannel.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginTeamAdmin() th.RemovePermissionFromRole(model.PermissionConvertPublicChannelToPrivate.Id, model.TeamAdminRoleId) - _, resp = Client.ConvertChannelToPrivate(publicChannel.Id) + _, resp, err = client.ConvertChannelToPrivate(publicChannel.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionConvertPublicChannelToPrivate.Id, model.TeamAdminRoleId) - rchannel, resp := Client.ConvertChannelToPrivate(publicChannel.Id) + rchannel, resp, err := client.ConvertChannelToPrivate(publicChannel.Id) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, model.ChannelTypePrivate, rchannel.Type, "channel should be converted from public to private") - rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(privateChannel.Id) + rchannel, resp, err = th.SystemAdminClient.ConvertChannelToPrivate(privateChannel.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, rchannel, "should not return a channel") - rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(defaultChannel.Id) + rchannel, resp, err = th.SystemAdminClient.ConvertChannelToPrivate(defaultChannel.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, rchannel, "should not return a channel") WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) WebSocketClient.Listen() publicChannel2 := th.CreatePublicChannel() - rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(publicChannel2.Id) + rchannel, resp, err = th.SystemAdminClient.ConvertChannelToPrivate(publicChannel2.Id) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, model.ChannelTypePrivate, rchannel.Type, "channel should be converted from public to private") @@ -1865,7 +1948,8 @@ func TestUpdateChannelPrivacy(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - _, resp := th.Client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) + _, resp, err := th.Client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -1882,7 +1966,8 @@ func TestUpdateChannelPrivacy(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - _, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) + _, resp, err := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } @@ -1897,11 +1982,11 @@ func TestUpdateChannelPrivacy(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - updatedChannel, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) - CheckNoError(t, resp) + updatedChannel, _, err := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) + require.NoError(t, err) assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type) - updatedChannel, err := th.App.GetChannel(tc.channel.Id) - require.Nil(t, err) + updatedChannel, appErr := th.App.GetChannel(tc.channel.Id) + require.Nil(t, appErr) assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type) }) } @@ -1916,18 +2001,20 @@ func TestUpdateChannelPrivacy(t *testing.T) { th.RemovePermissionFromRole(model.PermissionConvertPublicChannelToPrivate.Id, model.TeamAdminRoleId) th.RemovePermissionFromRole(model.PermissionConvertPrivateChannelToPublic.Id, model.TeamAdminRoleId) - _, resp := th.Client.UpdateChannelPrivacy(publicChannel.Id, model.ChannelTypePrivate) + _, resp, err := th.Client.UpdateChannelPrivacy(publicChannel.Id, model.ChannelTypePrivate) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.ChannelTypeOpen) + _, resp, err = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.ChannelTypeOpen) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionConvertPublicChannelToPrivate.Id, model.TeamAdminRoleId) th.AddPermissionToRole(model.PermissionConvertPrivateChannelToPublic.Id, model.TeamAdminRoleId) - _, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.ChannelTypeOpen) - CheckNoError(t, resp) - _, resp = th.Client.UpdateChannelPrivacy(publicChannel.Id, model.ChannelTypePrivate) - CheckNoError(t, resp) + _, _, err = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.ChannelTypeOpen) + require.NoError(t, err) + _, _, err = th.Client.UpdateChannelPrivacy(publicChannel.Id, model.ChannelTypePrivate) + require.NoError(t, err) }) } @@ -1941,10 +2028,12 @@ func TestRestoreChannel(t *testing.T) { privateChannel1 := th.CreatePrivateChannel() th.Client.DeleteChannel(privateChannel1.Id) - _, resp := th.Client.RestoreChannel(publicChannel1.Id) + _, resp, err := th.Client.RestoreChannel(publicChannel1.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.RestoreChannel(privateChannel1.Id) + _, resp, err = th.Client.RestoreChannel(privateChannel1.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { @@ -1953,10 +2042,12 @@ func TestRestoreChannel(t *testing.T) { client.DeleteChannel(privateChannel1.Id) }() - _, resp = client.RestoreChannel(publicChannel1.Id) + _, resp, err = client.RestoreChannel(publicChannel1.Id) + require.NoError(t, err) CheckOKStatus(t, resp) - _, resp = client.RestoreChannel(privateChannel1.Id) + _, resp, err = client.RestoreChannel(privateChannel1.Id) + require.NoError(t, err) CheckOKStatus(t, resp) }) } @@ -1964,100 +2055,112 @@ func TestRestoreChannel(t *testing.T) { func TestGetChannelByName(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - channel, resp := Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") - CheckNoError(t, resp) + channel, _, err := client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") - channel, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") - CheckNoError(t, resp) + channel, _, err = client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match") - _, resp = Client.GetChannelByName(strings.ToUpper(th.BasicPrivateChannel.Name), th.BasicTeam.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetChannelByName(strings.ToUpper(th.BasicPrivateChannel.Name), th.BasicTeam.Id, "") + require.NoError(t, err) - _, resp = Client.GetChannelByName(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") + _, resp, err := client.GetChannelByName(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - channel, resp = Client.GetChannelByNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") - CheckNoError(t, resp) + channel, _, err = client.GetChannelByNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match") - Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") - CheckNoError(t, resp) + client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + _, _, err = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + require.NoError(t, err) - Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") + client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) + _, resp, err = client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelByName(GenerateTestChannelName(), th.BasicTeam.Id, "") + _, resp, err = client.GetChannelByName(GenerateTestChannelName(), th.BasicTeam.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelByName(GenerateTestChannelName(), "junk", "") + _, resp, err = client.GetChannelByName(GenerateTestChannelName(), "junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + client.Logout() + _, resp, err = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") + require.NoError(t, err) }) } func TestGetChannelByNameForTeamName(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - channel, resp := th.SystemAdminClient.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") - CheckNoError(t, resp) + channel, _, err := th.SystemAdminClient.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + require.NoError(t, err) require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") - _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") - CheckNoError(t, resp) + _, _, err = client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + require.NoError(t, err) require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") - channel, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") - CheckNoError(t, resp) + channel, _, err = client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") + require.NoError(t, err) require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match") - _, resp = Client.GetChannelByNameForTeamName(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") + _, resp, err := client.GetChannelByNameForTeamName(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - channel, resp = Client.GetChannelByNameForTeamNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") - CheckNoError(t, resp) + channel, _, err = client.GetChannelByNameForTeamNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") + require.NoError(t, err) require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match") - Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") - CheckNoError(t, resp) + client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + _, _, err = client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + require.NoError(t, err) - Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) - _, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") + client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) + _, resp, err = client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, model.NewRandomString(15), "") + _, resp, err = client.GetChannelByNameForTeamName(th.BasicChannel.Name, model.NewRandomString(15), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelByNameForTeamName(GenerateTestChannelName(), th.BasicTeam.Name, "") + _, resp, err = client.GetChannelByNameForTeamName(GenerateTestChannelName(), th.BasicTeam.Name, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + client.Logout() + _, resp, err = client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -2065,81 +2168,90 @@ func TestGetChannelMembers(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - members, resp := client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") - CheckNoError(t, resp) + members, _, err := client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + require.NoError(t, err) require.Len(t, *members, 3, "should only be 3 users in channel") - members, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 2, "") - CheckNoError(t, resp) + members, _, err = client.GetChannelMembers(th.BasicChannel.Id, 0, 2, "") + require.NoError(t, err) require.Len(t, *members, 2, "should only be 2 users") - members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1, 1, "") - CheckNoError(t, resp) + members, _, err = client.GetChannelMembers(th.BasicChannel.Id, 1, 1, "") + require.NoError(t, err) require.Len(t, *members, 1, "should only be 1 user") - members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1000, 100000, "") - CheckNoError(t, resp) + members, _, err = client.GetChannelMembers(th.BasicChannel.Id, 1000, 100000, "") + require.NoError(t, err) require.Empty(t, *members, "should be 0 users") - _, resp = client.GetChannelMembers("junk", 0, 60, "") + _, resp, err := client.GetChannelMembers("junk", 0, 60, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetChannelMembers("", 0, 60, "") + _, resp, err = client.GetChannelMembers("", 0, 60, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") - CheckNoError(t, resp) + _, _, err = client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + require.NoError(t, err) }) - _, resp := th.Client.GetChannelMembers(model.NewId(), 0, 60, "") + _, resp, err := th.Client.GetChannelMembers(model.NewId(), 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + _, resp, err = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() th.Client.Login(user.Email, user.Password) - _, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + _, resp, err = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestGetChannelMembersByIds(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - cm, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) - CheckNoError(t, resp) + cm, _, err := client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) + require.NoError(t, err) require.Equal(t, th.BasicUser.Id, (*cm)[0].UserId, "returned wrong user") - _, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{}) + _, resp, err := client.GetChannelMembersByIds(th.BasicChannel.Id, []string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - cm1, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk"}) - CheckNoError(t, resp) + cm1, _, err := client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk"}) + require.NoError(t, err) require.Empty(t, *cm1, "no users should be returned") - cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk", th.BasicUser.Id}) - CheckNoError(t, resp) + cm1, _, err = client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk", th.BasicUser.Id}) + require.NoError(t, err) require.Len(t, *cm1, 1, "1 member should be returned") - cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) - CheckNoError(t, resp) + cm1, _, err = client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) + require.NoError(t, err) require.Len(t, *cm1, 2, "2 members should be returned") - _, resp = Client.GetChannelMembersByIds("junk", []string{th.BasicUser.Id}) + _, resp, err = client.GetChannelMembersByIds("junk", []string{th.BasicUser.Id}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelMembersByIds(model.NewId(), []string{th.BasicUser.Id}) + _, resp, err = client.GetChannelMembersByIds(model.NewId(), []string{th.BasicUser.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) + client.Logout() + _, resp, err = client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) + require.NoError(t, err) } func TestGetChannelMember(t *testing.T) { @@ -2147,93 +2259,109 @@ func TestGetChannelMember(t *testing.T) { defer th.TearDown() c := th.Client th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - member, resp := client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, resp) + member, _, err := client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicChannel.Id, member.ChannelId, "wrong channel id") require.Equal(t, th.BasicUser.Id, member.UserId, "wrong user id") - _, resp = client.GetChannelMember("", th.BasicUser.Id, "") + _, resp, err := client.GetChannelMember("", th.BasicUser.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = client.GetChannelMember("junk", th.BasicUser.Id, "") + _, resp, err = client.GetChannelMember("junk", th.BasicUser.Id, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetChannelMember(th.BasicChannel.Id, "", "") + _, resp, err = client.GetChannelMember(th.BasicChannel.Id, "", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = client.GetChannelMember(th.BasicChannel.Id, "junk", "") + _, resp, err = client.GetChannelMember(th.BasicChannel.Id, "junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetChannelMember(th.BasicChannel.Id, model.NewId(), "") + _, resp, err = client.GetChannelMember(th.BasicChannel.Id, model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) }) - _, resp := c.GetChannelMember(model.NewId(), th.BasicUser.Id, "") + _, resp, err := c.GetChannelMember(model.NewId(), th.BasicUser.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) c.Logout() - _, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + _, resp, err = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() c.Login(user.Email, user.Password) - _, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + _, resp, err = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestGetChannelMembersForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - members, resp := Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") - CheckNoError(t, resp) + members, _, err := client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + require.NoError(t, err) require.Len(t, *members, 6, "should have 6 members on team") - _, resp = Client.GetChannelMembersForUser("", th.BasicTeam.Id, "") + _, resp, err := client.GetChannelMembersForUser("", th.BasicTeam.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelMembersForUser("junk", th.BasicTeam.Id, "") + _, resp, err = client.GetChannelMembersForUser("junk", th.BasicTeam.Id, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelMembersForUser(model.NewId(), th.BasicTeam.Id, "") + _, resp, err = client.GetChannelMembersForUser(model.NewId(), th.BasicTeam.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "", "") + _, resp, err = client.GetChannelMembersForUser(th.BasicUser.Id, "", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "junk", "") + _, resp, err = client.GetChannelMembersForUser(th.BasicUser.Id, "junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, model.NewId(), "") + _, resp, err = client.GetChannelMembersForUser(th.BasicUser.Id, model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + client.Logout() + _, resp, err = client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") + require.NoError(t, err) } func TestViewChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client view := &model.ChannelView{ ChannelId: th.BasicChannel.Id, } - viewResp, resp := Client.ViewChannel(th.BasicUser.Id, view) - CheckNoError(t, resp) + viewResp, _, err := client.ViewChannel(th.BasicUser.Id, view) + require.NoError(t, err) require.Equal(t, "OK", viewResp.Status, "should have passed") channel, _ := th.App.GetChannel(th.BasicChannel.Id) @@ -2241,174 +2369,194 @@ func TestViewChannel(t *testing.T) { require.Equal(t, channel.LastPostAt, viewResp.LastViewedAtTimes[channel.Id], "LastPostAt does not match returned LastViewedAt time") view.PrevChannelId = th.BasicChannel.Id - _, resp = Client.ViewChannel(th.BasicUser.Id, view) - CheckNoError(t, resp) + _, _, err = client.ViewChannel(th.BasicUser.Id, view) + require.NoError(t, err) view.PrevChannelId = "" - _, resp = Client.ViewChannel(th.BasicUser.Id, view) - CheckNoError(t, resp) + _, _, err = client.ViewChannel(th.BasicUser.Id, view) + require.NoError(t, err) view.PrevChannelId = "junk" - _, resp = Client.ViewChannel(th.BasicUser.Id, view) + _, resp, err := client.ViewChannel(th.BasicUser.Id, view) + require.Error(t, err) CheckBadRequestStatus(t, resp) // All blank is OK we use it for clicking off of the browser. view.PrevChannelId = "" view.ChannelId = "" - _, resp = Client.ViewChannel(th.BasicUser.Id, view) - CheckNoError(t, resp) + _, _, err = client.ViewChannel(th.BasicUser.Id, view) + require.NoError(t, err) view.PrevChannelId = "" view.ChannelId = "junk" - _, resp = Client.ViewChannel(th.BasicUser.Id, view) + _, resp, err = client.ViewChannel(th.BasicUser.Id, view) + require.Error(t, err) CheckBadRequestStatus(t, resp) view.ChannelId = "correctlysizedjunkdddfdfdf" - _, resp = Client.ViewChannel(th.BasicUser.Id, view) + _, resp, err = client.ViewChannel(th.BasicUser.Id, view) + require.Error(t, err) CheckBadRequestStatus(t, resp) view.ChannelId = th.BasicChannel.Id - member, resp := Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, resp) - channel, resp = Client.GetChannel(th.BasicChannel.Id, "") - CheckNoError(t, resp) + member, _, err := client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) + channel, _, err = client.GetChannel(th.BasicChannel.Id, "") + require.NoError(t, err) require.Equal(t, channel.TotalMsgCount, member.MsgCount, "should match message counts") require.Equal(t, int64(0), member.MentionCount, "should have no mentions") require.Equal(t, int64(0), member.MentionCountRoot, "should have no mentions") - _, resp = Client.ViewChannel("junk", view) + _, resp, err = client.ViewChannel("junk", view) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.ViewChannel(th.BasicUser2.Id, view) + _, resp, err = client.ViewChannel(th.BasicUser2.Id, view) + require.Error(t, err) CheckForbiddenStatus(t, resp) - r, err := Client.DoApiPost(fmt.Sprintf("/channels/members/%v/view", th.BasicUser.Id), "garbage") - require.NotNil(t, err) + r, err := client.DoApiPost(fmt.Sprintf("/channels/members/%v/view", th.BasicUser.Id), "garbage") + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) - Client.Logout() - _, resp = Client.ViewChannel(th.BasicUser.Id, view) + client.Logout() + _, resp, err = client.ViewChannel(th.BasicUser.Id, view) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.ViewChannel(th.BasicUser.Id, view) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.ViewChannel(th.BasicUser.Id, view) + require.NoError(t, err) } func TestGetChannelUnread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser channel := th.BasicChannel - channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id) - CheckNoError(t, resp) + channelUnread, _, err := client.GetChannelUnread(channel.Id, user.Id) + require.NoError(t, err) require.Equal(t, th.BasicTeam.Id, channelUnread.TeamId, "wrong team id returned for a regular user call") require.Equal(t, channel.Id, channelUnread.ChannelId, "wrong team id returned for a regular user call") - _, resp = Client.GetChannelUnread("junk", user.Id) + _, resp, err := client.GetChannelUnread("junk", user.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelUnread(channel.Id, "junk") + _, resp, err = client.GetChannelUnread(channel.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelUnread(channel.Id, model.NewId()) + _, resp, err = client.GetChannelUnread(channel.Id, model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannelUnread(model.NewId(), user.Id) + _, resp, err = client.GetChannelUnread(model.NewId(), user.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) newUser := th.CreateUser() - Client.Login(newUser.Email, newUser.Password) - _, resp = Client.GetChannelUnread(th.BasicChannel.Id, user.Id) + client.Login(newUser.Email, newUser.Password) + _, resp, err = client.GetChannelUnread(th.BasicChannel.Id, user.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetChannelUnread(channel.Id, user.Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetChannelUnread(model.NewId(), user.Id) + _, resp, err = th.SystemAdminClient.GetChannelUnread(model.NewId(), user.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, model.NewId()) + _, resp, err = th.SystemAdminClient.GetChannelUnread(channel.Id, model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) } func TestGetChannelStats(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.CreatePrivateChannel() - stats, resp := Client.GetChannelStats(channel.Id, "") - CheckNoError(t, resp) + stats, _, err := client.GetChannelStats(channel.Id, "") + require.NoError(t, err) require.Equal(t, channel.Id, stats.ChannelId, "couldnt't get extra info") require.Equal(t, int64(1), stats.MemberCount, "got incorrect member count") require.Equal(t, int64(0), stats.PinnedPostCount, "got incorrect pinned post count") th.CreatePinnedPostWithClient(th.Client, channel) - stats, resp = Client.GetChannelStats(channel.Id, "") - CheckNoError(t, resp) + stats, _, err = client.GetChannelStats(channel.Id, "") + require.NoError(t, err) require.Equal(t, int64(1), stats.PinnedPostCount, "should have returned 1 pinned post count") - _, resp = Client.GetChannelStats("junk", "") + _, resp, err := client.GetChannelStats("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelStats(model.NewId(), "") + _, resp, err = client.GetChannelStats(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetChannelStats(channel.Id, "") + client.Logout() + _, resp, err = client.GetChannelStats(channel.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic2() - _, resp = Client.GetChannelStats(channel.Id, "") + _, resp, err = client.GetChannelStats(channel.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetChannelStats(channel.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetChannelStats(channel.Id, "") + require.NoError(t, err) } func TestGetPinnedPosts(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel - posts, resp := Client.GetPinnedPosts(channel.Id, "") - CheckNoError(t, resp) + posts, _, err := client.GetPinnedPosts(channel.Id, "") + require.NoError(t, err) require.Empty(t, posts.Posts, "should not have gotten a pinned post") pinnedPost := th.CreatePinnedPost() - posts, resp = Client.GetPinnedPosts(channel.Id, "") - CheckNoError(t, resp) + posts, resp, err := client.GetPinnedPosts(channel.Id, "") + require.NoError(t, err) require.Len(t, posts.Posts, 1, "should have returned 1 pinned post") require.Contains(t, posts.Posts, pinnedPost.Id, "missing pinned post") - posts, resp = Client.GetPinnedPosts(channel.Id, resp.Etag) + posts, resp, _ = client.GetPinnedPosts(channel.Id, resp.Etag) CheckEtag(t, posts, resp) - _, resp = Client.GetPinnedPosts(GenerateTestId(), "") + _, resp, err = client.GetPinnedPosts(GenerateTestId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetPinnedPosts("junk", "") + _, resp, err = client.GetPinnedPosts("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.GetPinnedPosts(channel.Id, "") + client.Logout() + _, resp, err = client.GetPinnedPosts(channel.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetPinnedPosts(channel.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetPinnedPosts(channel.Id, "") + require.NoError(t, err) } func TestUpdateChannelRoles(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client const ChannelAdmin = "channel_user channel_admin" const ChannelMember = "channel_user" @@ -2420,61 +2568,67 @@ func TestUpdateChannelRoles(t *testing.T) { th.App.AddUserToChannel(th.BasicUser2, channel, false) // User 1 promotes User 2 - pass, resp := Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) - CheckNoError(t, resp) - require.True(t, pass, "should have passed") + _, err := client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) + require.NoError(t, err) - member, resp := Client.GetChannelMember(channel.Id, th.BasicUser2.Id, "") - CheckNoError(t, resp) + member, _, err := client.GetChannelMember(channel.Id, th.BasicUser2.Id, "") + require.NoError(t, err) require.Equal(t, ChannelAdmin, member.Roles, "roles don't match") // User 1 demotes User 2 - _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelMember) - CheckNoError(t, resp) + _, err = client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelMember) + require.NoError(t, err) th.LoginBasic2() // User 2 cannot demote User 1 - _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) + resp, err := client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) + require.Error(t, err) CheckForbiddenStatus(t, resp) // User 2 cannot promote self - _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) + resp, err = client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() // User 1 demotes self - _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) - CheckNoError(t, resp) + _, err = client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) + require.NoError(t, err) // System Admin promotes User 1 - _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) + require.NoError(t, err) // System Admin demotes User 1 - _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) + require.NoError(t, err) // System Admin promotes User 1 - _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) + require.NoError(t, err) th.LoginBasic() - _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, "junk") + resp, err = client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdateChannelRoles(channel.Id, "junk", ChannelMember) + resp, err = client.UpdateChannelRoles(channel.Id, "junk", ChannelMember) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdateChannelRoles("junk", th.BasicUser.Id, ChannelMember) + resp, err = client.UpdateChannelRoles("junk", th.BasicUser.Id, ChannelMember) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdateChannelRoles(channel.Id, model.NewId(), ChannelMember) + resp, err = client.UpdateChannelRoles(channel.Id, model.NewId(), ChannelMember) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.UpdateChannelRoles(model.NewId(), th.BasicUser.Id, ChannelMember) + resp, err = client.UpdateChannelRoles(model.NewId(), th.BasicUser.Id, ChannelMember) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -2484,7 +2638,7 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SystemAdminClient := th.SystemAdminClient WebSocketClient, err := th.CreateWebSocketClient() WebSocketClient.Listen() - require.Nil(t, err) + require.NoError(t, err) th.LoginBasic() @@ -2493,8 +2647,8 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: false, } - _, r1 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s1) - CheckNoError(t, r1) + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s1) + require.NoError(t, err) timeout := time.After(600 * time.Millisecond) waiting := true @@ -2511,8 +2665,8 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { } } - tm1, rtm1 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm1) + tm1, _, err := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm1.SchemeGuest) assert.Equal(t, false, tm1.SchemeUser) assert.Equal(t, false, tm1.SchemeAdmin) @@ -2522,11 +2676,11 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: false, } - _, r2 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s2) - CheckNoError(t, r2) + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s2) + require.NoError(t, err) - tm2, rtm2 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm2) + tm2, _, err := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm2.SchemeGuest) assert.Equal(t, true, tm2.SchemeUser) assert.Equal(t, false, tm2.SchemeAdmin) @@ -2536,11 +2690,11 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: false, } - _, r3 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s3) - CheckNoError(t, r3) + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s3) + require.NoError(t, err) - tm3, rtm3 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm3) + tm3, _, err := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm3.SchemeGuest) assert.Equal(t, false, tm3.SchemeUser) assert.Equal(t, true, tm3.SchemeAdmin) @@ -2550,11 +2704,11 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: false, } - _, r4 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) - CheckNoError(t, r4) + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) + require.NoError(t, err) - tm4, rtm4 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm4) + tm4, _, err := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm4.SchemeGuest) assert.Equal(t, true, tm4.SchemeUser) assert.Equal(t, true, tm4.SchemeAdmin) @@ -2564,11 +2718,11 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: true, } - _, r5 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s5) - CheckNoError(t, r5) + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s5) + require.NoError(t, err) - tm5, rtm5 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm5) + tm5, _, err := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, true, tm5.SchemeGuest) assert.Equal(t, false, tm5.SchemeUser) assert.Equal(t, false, tm5.SchemeAdmin) @@ -2578,75 +2732,86 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: true, } - _, resp := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s6) + resp, err := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s6) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, model.NewId(), s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, model.NewId(), s4) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, "ASDF", s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, "ASDF", s4) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.LoginBasic2() - _, resp = th.Client.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) + resp, err = th.Client.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) + require.Error(t, err) CheckForbiddenStatus(t, resp) SystemAdminClient.Logout() - _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.SystemAdminUser.Id, s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.SystemAdminUser.Id, s4) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestUpdateChannelNotifyProps(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client props := map[string]string{} props[model.DesktopNotifyProp] = model.ChannelNotifyMention props[model.MarkUnreadNotifyProp] = model.ChannelMarkUnreadMention - pass, resp := Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) - CheckNoError(t, resp) - require.True(t, pass, "should have passed") + _, err := client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) + require.NoError(t, err) - member, err := th.App.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id) - require.Nil(t, err) + member, appErr := th.App.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id) + require.Nil(t, appErr) require.Equal(t, model.ChannelNotifyMention, member.NotifyProps[model.DesktopNotifyProp], "bad update") require.Equal(t, model.ChannelMarkUnreadMention, member.NotifyProps[model.MarkUnreadNotifyProp], "bad update") - _, resp = Client.UpdateChannelNotifyProps("junk", th.BasicUser.Id, props) + resp, err := client.UpdateChannelNotifyProps("junk", th.BasicUser.Id, props) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, "junk", props) + resp, err = client.UpdateChannelNotifyProps(th.BasicChannel.Id, "junk", props) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdateChannelNotifyProps(model.NewId(), th.BasicUser.Id, props) + resp, err = client.UpdateChannelNotifyProps(model.NewId(), th.BasicUser.Id, props) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, model.NewId(), props) + resp, err = client.UpdateChannelNotifyProps(th.BasicChannel.Id, model.NewId(), props) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, map[string]string{}) - CheckNoError(t, resp) + _, err = client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, map[string]string{}) + require.NoError(t, err) - Client.Logout() - _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) + client.Logout() + resp, err = client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) + require.NoError(t, err) } func TestAddChannelMember(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser user2 := th.BasicUser2 team := th.BasicTeam @@ -2654,93 +2819,106 @@ func TestAddChannelMember(t *testing.T) { privateChannel := th.CreatePrivateChannel() user3 := th.CreateUserWithClient(th.SystemAdminClient) - _, resp := th.SystemAdminClient.AddTeamMember(team.Id, user3.Id) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.AddTeamMember(team.Id, user3.Id) + require.NoError(t, err) - cm, resp := Client.AddChannelMember(publicChannel.Id, user2.Id) - CheckNoError(t, resp) + cm, resp, err := client.AddChannelMember(publicChannel.Id, user2.Id) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, publicChannel.Id, cm.ChannelId, "should have returned exact channel") require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to public channel") - cm, resp = Client.AddChannelMember(privateChannel.Id, user2.Id) - CheckNoError(t, resp) + cm, _, err = client.AddChannelMember(privateChannel.Id, user2.Id) + require.NoError(t, err) require.Equal(t, privateChannel.Id, cm.ChannelId, "should have returned exact channel") require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to private channel") post := &model.Post{ChannelId: publicChannel.Id, Message: "a" + GenerateTestId() + "a"} - rpost, err := Client.CreatePost(post) - require.NotNil(t, err) + rpost, _, err := client.CreatePost(post) + require.NoError(t, err) - Client.RemoveUserFromChannel(publicChannel.Id, user.Id) - _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, rpost.Id) - CheckNoError(t, resp) + client.RemoveUserFromChannel(publicChannel.Id, user.Id) + _, resp, err = client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, rpost.Id) + require.NoError(t, err) CheckCreatedStatus(t, resp) - Client.RemoveUserFromChannel(publicChannel.Id, user.Id) - _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, "junk") + client.RemoveUserFromChannel(publicChannel.Id, user.Id) + _, resp, err = client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, GenerateTestId()) + _, resp, err = client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, GenerateTestId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.RemoveUserFromChannel(publicChannel.Id, user.Id) - _, resp = Client.AddChannelMember(publicChannel.Id, user.Id) - CheckNoError(t, resp) + client.RemoveUserFromChannel(publicChannel.Id, user.Id) + _, _, err = client.AddChannelMember(publicChannel.Id, user.Id) + require.NoError(t, err) - cm, resp = Client.AddChannelMember(publicChannel.Id, "junk") + cm, resp, err = client.AddChannelMember(publicChannel.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, cm, "should return nothing") - _, resp = Client.AddChannelMember(publicChannel.Id, GenerateTestId()) + _, resp, err = client.AddChannelMember(publicChannel.Id, GenerateTestId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.AddChannelMember("junk", user2.Id) + _, resp, err = client.AddChannelMember("junk", user2.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.AddChannelMember(GenerateTestId(), user2.Id) + _, resp, err = client.AddChannelMember(GenerateTestId(), user2.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) otherUser := th.CreateUser() otherChannel := th.CreatePublicChannel() - Client.Logout() - Client.Login(user2.Id, user2.Password) + client.Logout() + client.Login(user2.Id, user2.Password) - _, resp = Client.AddChannelMember(publicChannel.Id, otherUser.Id) + _, resp, err = client.AddChannelMember(publicChannel.Id, otherUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.AddChannelMember(privateChannel.Id, otherUser.Id) + _, resp, err = client.AddChannelMember(privateChannel.Id, otherUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id) + _, resp, err = client.AddChannelMember(otherChannel.Id, otherUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - Client.Logout() - Client.Login(user.Id, user.Password) + client.Logout() + client.Login(user.Id, user.Password) // should fail adding user who is not a member of the team - _, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id) + _, resp, err = client.AddChannelMember(otherChannel.Id, otherUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - Client.DeleteChannel(otherChannel.Id) + client.DeleteChannel(otherChannel.Id) // should fail adding user to a deleted channel - _, resp = Client.AddChannelMember(otherChannel.Id, user2.Id) + _, resp, err = client.AddChannelMember(otherChannel.Id, user2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - Client.Logout() - _, resp = Client.AddChannelMember(publicChannel.Id, user2.Id) + client.Logout() + _, resp, err = client.AddChannelMember(publicChannel.Id, user2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.AddChannelMember(privateChannel.Id, user2.Id) + _, resp, err = client.AddChannelMember(privateChannel.Id, user2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.AddChannelMember(publicChannel.Id, user2.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(publicChannel.Id, user2.Id) + require.NoError(t, err) - _, resp = client.AddChannelMember(privateChannel.Id, user2.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(privateChannel.Id, user2.Id) + require.NoError(t, err) }) // Check the appropriate permissions are enforced. @@ -2752,39 +2930,40 @@ func TestAddChannelMember(t *testing.T) { th.AddPermissionToRole(model.PermissionManagePrivateChannelMembers.Id, model.ChannelUserRoleId) // Check that a regular channel user can add other users. - Client.Login(user2.Username, user2.Password) + client.Login(user2.Username, user2.Password) privateChannel = th.CreatePrivateChannel() - _, resp = Client.AddChannelMember(privateChannel.Id, user.Id) - CheckNoError(t, resp) - Client.Logout() + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + require.NoError(t, err) + client.Logout() - Client.Login(user.Username, user.Password) - _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) - CheckNoError(t, resp) - Client.Logout() + client.Login(user.Username, user.Password) + _, _, err = client.AddChannelMember(privateChannel.Id, user3.Id) + require.NoError(t, err) + client.Logout() // Restrict the permission for adding users to Channel Admins th.AddPermissionToRole(model.PermissionManagePrivateChannelMembers.Id, model.ChannelAdminRoleId) th.RemovePermissionFromRole(model.PermissionManagePrivateChannelMembers.Id, model.ChannelUserRoleId) - Client.Login(user2.Username, user2.Password) + client.Login(user2.Username, user2.Password) privateChannel = th.CreatePrivateChannel() - _, resp = Client.AddChannelMember(privateChannel.Id, user.Id) - CheckNoError(t, resp) - Client.Logout() + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + require.NoError(t, err) + client.Logout() - Client.Login(user.Username, user.Password) - _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) + client.Login(user.Username, user.Password) + _, resp, err = client.AddChannelMember(privateChannel.Id, user3.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() th.MakeUserChannelAdmin(user, privateChannel) th.App.Srv().InvalidateAllCaches() - Client.Login(user.Username, user.Password) - _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) - CheckNoError(t, resp) - Client.Logout() + client.Login(user.Username, user.Password) + _, _, err = client.AddChannelMember(privateChannel.Id, user3.Id) + require.NoError(t, err) + client.Logout() // Set a channel to group-constrained privateChannel.GroupConstrained = model.NewBool(true) @@ -2793,8 +2972,8 @@ func TestAddChannelMember(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { // User is not in associated groups so shouldn't be allowed - _, resp = client.AddChannelMember(privateChannel.Id, user.Id) - CheckErrorMessage(t, resp, "api.channel.add_members.user_denied") + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + CheckErrorID(t, err, "api.channel.add_members.user_denied") }) // Associate group to team @@ -2810,15 +2989,15 @@ func TestAddChannelMember(t *testing.T) { require.Nil(t, appErr) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.AddChannelMember(privateChannel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + require.NoError(t, err) }) } func TestAddChannelMemberAddMyself(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.CreateUser() th.LinkUserToTeam(user, th.BasicTeam) notMemberPublicChannel1 := th.CreatePublicChannel() @@ -2867,7 +3046,7 @@ func TestAddChannelMemberAddMyself(t *testing.T) { "", }, } - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) for _, tc := range testCases { t.Run(tc.Name, func(t *testing.T) { @@ -2881,11 +3060,11 @@ func TestAddChannelMemberAddMyself(t *testing.T) { th.RemovePermissionFromRole(model.PermissionJoinPublicChannels.Id, model.TeamUserRoleId) } - _, resp := Client.AddChannelMember(tc.Channel.Id, user.Id) + _, _, err := client.AddChannelMember(tc.Channel.Id, user.Id) if tc.ExpectedError == "" { - CheckNoError(t, resp) + require.NoError(t, err) } else { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } }) } @@ -2897,7 +3076,7 @@ func TestRemoveChannelMember(t *testing.T) { user2 := th.BasicUser2 team := th.BasicTeam defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableBotAccountCreation = true @@ -2905,38 +3084,42 @@ func TestRemoveChannelMember(t *testing.T) { bot := th.CreateBotWithSystemAdminClient() th.App.AddUserToTeam(th.Context, team.Id, bot.UserId, "") - pass, resp := Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) - CheckNoError(t, resp) - require.True(t, pass, "should have passed") + _, err := client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) + require.NoError(t, err) - _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, "junk") + resp, err := client.RemoveUserFromChannel(th.BasicChannel.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, model.NewId()) + resp, err = client.RemoveUserFromChannel(th.BasicChannel.Id, model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.RemoveUserFromChannel(model.NewId(), th.BasicUser2.Id) + resp, err = client.RemoveUserFromChannel(model.NewId(), th.BasicUser2.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.LoginBasic2() - _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + resp, err = client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) t.Run("success", func(t *testing.T) { // Setup the system administrator to listen for websocket events from the channels. th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) - _, err := th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel, false) - require.Nil(t, err) - _, err = th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel2, false) - require.Nil(t, err) + _, appErr := th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel, false) + require.Nil(t, appErr) + _, appErr = th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel2, false) + require.Nil(t, appErr) props := map[string]string{} props[model.DesktopNotifyProp] = model.ChannelNotifyAll - _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.SystemAdminUser.Id, props) - _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel2.Id, th.SystemAdminUser.Id, props) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.SystemAdminUser.Id, props) + require.NoError(t, err) + _, err = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel2.Id, th.SystemAdminUser.Id, props) + require.NoError(t, err) - wsClient, err := th.CreateWebSocketSystemAdminClient() - require.Nil(t, err) + wsClient, err2 := th.CreateWebSocketSystemAdminClient() + require.NoError(t, err2) wsClient.Listen() var closeWsClient sync.Once defer closeWsClient.Do(func() { @@ -2970,23 +3153,23 @@ func TestRemoveChannelMember(t *testing.T) { } th.App.AddUserToChannel(th.BasicUser2, th.BasicChannel, false) - _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) - CheckNoError(t, resp) + _, err2 = client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) + require.NoError(t, err2) requirePost(&model.Post{ Message: fmt.Sprintf("@%s left the channel.", th.BasicUser2.Username), ChannelId: th.BasicChannel.Id, }) - _, resp = Client.RemoveUserFromChannel(th.BasicChannel2.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, err2 = client.RemoveUserFromChannel(th.BasicChannel2.Id, th.BasicUser.Id) + require.NoError(t, err2) requirePost(&model.Post{ Message: fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username), ChannelId: th.BasicChannel2.Id, }) - _, resp = th.SystemAdminClient.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, err2 = th.SystemAdminClient.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + require.NoError(t, err2) requirePost(&model.Post{ Message: fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username), ChannelId: th.BasicChannel.Id, @@ -3006,24 +3189,25 @@ func TestRemoveChannelMember(t *testing.T) { deletedChannel.DeleteAt = 1 th.App.UpdateChannel(deletedChannel) - _, resp = Client.RemoveUserFromChannel(deletedChannel.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(deletedChannel.Id, th.BasicUser.Id) + require.NoError(t, err) th.LoginBasic() private := th.CreatePrivateChannel() th.App.AddUserToChannel(th.BasicUser2, private, false) - _, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser2.Id) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(private.Id, th.BasicUser2.Id) + require.NoError(t, err) th.LoginBasic2() - _, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) + resp, err = client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { th.App.AddUserToChannel(th.BasicUser, private, false) - _, resp = client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) + require.NoError(t, err) }) th.LoginBasic() @@ -3041,13 +3225,13 @@ func TestRemoveChannelMember(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { // Check that a regular channel user can remove other users. privateChannel := th.CreateChannelWithClient(client, model.ChannelTypePrivate) - _, resp = client.AddChannelMember(privateChannel.Id, user1.Id) - CheckNoError(t, resp) - _, resp = client.AddChannelMember(privateChannel.Id, user2.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(privateChannel.Id, user1.Id) + require.NoError(t, err) + _, _, err = client.AddChannelMember(privateChannel.Id, user2.Id) + require.NoError(t, err) - _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(privateChannel.Id, user2.Id) + require.NoError(t, err) }) // Restrict the permission for adding users to Channel Admins @@ -3055,60 +3239,65 @@ func TestRemoveChannelMember(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManagePrivateChannelMembers.Id, model.ChannelUserRoleId) privateChannel := th.CreateChannelWithClient(th.SystemAdminClient, model.ChannelTypePrivate) - _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id) - CheckNoError(t, resp) - _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id) - CheckNoError(t, resp) - _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, bot.UserId) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.AddChannelMember(privateChannel.Id, bot.UserId) + require.NoError(t, err) - _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) + resp, err = client.RemoveUserFromChannel(privateChannel.Id, user2.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.MakeUserChannelAdmin(user1, privateChannel) th.App.Srv().InvalidateAllCaches() - _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(privateChannel.Id, user2.Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, th.SystemAdminUser.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddChannelMember(privateChannel.Id, th.SystemAdminUser.Id) + require.NoError(t, err) // If the channel is group-constrained the user cannot be removed privateChannel.GroupConstrained = model.NewBool(true) - _, err := th.App.UpdateChannel(privateChannel) - require.Nil(t, err) - _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) - require.Equal(t, "api.channel.remove_member.group_constrained.app_error", resp.Error.Id) + _, appErr := th.App.UpdateChannel(privateChannel) + require.Nil(t, appErr) + _, err = client.RemoveUserFromChannel(privateChannel.Id, user2.Id) + CheckErrorID(t, err, "api.channel.remove_member.group_constrained.app_error") // If the channel is group-constrained user can remove self - _, resp = th.SystemAdminClient.RemoveUserFromChannel(privateChannel.Id, th.SystemAdminUser.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.RemoveUserFromChannel(privateChannel.Id, th.SystemAdminUser.Id) + require.NoError(t, err) // Test on preventing removal of user from a direct channel - directChannel, resp := Client.CreateDirectChannel(user1.Id, user2.Id) - CheckNoError(t, resp) + directChannel, _, err := client.CreateDirectChannel(user1.Id, user2.Id) + require.NoError(t, err) // If the channel is group-constrained a user can remove a bot - _, resp = Client.RemoveUserFromChannel(privateChannel.Id, bot.UserId) - CheckNoError(t, resp) + _, err = client.RemoveUserFromChannel(privateChannel.Id, bot.UserId) + require.NoError(t, err) - _, resp = Client.RemoveUserFromChannel(directChannel.Id, user1.Id) + resp, err = client.RemoveUserFromChannel(directChannel.Id, user1.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.RemoveUserFromChannel(directChannel.Id, user2.Id) + resp, err = client.RemoveUserFromChannel(directChannel.Id, user2.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.RemoveUserFromChannel(directChannel.Id, user1.Id) + resp, err = th.SystemAdminClient.RemoveUserFromChannel(directChannel.Id, user1.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test on preventing removal of user from a group channel user3 := th.CreateUser() - groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id, user3.Id}) - CheckNoError(t, resp) + groupChannel, _, err := client.CreateGroupChannel([]string{user1.Id, user2.Id, user3.Id}) + require.NoError(t, err) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp = client.RemoveUserFromChannel(groupChannel.Id, user1.Id) + resp, err = client.RemoveUserFromChannel(groupChannel.Id, user1.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } @@ -3119,13 +3308,13 @@ func TestAutocompleteChannels(t *testing.T) { // A private channel to make sure private channels are not used utils.DisableDebugLogForTest() - ptown, _ := th.Client.CreateChannel(&model.Channel{ + ptown, _, _ := th.Client.CreateChannel(&model.Channel{ DisplayName: "Town", Name: "town", Type: model.ChannelTypePrivate, TeamId: th.BasicTeam.Id, }) - tower, _ := th.Client.CreateChannel(&model.Channel{ + tower, _, _ := th.Client.CreateChannel(&model.Channel{ DisplayName: "Tower", Name: "tower", Type: model.ChannelTypeOpen, @@ -3167,8 +3356,8 @@ func TestAutocompleteChannels(t *testing.T) { }, } { t.Run(tc.description, func(t *testing.T) { - channels, resp := th.Client.AutocompleteChannelsForTeam(tc.teamId, tc.fragment) - require.Nil(t, resp.Error) + channels, _, err := th.Client.AutocompleteChannelsForTeam(tc.teamId, tc.fragment) + require.NoError(t, err) names := make([]string, len(*channels)) for i, c := range *channels { names[i] = c.Name @@ -3201,7 +3390,7 @@ func TestAutocompleteChannelsForSearch(t *testing.T) { // A private channel to make sure private channels are not used utils.DisableDebugLogForTest() - ptown, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ + ptown, _, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "Town", Name: "town", Type: model.ChannelTypePrivate, @@ -3210,7 +3399,7 @@ func TestAutocompleteChannelsForSearch(t *testing.T) { defer func() { th.Client.DeleteChannel(ptown.Id) }() - mypriv, _ := th.Client.CreateChannel(&model.Channel{ + mypriv, _, _ := th.Client.CreateChannel(&model.Channel{ DisplayName: "My private town", Name: "townpriv", Type: model.ChannelTypePrivate, @@ -3221,26 +3410,26 @@ func TestAutocompleteChannelsForSearch(t *testing.T) { }() utils.EnableDebugLogForTest() - dc1, resp := th.Client.CreateDirectChannel(th.BasicUser.Id, u1.Id) - CheckNoError(t, resp) + dc1, _, err := th.Client.CreateDirectChannel(th.BasicUser.Id, u1.Id) + require.NoError(t, err) defer func() { th.Client.DeleteChannel(dc1.Id) }() - dc2, resp := th.SystemAdminClient.CreateDirectChannel(u2.Id, u3.Id) - CheckNoError(t, resp) + dc2, _, err := th.SystemAdminClient.CreateDirectChannel(u2.Id, u3.Id) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(dc2.Id) }() - gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, u2.Id, u3.Id}) - CheckNoError(t, resp) + gc1, _, err := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, u2.Id, u3.Id}) + require.NoError(t, err) defer func() { th.Client.DeleteChannel(gc1.Id) }() - gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{u2.Id, u3.Id, u4.Id}) - CheckNoError(t, resp) + gc2, _, err := th.SystemAdminClient.CreateGroupChannel([]string{u2.Id, u3.Id, u4.Id}) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(gc2.Id) }() @@ -3282,8 +3471,8 @@ func TestAutocompleteChannelsForSearch(t *testing.T) { }, } { t.Run(tc.description, func(t *testing.T) { - channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) - require.Nil(t, resp.Error) + channels, _, err := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) + require.NoError(t, err) names := make([]string, len(*channels)) for i, c := range *channels { names[i] = c.Name @@ -3321,17 +3510,17 @@ func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) { Password: "Password1", EmailVerified: true, } - guest, err := th.App.CreateGuest(th.Context, guest) - require.Nil(t, err) + guest, appErr := th.App.CreateGuest(th.Context, guest) + require.Nil(t, appErr) th.LoginSystemAdminWithClient(th.SystemAdminClient) - _, resp := th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, guest.Id) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, guest.Id) + require.NoError(t, err) // A private channel to make sure private channels are not used utils.DisableDebugLogForTest() - town, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ + town, _, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "Town", Name: "town", Type: model.ChannelTypeOpen, @@ -3340,10 +3529,10 @@ func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) { defer func() { th.SystemAdminClient.DeleteChannel(town.Id) }() - _, resp = th.SystemAdminClient.AddChannelMember(town.Id, guest.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddChannelMember(town.Id, guest.Id) + require.NoError(t, err) - mypriv, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ + mypriv, _, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "My private town", Name: "townpriv", Type: model.ChannelTypePrivate, @@ -3352,37 +3541,37 @@ func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) { defer func() { th.SystemAdminClient.DeleteChannel(mypriv.Id) }() - _, resp = th.SystemAdminClient.AddChannelMember(mypriv.Id, guest.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddChannelMember(mypriv.Id, guest.Id) + require.NoError(t, err) utils.EnableDebugLogForTest() - dc1, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, guest.Id) - CheckNoError(t, resp) + dc1, _, err := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, guest.Id) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(dc1.Id) }() - dc2, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) - CheckNoError(t, resp) + dc2, _, err := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(dc2.Id) }() - gc1, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, guest.Id}) - CheckNoError(t, resp) + gc1, _, err := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, guest.Id}) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(gc1.Id) }() - gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) - CheckNoError(t, resp) + gc2, _, err := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) + require.NoError(t, err) defer func() { th.SystemAdminClient.DeleteChannel(gc2.Id) }() - _, resp = th.Client.Login(guest.Username, "Password1") - CheckNoError(t, resp) + _, _, err = th.Client.Login(guest.Username, "Password1") + require.NoError(t, err) for _, tc := range []struct { description string @@ -3414,8 +3603,8 @@ func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) { }, } { t.Run(tc.description, func(t *testing.T) { - channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) - require.Nil(t, resp.Error) + channels, _, err := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) + require.NoError(t, err) names := make([]string, len(*channels)) for i, c := range *channels { names[i] = c.Name @@ -3438,7 +3627,7 @@ func TestUpdateChannelScheme(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) - team, resp := th.SystemAdminClient.CreateTeam(&model.Team{ + team, _, err := th.SystemAdminClient.CreateTeam(&model.Team{ DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", @@ -3448,104 +3637,111 @@ func TestUpdateChannelScheme(t *testing.T) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen, }) - CheckNoError(t, resp) + require.NoError(t, err) - channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{ + channel, _, err := th.SystemAdminClient.CreateChannel(&model.Channel{ DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id, }) - CheckNoError(t, resp) + require.NoError(t, err) - channelScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{ + channelScheme, _, err := th.SystemAdminClient.CreateScheme(&model.Scheme{ DisplayName: "DisplayName", Name: model.NewId(), Description: "Some description", Scope: model.SchemeScopeChannel, }) - CheckNoError(t, resp) + require.NoError(t, err) - teamScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{ + teamScheme, _, err := th.SystemAdminClient.CreateScheme(&model.Scheme{ DisplayName: "DisplayName", Name: model.NewId(), Description: "Some description", Scope: model.SchemeScopeTeam, }) - CheckNoError(t, resp) + require.NoError(t, err) // Test the setup/base case. - _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) + require.NoError(t, err) // Test various invalid channel and scheme id combinations. - _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, "x") + resp, err := th.SystemAdminClient.UpdateChannelScheme(channel.Id, "x") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.UpdateChannelScheme("x", channelScheme.Id) + resp, err = th.SystemAdminClient.UpdateChannelScheme("x", channelScheme.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.UpdateChannelScheme("x", "x") + resp, err = th.SystemAdminClient.UpdateChannelScheme("x", "x") + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test that permissions are required. - _, resp = th.Client.UpdateChannelScheme(channel.Id, channelScheme.Id) + resp, err = th.Client.UpdateChannelScheme(channel.Id, channelScheme.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test that a license is required. th.App.Srv().SetLicense(nil) - _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) + resp, err = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.Srv().SetLicense(model.NewTestLicense("")) // Test an invalid scheme scope. - _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, teamScheme.Id) + resp, err = th.SystemAdminClient.UpdateChannelScheme(channel.Id, teamScheme.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test that an unauthenticated user gets rejected. th.SystemAdminClient.Logout() - _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) + resp, err = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestGetChannelMembersTimezones(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser user.Timezone["useAutomaticTimezone"] = "false" user.Timezone["manualTimezone"] = "XOXO/BLABLA" - _, resp := Client.UpdateUser(user) - CheckNoError(t, resp) + _, _, err := client.UpdateUser(user) + require.NoError(t, err) user2 := th.BasicUser2 user2.Timezone["automaticTimezone"] = "NoWhere/Island" - _, resp = th.SystemAdminClient.UpdateUser(user2) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateUser(user2) + require.NoError(t, err) - timezone, resp := Client.GetChannelMembersTimezones(th.BasicChannel.Id) - CheckNoError(t, resp) + timezone, _, err := client.GetChannelMembersTimezones(th.BasicChannel.Id) + require.NoError(t, err) require.Len(t, timezone, 2, "should return 2 timezones") //both users have same timezone user2.Timezone["automaticTimezone"] = "XOXO/BLABLA" - _, resp = th.SystemAdminClient.UpdateUser(user2) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateUser(user2) + require.NoError(t, err) - timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id) - CheckNoError(t, resp) + timezone, _, err = client.GetChannelMembersTimezones(th.BasicChannel.Id) + require.NoError(t, err) require.Len(t, timezone, 1, "should return 1 timezone") //no timezone set should return empty user2.Timezone["automaticTimezone"] = "" - _, resp = th.SystemAdminClient.UpdateUser(user2) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateUser(user2) + require.NoError(t, err) user.Timezone["manualTimezone"] = "" - _, resp = Client.UpdateUser(user) - CheckNoError(t, resp) + _, _, err = client.UpdateUser(user) + require.NoError(t, err) - timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id) - CheckNoError(t, resp) + timezone, _, err = client.GetChannelMembersTimezones(th.BasicChannel.Id) + require.NoError(t, err) require.Empty(t, timezone, "should return 0 timezone") } @@ -3558,26 +3754,26 @@ func TestChannelMembersMinusGroupMembers(t *testing.T) { channel := th.CreatePrivateChannel() - _, err := th.App.AddChannelMember(th.Context, user1.Id, channel, app.ChannelMemberOpts{}) - require.Nil(t, err) - _, err = th.App.AddChannelMember(th.Context, user2.Id, channel, app.ChannelMemberOpts{}) - require.Nil(t, err) + _, appErr := th.App.AddChannelMember(th.Context, user1.Id, channel, app.ChannelMemberOpts{}) + require.Nil(t, appErr) + _, appErr = th.App.AddChannelMember(th.Context, user2.Id, channel, app.ChannelMemberOpts{}) + require.Nil(t, appErr) channel.GroupConstrained = model.NewBool(true) - channel, err = th.App.UpdateChannel(channel) - require.Nil(t, err) + channel, appErr = th.App.UpdateChannel(channel) + require.Nil(t, appErr) group1 := th.CreateGroup() group2 := th.CreateGroup() - _, err = th.App.UpsertGroupMember(group1.Id, user1.Id) - require.Nil(t, err) - _, err = th.App.UpsertGroupMember(group2.Id, user2.Id) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group1.Id, user1.Id) + require.Nil(t, appErr) + _, appErr = th.App.UpsertGroupMember(group2.Id, user2.Id) + require.Nil(t, appErr) // No permissions - _, _, res := th.Client.ChannelMembersMinusGroupMembers(channel.Id, []string{group1.Id, group2.Id}, 0, 100, "") - require.Equal(t, "api.context.permissions.app_error", res.Error.Id) + _, _, _, err := th.Client.ChannelMembersMinusGroupMembers(channel.Id, []string{group1.Id, group2.Id}, 0, 100, "") + CheckErrorID(t, err, "api.context.permissions.app_error") testCases := map[string]struct { groupIDs []string @@ -3632,8 +3828,8 @@ func TestChannelMembersMinusGroupMembers(t *testing.T) { for name, tc := range testCases { t.Run(name, func(t *testing.T) { - uwg, count, res := th.SystemAdminClient.ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage, "") - require.Nil(t, res.Error) + uwg, count, _, err := th.SystemAdminClient.ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage, "") + require.NoError(t, err) require.Len(t, uwg, tc.length) require.Equal(t, tc.count, int(count)) if tc.otherAssertions != nil { @@ -3653,22 +3849,22 @@ func TestGetChannelModerations(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) t.Run("Errors without a license", func(t *testing.T) { - _, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Equal(t, "api.channel.get_channel_moderations.license.error", res.Error.Id) + _, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + CheckErrorID(t, err, "api.channel.get_channel_moderations.license.error") }) th.App.Srv().SetLicense(model.NewTestLicense()) t.Run("Errors as a non sysadmin", func(t *testing.T) { - _, res := th.Client.GetChannelModerations(channel.Id, "") - require.Equal(t, "api.context.permissions.app_error", res.Error.Id) + _, _, err := th.Client.GetChannelModerations(channel.Id, "") + CheckErrorID(t, err, "api.context.permissions.app_error") }) th.App.Srv().SetLicense(model.NewTestLicense()) t.Run("Returns default moderations with default roles", func(t *testing.T) { - moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3686,14 +3882,14 @@ func TestGetChannelModerations(t *testing.T) { t.Run("Returns value false and enabled false for permissions that are not present in higher scoped scheme when no channel scheme present", func(t *testing.T) { scheme := th.SetupTeamScheme() team.SchemeId = &scheme.Id - _, err := th.App.UpdateTeamScheme(team) - require.Nil(t, err) + _, appErr := th.App.UpdateTeamScheme(team) + require.Nil(t, appErr) th.RemovePermissionFromRole(model.PermissionCreatePost.Id, scheme.DefaultChannelGuestRole) defer th.AddPermissionToRole(model.PermissionCreatePost.Id, scheme.DefaultChannelGuestRole) - moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) for _, moderation := range moderations { if moderation.Name == model.PermissionCreatePost.Id { require.Equal(t, moderation.Roles.Members.Value, true) @@ -3707,14 +3903,14 @@ func TestGetChannelModerations(t *testing.T) { t.Run("Returns value false and enabled true for permissions that are not present in channel scheme but present in team scheme", func(t *testing.T) { scheme := th.SetupChannelScheme() channel.SchemeId = &scheme.Id - _, err := th.App.UpdateChannelScheme(channel) - require.Nil(t, err) + _, appErr := th.App.UpdateChannelScheme(channel) + require.Nil(t, appErr) th.RemovePermissionFromRole(model.PermissionCreatePost.Id, scheme.DefaultChannelGuestRole) defer th.AddPermissionToRole(model.PermissionCreatePost.Id, scheme.DefaultChannelGuestRole) - moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) for _, moderation := range moderations { if moderation.Name == model.PermissionCreatePost.Id { require.Equal(t, moderation.Roles.Members.Value, true) @@ -3740,8 +3936,8 @@ func TestGetChannelModerations(t *testing.T) { defer th.AddPermissionToRole(model.PermissionCreatePost.Id, scheme.DefaultChannelGuestRole) defer th.AddPermissionToRole(model.PermissionCreatePost.Id, teamScheme.DefaultChannelGuestRole) - moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) for _, moderation := range moderations { if moderation.Name == model.PermissionCreatePost.Id { require.Equal(t, moderation.Roles.Members.Value, true) @@ -3755,15 +3951,15 @@ func TestGetChannelModerations(t *testing.T) { t.Run("Returns the correct value for manage_members depending on whether the channel is public or private", func(t *testing.T) { scheme := th.SetupTeamScheme() team.SchemeId = &scheme.Id - _, err := th.App.UpdateTeamScheme(team) - require.Nil(t, err) + _, appErr := th.App.UpdateTeamScheme(team) + require.Nil(t, appErr) th.RemovePermissionFromRole(model.PermissionManagePublicChannelMembers.Id, scheme.DefaultChannelUserRole) defer th.AddPermissionToRole(model.PermissionCreatePost.Id, scheme.DefaultChannelUserRole) // public channel does not have the permission - moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) for _, moderation := range moderations { if moderation.Name == "manage_members" { require.Equal(t, moderation.Roles.Members.Value, false) @@ -3771,8 +3967,8 @@ func TestGetChannelModerations(t *testing.T) { } // private channel does have the permission - moderations, res = th.SystemAdminClient.GetChannelModerations(th.BasicPrivateChannel.Id, "") - require.Nil(t, res.Error) + moderations, _, err = th.SystemAdminClient.GetChannelModerations(th.BasicPrivateChannel.Id, "") + require.NoError(t, err) for _, moderation := range moderations { if moderation.Name == "manage_members" { require.Equal(t, moderation.Roles.Members.Value, true) @@ -3801,11 +3997,11 @@ func TestGetChannelModerations(t *testing.T) { th.App.Srv().Store = &mockStore team.SchemeId = &scheme.Id - _, err := th.App.UpdateTeamScheme(team) - require.Nil(t, err) + _, appErr := th.App.UpdateTeamScheme(team) + require.Nil(t, appErr) - _, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") - require.Nil(t, res.Error) + _, _, err := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.NoError(t, err) }) } @@ -3822,22 +4018,22 @@ func TestPatchChannelModerations(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) t.Run("Errors without a license", func(t *testing.T) { - _, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) - require.Equal(t, "api.channel.patch_channel_moderations.license.error", res.Error.Id) + _, _, err := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) + CheckErrorID(t, err, "api.channel.patch_channel_moderations.license.error") }) th.App.Srv().SetLicense(model.NewTestLicense()) t.Run("Errors as a non sysadmin", func(t *testing.T) { - _, res := th.Client.PatchChannelModerations(channel.Id, emptyPatch) - require.Equal(t, "api.context.permissions.app_error", res.Error.Id) + _, _, err := th.Client.PatchChannelModerations(channel.Id, emptyPatch) + CheckErrorID(t, err, "api.context.permissions.app_error") }) th.App.Srv().SetLicense(model.NewTestLicense()) t.Run("Returns default moderations with empty patch", func(t *testing.T) { - moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3862,8 +4058,8 @@ func TestPatchChannelModerations(t *testing.T) { }, } - moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3899,8 +4095,8 @@ func TestPatchChannelModerations(t *testing.T) { }, } - moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3945,11 +4141,11 @@ func TestPatchChannelModerations(t *testing.T) { th.App.Srv().Store = &mockStore team.SchemeId = &scheme.Id - _, err := th.App.UpdateTeamScheme(team) - require.Nil(t, err) + _, appErr := th.App.UpdateTeamScheme(team) + require.Nil(t, appErr) - moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) - require.Nil(t, res.Error) + moderations, _, err := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3970,8 +4166,8 @@ func TestPatchChannelModerations(t *testing.T) { }, } - moderations, res = th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) - require.Nil(t, res.Error) + moderations, _, err = th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) + require.NoError(t, err) require.Equal(t, len(moderations), 4) for _, moderation := range moderations { if moderation.Name == "manage_members" { @@ -3994,39 +4190,39 @@ func TestGetChannelMemberCountsByGroup(t *testing.T) { channel := th.BasicChannel t.Run("Errors without a license", func(t *testing.T) { - _, res := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") - require.Equal(t, "api.channel.channel_member_counts_by_group.license.error", res.Error.Id) + _, _, err := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") + CheckErrorID(t, err, "api.channel.channel_member_counts_by_group.license.error") }) th.App.Srv().SetLicense(model.NewTestLicense()) t.Run("Errors without read permission to the channel", func(t *testing.T) { - _, res := th.Client.GetChannelMemberCountsByGroup(model.NewId(), false, "") - require.Equal(t, "api.context.permissions.app_error", res.Error.Id) + _, _, err := th.Client.GetChannelMemberCountsByGroup(model.NewId(), false, "") + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("Returns empty for a channel with no members or groups", func(t *testing.T) { - memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") + memberCounts, _, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") require.Equal(t, []*model.ChannelMemberCountByGroup{}, memberCounts) }) user := th.BasicUser user.Timezone["useAutomaticTimezone"] = "false" user.Timezone["manualTimezone"] = "XOXO/BLABLA" - _, err := th.App.UpsertGroupMember(th.Group.Id, user.Id) - require.Nil(t, err) - _, resp := th.SystemAdminClient.UpdateUser(user) - CheckNoError(t, resp) + _, appErr := th.App.UpsertGroupMember(th.Group.Id, user.Id) + require.Nil(t, appErr) + _, _, err := th.SystemAdminClient.UpdateUser(user) + require.NoError(t, err) user2 := th.BasicUser2 user2.Timezone["automaticTimezone"] = "NoWhere/Island" - _, err = th.App.UpsertGroupMember(th.Group.Id, user2.Id) - require.Nil(t, err) - _, resp = th.SystemAdminClient.UpdateUser(user2) - CheckNoError(t, resp) + _, appErr = th.App.UpsertGroupMember(th.Group.Id, user2.Id) + require.Nil(t, appErr) + _, _, err = th.SystemAdminClient.UpdateUser(user2) + require.NoError(t, err) t.Run("Returns users in group without timezones", func(t *testing.T) { - memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") + memberCounts, _, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") expectedMemberCounts := []*model.ChannelMemberCountByGroup{ { GroupId: th.Group.Id, @@ -4038,7 +4234,7 @@ func TestGetChannelMemberCountsByGroup(t *testing.T) { }) t.Run("Returns users in group with timezones", func(t *testing.T) { - memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") + memberCounts, _, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") expectedMemberCounts := []*model.ChannelMemberCountByGroup{ { GroupId: th.Group.Id, @@ -4057,13 +4253,13 @@ func TestGetChannelMemberCountsByGroup(t *testing.T) { RemoteId: model.NewId(), } - _, err = th.App.CreateGroup(group) - require.Nil(t, err) - _, err = th.App.UpsertGroupMember(group.Id, user.Id) - require.Nil(t, err) + _, appErr = th.App.CreateGroup(group) + require.Nil(t, appErr) + _, appErr = th.App.UpsertGroupMember(group.Id, user.Id) + require.Nil(t, appErr) t.Run("Returns multiple groups with users in group with timezones", func(t *testing.T) { - memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") + memberCounts, _, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") expectedMemberCounts := []*model.ChannelMemberCountByGroup{ { GroupId: group.Id, @@ -4084,91 +4280,91 @@ func TestMoveChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team1 := th.BasicTeam team2 := th.CreateTeam() t.Run("Should move channel", func(t *testing.T) { publicChannel := th.CreatePublicChannel() - ch, resp := th.SystemAdminClient.MoveChannel(publicChannel.Id, team2.Id, false) - require.Nil(t, resp.Error) + ch, _, err := th.SystemAdminClient.MoveChannel(publicChannel.Id, team2.Id, false) + require.NoError(t, err) require.Equal(t, team2.Id, ch.TeamId) }) t.Run("Should move private channel", func(t *testing.T) { channel := th.CreatePrivateChannel() - ch, resp := th.SystemAdminClient.MoveChannel(channel.Id, team1.Id, false) - require.Nil(t, resp.Error) + ch, _, err := th.SystemAdminClient.MoveChannel(channel.Id, team1.Id, false) + require.NoError(t, err) require.Equal(t, team1.Id, ch.TeamId) }) t.Run("Should fail when trying to move a DM channel", func(t *testing.T) { user := th.CreateUser() dmChannel := th.CreateDmChannel(user) - _, resp := Client.MoveChannel(dmChannel.Id, team1.Id, false) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid") + _, _, err := client.MoveChannel(dmChannel.Id, team1.Id, false) + require.Error(t, err) + CheckErrorID(t, err, "api.channel.move_channel.type.invalid") }) t.Run("Should fail when trying to move a group channel", func(t *testing.T) { user := th.CreateUser() - gmChannel, err := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, user.Id) - require.Nil(t, err) - _, resp := Client.MoveChannel(gmChannel.Id, team1.Id, false) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid") + gmChannel, appErr := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, user.Id) + require.Nil(t, appErr) + _, _, err := client.MoveChannel(gmChannel.Id, team1.Id, false) + require.Error(t, err) + CheckErrorID(t, err, "api.channel.move_channel.type.invalid") }) t.Run("Should fail due to permissions", func(t *testing.T) { publicChannel := th.CreatePublicChannel() - _, resp := Client.MoveChannel(publicChannel.Id, team1.Id, false) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err := client.MoveChannel(publicChannel.Id, team1.Id, false) + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { publicChannel := th.CreatePublicChannel() user := th.BasicUser - _, resp := client.RemoveTeamMember(team2.Id, user.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamMember(team2.Id, user.Id) + require.NoError(t, err) - _, resp = client.AddChannelMember(publicChannel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(publicChannel.Id, user.Id) + require.NoError(t, err) - _, resp = client.MoveChannel(publicChannel.Id, team2.Id, false) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error") + _, _, err = client.MoveChannel(publicChannel.Id, team2.Id, false) + require.Error(t, err) + CheckErrorID(t, err, "app.channel.move_channel.members_do_not_match.error") }, "Should fail to move public channel due to a member not member of target team") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { privateChannel := th.CreatePrivateChannel() user := th.BasicUser - _, resp := client.RemoveTeamMember(team2.Id, user.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamMember(team2.Id, user.Id) + require.NoError(t, err) - _, resp = client.AddChannelMember(privateChannel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + require.NoError(t, err) - _, resp = client.MoveChannel(privateChannel.Id, team2.Id, false) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error") + _, _, err = client.MoveChannel(privateChannel.Id, team2.Id, false) + require.Error(t, err) + CheckErrorID(t, err, "app.channel.move_channel.members_do_not_match.error") }, "Should fail to move private channel due to a member not member of target team") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { publicChannel := th.CreatePublicChannel() user := th.BasicUser - _, resp := client.RemoveTeamMember(team2.Id, user.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamMember(team2.Id, user.Id) + require.NoError(t, err) - _, resp = client.AddChannelMember(publicChannel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(publicChannel.Id, user.Id) + require.NoError(t, err) - newChannel, resp := client.MoveChannel(publicChannel.Id, team2.Id, true) - require.Nil(t, resp.Error) + newChannel, _, err := client.MoveChannel(publicChannel.Id, team2.Id, true) + require.NoError(t, err) require.Equal(t, team2.Id, newChannel.TeamId) }, "Should be able to (force) move public channel by a member that is not member of target team") @@ -4176,14 +4372,14 @@ func TestMoveChannel(t *testing.T) { privateChannel := th.CreatePrivateChannel() user := th.BasicUser - _, resp := client.RemoveTeamMember(team2.Id, user.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamMember(team2.Id, user.Id) + require.NoError(t, err) - _, resp = client.AddChannelMember(privateChannel.Id, user.Id) - CheckNoError(t, resp) + _, _, err = client.AddChannelMember(privateChannel.Id, user.Id) + require.NoError(t, err) - newChannel, resp := client.MoveChannel(privateChannel.Id, team2.Id, true) - require.Nil(t, resp.Error) + newChannel, _, err := client.MoveChannel(privateChannel.Id, team2.Id, true) + require.NoError(t, err) require.Equal(t, team2.Id, newChannel.TeamId) }, "Should be able to (force) move private channel by a member that is not member of target team") } @@ -4192,7 +4388,7 @@ func TestRootMentionsCount(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser channel := th.BasicChannel @@ -4203,16 +4399,16 @@ func TestRootMentionsCount(t *testing.T) { require.Equal(t, int64(0), channelMember.MentionCount) // mention the user in a root post - post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) - CheckNoError(t, resp) + post1, _, err := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) + require.NoError(t, err) // mention the user in a reply post post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id} - _, resp = th.SystemAdminClient.CreatePost(post2) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreatePost(post2) + require.NoError(t, err) // this should perform lazy migration and populate the field - channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id) - CheckNoError(t, resp) + channelUnread, _, err := client.GetChannelUnread(channel.Id, user.Id) + require.NoError(t, err) // reply post is not counted, so we should have one root mention require.EqualValues(t, int64(1), channelUnread.MentionCountRoot) // regular count stays the same @@ -4240,32 +4436,32 @@ func TestViewChannelWithoutCollapsedThreads(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client user := th.BasicUser team := th.BasicTeam channel := th.BasicChannel // mention the user in a root post - post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) - CheckNoError(t, resp) + post1, _, err := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) + require.NoError(t, err) // mention the user in a reply post post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id} - _, resp = th.SystemAdminClient.CreatePost(post2) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreatePost(post2) + require.NoError(t, err) - threads, resp := Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) - CheckNoError(t, resp) + threads, _, err := client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) + require.NoError(t, err) require.EqualValues(t, int64(1), threads.TotalUnreadMentions) // simulate opening the channel from an old client - _, resp = Client.ViewChannel(user.Id, &model.ChannelView{ + _, _, err = client.ViewChannel(user.Id, &model.ChannelView{ ChannelId: channel.Id, PrevChannelId: "", CollapsedThreadsSupported: false, }) - CheckNoError(t, resp) + require.NoError(t, err) - threads, resp = Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) - CheckNoError(t, resp) + threads, _, err = client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) + require.NoError(t, err) require.Zero(t, threads.TotalUnreadMentions) } diff --git a/api4/cluster_test.go b/api4/cluster_test.go index 8a9181f572..8fe56ebbeb 100644 --- a/api4/cluster_test.go +++ b/api4/cluster_test.go @@ -16,13 +16,14 @@ func TestGetClusterStatus(t *testing.T) { defer th.TearDown() t.Run("as system user", func(t *testing.T) { - _, resp := th.Client.GetClusterStatus() + _, resp, err := th.Client.GetClusterStatus() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - infos, resp := th.SystemAdminClient.GetClusterStatus() - CheckNoError(t, resp) + infos, _, err := th.SystemAdminClient.GetClusterStatus() + require.NoError(t, err) require.NotNil(t, infos, "cluster status should not be nil") }) @@ -30,7 +31,8 @@ func TestGetClusterStatus(t *testing.T) { t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.GetClusterStatus() + _, resp, err := th.SystemAdminClient.GetClusterStatus() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } diff --git a/api4/command_help_test.go b/api4/command_help_test.go index 00d3baaa7c..1f0bf0fbbb 100644 --- a/api4/command_help_test.go +++ b/api4/command_help_test.go @@ -15,7 +15,7 @@ func TestHelpCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel HelpLink := *th.App.Config().SupportSettings.HelpLink @@ -24,12 +24,12 @@ func TestHelpCommand(t *testing.T) { }() th.App.UpdateConfig(func(cfg *model.Config) { *cfg.SupportSettings.HelpLink = "" }) - rs1, _ := Client.ExecuteCommand(channel.Id, "/help ") + rs1, _, _ := client.ExecuteCommand(channel.Id, "/help ") assert.Equal(t, rs1.GotoLocation, model.SupportSettingsDefaultHelpLink, "failed to default help link") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.SupportSettings.HelpLink = "https://docs.mattermost.com/guides/user.html" }) - rs2, _ := Client.ExecuteCommand(channel.Id, "/help ") + rs2, _, _ := client.ExecuteCommand(channel.Id, "/help ") assert.Equal(t, rs2.GotoLocation, "https://docs.mattermost.com/guides/user.html", "failed to help link") } diff --git a/api4/command_test.go b/api4/command_test.go index ea18c3ba1a..f8a5eb12e9 100644 --- a/api4/command_test.go +++ b/api4/command_test.go @@ -21,7 +21,7 @@ import ( func TestCreateCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client LocalClient := th.LocalClient enableCommands := *th.App.Config().ServiceSettings.EnableCommands @@ -37,43 +37,47 @@ func TestCreateCommand(t *testing.T) { Method: model.CommandMethodPost, Trigger: "trigger"} - _, resp := Client.CreateCommand(newCmd) + _, resp, err := client.CreateCommand(newCmd) + require.Error(t, err) CheckForbiddenStatus(t, resp) - createdCmd, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + createdCmd, resp, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, th.SystemAdminUser.Id, createdCmd.CreatorId, "user ids didn't match") require.Equal(t, th.BasicTeam.Id, createdCmd.TeamId, "team ids didn't match") - _, resp = th.SystemAdminClient.CreateCommand(newCmd) + _, resp, err = th.SystemAdminClient.CreateCommand(newCmd) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.command.duplicate_trigger.app_error") + CheckErrorID(t, err, "api.command.duplicate_trigger.app_error") newCmd.Trigger = "Local" - localCreatedCmd, resp := LocalClient.CreateCommand(newCmd) - CheckNoError(t, resp) + localCreatedCmd, resp, err := LocalClient.CreateCommand(newCmd) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, th.BasicUser.Id, localCreatedCmd.CreatorId, "local client: user ids didn't match") require.Equal(t, th.BasicTeam.Id, localCreatedCmd.TeamId, "local client: team ids didn't match") newCmd.Method = "Wrong" newCmd.Trigger = "testcommand" - _, resp = th.SystemAdminClient.CreateCommand(newCmd) + _, resp, err = th.SystemAdminClient.CreateCommand(newCmd) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "model.command.is_valid.method.app_error") + CheckErrorID(t, err, "model.command.is_valid.method.app_error") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCommands = false }) newCmd.Method = "P" newCmd.Trigger = "testcommand" - _, resp = th.SystemAdminClient.CreateCommand(newCmd) + _, resp, err = th.SystemAdminClient.CreateCommand(newCmd) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.command.disabled.app_error") + CheckErrorID(t, err, "api.command.disabled.app_error") // Confirm that local clients can't override disable command setting newCmd.Trigger = "LocalOverride" - _, resp = LocalClient.CreateCommand(newCmd) - CheckErrorMessage(t, resp, "api.command.disabled.app_error") + _, _, err = LocalClient.CreateCommand(newCmd) + CheckErrorID(t, err, "api.command.disabled.app_error") } func TestUpdateCommand(t *testing.T) { @@ -109,8 +113,8 @@ func TestUpdateCommand(t *testing.T) { } th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rcmd, resp := client.UpdateCommand(cmd2) - CheckNoError(t, resp) + rcmd, _, err := client.UpdateCommand(cmd2) + require.NoError(t, err) require.Equal(t, cmd2.Trigger, rcmd.Trigger, "Trigger should have updated") @@ -124,29 +128,34 @@ func TestUpdateCommand(t *testing.T) { cmd2.Id = GenerateTestId() - rcmd, resp = client.UpdateCommand(cmd2) + rcmd, resp, err := client.UpdateCommand(cmd2) + require.Error(t, err) CheckNotFoundStatus(t, resp) require.Nil(t, rcmd, "should be empty") cmd2.Id = "junk" - _, resp = client.UpdateCommand(cmd2) + _, resp, err = client.UpdateCommand(cmd2) + require.Error(t, err) CheckBadRequestStatus(t, resp) cmd2.Id = cmd1.Id cmd2.TeamId = GenerateTestId() - _, resp = client.UpdateCommand(cmd2) + _, resp, err = client.UpdateCommand(cmd2) + require.Error(t, err) CheckBadRequestStatus(t, resp) cmd2.TeamId = team.Id - _, resp = th.Client.UpdateCommand(cmd2) + _, resp, err = th.Client.UpdateCommand(cmd2) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) th.SystemAdminClient.Logout() - _, resp := th.SystemAdminClient.UpdateCommand(cmd2) + _, resp, err := th.SystemAdminClient.UpdateCommand(cmd2) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -173,22 +182,20 @@ func TestMoveCommand(t *testing.T) { rcmd1, _ := th.App.CreateCommand(cmd1) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - - ok, resp := client.MoveCommand(newTeam.Id, rcmd1.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err := client.MoveCommand(newTeam.Id, rcmd1.Id) + require.NoError(t, err) rcmd1, _ = th.App.GetCommand(rcmd1.Id) require.NotNil(t, rcmd1) require.Equal(t, newTeam.Id, rcmd1.TeamId) - ok, resp = client.MoveCommand(newTeam.Id, "bogus") + resp, err := client.MoveCommand(newTeam.Id, "bogus") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok) - ok, resp = client.MoveCommand(GenerateTestId(), rcmd1.Id) + resp, err = client.MoveCommand(GenerateTestId(), rcmd1.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) - require.False(t, ok) }) cmd2 := &model.Command{ CreatorId: user.Id, @@ -200,11 +207,13 @@ func TestMoveCommand(t *testing.T) { rcmd2, _ := th.App.CreateCommand(cmd2) - _, resp := th.Client.MoveCommand(newTeam.Id, rcmd2.Id) + resp, err := th.Client.MoveCommand(newTeam.Id, rcmd2.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.SystemAdminClient.Logout() - _, resp = th.SystemAdminClient.MoveCommand(newTeam.Id, rcmd2.Id) + resp, err = th.SystemAdminClient.MoveCommand(newTeam.Id, rcmd2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -230,22 +239,20 @@ func TestDeleteCommand(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { cmd1.Id = "" - rcmd1, err := th.App.CreateCommand(cmd1) - require.Nil(t, err) - ok, resp := client.DeleteCommand(rcmd1.Id) - CheckNoError(t, resp) - - require.True(t, ok) + rcmd1, appErr := th.App.CreateCommand(cmd1) + require.Nil(t, appErr) + _, err := client.DeleteCommand(rcmd1.Id) + require.NoError(t, err) rcmd1, _ = th.App.GetCommand(rcmd1.Id) require.Nil(t, rcmd1) - ok, resp = client.DeleteCommand("junk") + resp, err := client.DeleteCommand("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok) - - _, resp = client.DeleteCommand(GenerateTestId()) + resp, err = client.DeleteCommand(GenerateTestId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) cmd2 := &model.Command{ @@ -258,18 +265,20 @@ func TestDeleteCommand(t *testing.T) { rcmd2, _ := th.App.CreateCommand(cmd2) - _, resp := th.Client.DeleteCommand(rcmd2.Id) + resp, err := th.Client.DeleteCommand(rcmd2.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.SystemAdminClient.Logout() - _, resp = th.SystemAdminClient.DeleteCommand(rcmd2.Id) + resp, err = th.SystemAdminClient.DeleteCommand(rcmd2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestListCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client enableCommands := *th.App.Config().ServiceSettings.EnableCommands defer func() { @@ -284,12 +293,12 @@ func TestListCommands(t *testing.T) { Method: model.CommandMethodPost, Trigger: "custom_command"} - _, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - listCommands, resp := c.ListCommands(th.BasicTeam.Id, false) - CheckNoError(t, resp) + listCommands, _, err := c.ListCommands(th.BasicTeam.Id, false) + require.NoError(t, err) foundEcho := false foundCustom := false @@ -306,21 +315,22 @@ func TestListCommands(t *testing.T) { }, "ListSystemAndCustomCommands") th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - listCommands, resp := c.ListCommands(th.BasicTeam.Id, true) - CheckNoError(t, resp) + listCommands, _, err := c.ListCommands(th.BasicTeam.Id, true) + require.NoError(t, err) require.Len(t, listCommands, 1, "Should list just one custom command") require.Equal(t, listCommands[0].Trigger, "custom_command", "Wrong custom command trigger") }, "ListCustomOnlyCommands") t.Run("UserWithNoPermissionForCustomCommands", func(t *testing.T) { - _, resp := Client.ListCommands(th.BasicTeam.Id, true) + _, resp, err := client.ListCommands(th.BasicTeam.Id, true) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("RegularUserCanListOnlySystemCommands", func(t *testing.T) { - listCommands, resp := Client.ListCommands(th.BasicTeam.Id, false) - CheckNoError(t, resp) + listCommands, _, err := client.ListCommands(th.BasicTeam.Id, false) + require.NoError(t, err) foundEcho := false foundCustom := false @@ -337,21 +347,25 @@ func TestListCommands(t *testing.T) { }) t.Run("NoMember", func(t *testing.T) { - Client.Logout() + client.Logout() user := th.CreateUser() th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, user.Id) - Client.Login(user.Email, user.Password) - _, resp := Client.ListCommands(th.BasicTeam.Id, false) + client.Login(user.Email, user.Password) + _, resp, err := client.ListCommands(th.BasicTeam.Id, false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.ListCommands(th.BasicTeam.Id, true) + _, resp, err = client.ListCommands(th.BasicTeam.Id, true) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("NotLoggedIn", func(t *testing.T) { - Client.Logout() - _, resp := Client.ListCommands(th.BasicTeam.Id, false) + client.Logout() + _, resp, err := client.ListCommands(th.BasicTeam.Id, false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.ListCommands(th.BasicTeam.Id, true) + _, resp, err = client.ListCommands(th.BasicTeam.Id, true) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -359,7 +373,7 @@ func TestListCommands(t *testing.T) { func TestListAutocompleteCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client newCmd := &model.Command{ CreatorId: th.BasicUser.Id, @@ -368,12 +382,12 @@ func TestListAutocompleteCommands(t *testing.T) { Method: model.CommandMethodPost, Trigger: "custom_command"} - _, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) t.Run("ListAutocompleteCommandsOnly", func(t *testing.T) { - listCommands, resp := th.SystemAdminClient.ListAutocompleteCommands(th.BasicTeam.Id) - CheckNoError(t, resp) + listCommands, _, err := th.SystemAdminClient.ListAutocompleteCommands(th.BasicTeam.Id) + require.NoError(t, err) foundEcho := false foundCustom := false @@ -390,8 +404,8 @@ func TestListAutocompleteCommands(t *testing.T) { }) t.Run("RegularUserCanListOnlySystemCommands", func(t *testing.T) { - listCommands, resp := Client.ListAutocompleteCommands(th.BasicTeam.Id) - CheckNoError(t, resp) + listCommands, _, err := client.ListAutocompleteCommands(th.BasicTeam.Id) + require.NoError(t, err) foundEcho := false foundCustom := false @@ -408,17 +422,19 @@ func TestListAutocompleteCommands(t *testing.T) { }) t.Run("NoMember", func(t *testing.T) { - Client.Logout() + client.Logout() user := th.CreateUser() th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, user.Id) - Client.Login(user.Email, user.Password) - _, resp := Client.ListAutocompleteCommands(th.BasicTeam.Id) + client.Login(user.Email, user.Password) + _, resp, err := client.ListAutocompleteCommands(th.BasicTeam.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("NotLoggedIn", func(t *testing.T) { - Client.Logout() - _, resp := Client.ListAutocompleteCommands(th.BasicTeam.Id) + client.Logout() + _, resp, err := client.ListAutocompleteCommands(th.BasicTeam.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -426,7 +442,7 @@ func TestListAutocompleteCommands(t *testing.T) { func TestListCommandAutocompleteSuggestions(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client newCmd := &model.Command{ CreatorId: th.BasicUser.Id, @@ -435,12 +451,12 @@ func TestListCommandAutocompleteSuggestions(t *testing.T) { Method: model.CommandMethodPost, Trigger: "custom_command"} - _, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) t.Run("ListAutocompleteSuggestionsOnly", func(t *testing.T) { - suggestions, resp := th.SystemAdminClient.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) - CheckNoError(t, resp) + suggestions, _, err := th.SystemAdminClient.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + require.NoError(t, err) foundEcho := false foundShrug := false @@ -462,8 +478,8 @@ func TestListCommandAutocompleteSuggestions(t *testing.T) { }) t.Run("ListAutocompleteSuggestionsOnlyWithInput", func(t *testing.T) { - suggestions, resp := th.SystemAdminClient.ListCommandAutocompleteSuggestions("/e", th.BasicTeam.Id) - CheckNoError(t, resp) + suggestions, _, err := th.SystemAdminClient.ListCommandAutocompleteSuggestions("/e", th.BasicTeam.Id) + require.NoError(t, err) foundEcho := false foundShrug := false @@ -480,8 +496,8 @@ func TestListCommandAutocompleteSuggestions(t *testing.T) { }) t.Run("RegularUserCanListOnlySystemCommands", func(t *testing.T) { - suggestions, resp := Client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) - CheckNoError(t, resp) + suggestions, _, err := client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + require.NoError(t, err) foundEcho := false foundCustom := false @@ -498,17 +514,19 @@ func TestListCommandAutocompleteSuggestions(t *testing.T) { }) t.Run("NoMember", func(t *testing.T) { - Client.Logout() + client.Logout() user := th.CreateUser() th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, user.Id) - Client.Login(user.Email, user.Password) - _, resp := Client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + client.Login(user.Email, user.Password) + _, resp, err := client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("NotLoggedIn", func(t *testing.T) { - Client.Logout() - _, resp := Client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + client.Logout() + _, resp, err := client.ListCommandAutocompleteSuggestions("/", th.BasicTeam.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -530,13 +548,13 @@ func TestGetCommand(t *testing.T) { Method: model.CommandMethodPost, Trigger: "roger"} - newCmd, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + newCmd, _, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { t.Run("ValidId", func(t *testing.T) { - cmd, resp := client.GetCommandById(newCmd.Id) - CheckNoError(t, resp) + cmd, _, err := client.GetCommandById(newCmd.Id) + require.NoError(t, err) require.Equal(t, newCmd.Id, cmd.Id) require.Equal(t, newCmd.CreatorId, cmd.CreatorId) @@ -547,12 +565,13 @@ func TestGetCommand(t *testing.T) { }) t.Run("InvalidId", func(t *testing.T) { - _, resp := client.GetCommandById(strings.Repeat("z", len(newCmd.Id))) - require.NotNil(t, resp.Error) + _, _, err := client.GetCommandById(strings.Repeat("z", len(newCmd.Id))) + require.Error(t, err) }) }) t.Run("UserWithNoPermissionForCustomCommands", func(t *testing.T) { - _, resp := th.Client.GetCommandById(newCmd.Id) + _, resp, err := th.Client.GetCommandById(newCmd.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -561,13 +580,15 @@ func TestGetCommand(t *testing.T) { user := th.CreateUser() th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, user.Id) th.Client.Login(user.Email, user.Password) - _, resp := th.Client.GetCommandById(newCmd.Id) + _, resp, err := th.Client.GetCommandById(newCmd.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) t.Run("NotLoggedIn", func(t *testing.T) { th.Client.Logout() - _, resp := th.Client.GetCommandById(newCmd.Id) + _, resp, err := th.Client.GetCommandById(newCmd.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -575,7 +596,7 @@ func TestGetCommand(t *testing.T) { func TestRegenToken(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client enableCommands := *th.App.Config().ServiceSettings.EnableCommands defer func() { @@ -590,15 +611,16 @@ func TestRegenToken(t *testing.T) { Method: model.CommandMethodPost, Trigger: "trigger"} - createdCmd, resp := th.SystemAdminClient.CreateCommand(newCmd) - CheckNoError(t, resp) + createdCmd, resp, err := th.SystemAdminClient.CreateCommand(newCmd) + require.NoError(t, err) CheckCreatedStatus(t, resp) - token, resp := th.SystemAdminClient.RegenCommandToken(createdCmd.Id) - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.RegenCommandToken(createdCmd.Id) + require.NoError(t, err) require.NotEqual(t, createdCmd.Token, token, "should update the token") - token, resp = Client.RegenCommandToken(createdCmd.Id) + token, resp, err = client.RegenCommandToken(createdCmd.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) require.Empty(t, token, "should not return the token") } @@ -606,7 +628,7 @@ func TestRegenToken(t *testing.T) { func TestExecuteInvalidCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableCommands := *th.App.Config().ServiceSettings.EnableCommands @@ -637,40 +659,46 @@ func TestExecuteInvalidCommand(t *testing.T) { Trigger: "getcommand", } - _, err := th.App.CreateCommand(getCmd) - require.Nil(t, err, "failed to create get command") + _, appErr := th.App.CreateCommand(getCmd) + require.Nil(t, appErr, "failed to create get command") - _, resp := Client.ExecuteCommand(channel.Id, "") + _, resp, err := client.ExecuteCommand(channel.Id, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.ExecuteCommand(channel.Id, "/") + _, resp, err = client.ExecuteCommand(channel.Id, "/") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.ExecuteCommand(channel.Id, "getcommand") + _, resp, err = client.ExecuteCommand(channel.Id, "getcommand") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.ExecuteCommand(channel.Id, "/junk") + _, resp, err = client.ExecuteCommand(channel.Id, "/junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) otherUser := th.CreateUser() - Client.Login(otherUser.Email, otherUser.Password) + client.Login(otherUser.Email, otherUser.Password) - _, resp = Client.ExecuteCommand(channel.Id, "/getcommand") + _, resp, err = client.ExecuteCommand(channel.Id, "/getcommand") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.ExecuteCommand(channel.Id, "/getcommand") + _, resp, err = client.ExecuteCommand(channel.Id, "/getcommand") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.ExecuteCommand(channel.Id, "/getcommand") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.ExecuteCommand(channel.Id, "/getcommand") + require.NoError(t, err) } func TestExecuteGetCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableCommands := *th.App.Config().ServiceSettings.EnableCommands @@ -718,11 +746,11 @@ func TestExecuteGetCommand(t *testing.T) { Token: token, } - _, err := th.App.CreateCommand(getCmd) - require.Nil(t, err, "failed to create get command") + _, appErr := th.App.CreateCommand(getCmd) + require.Nil(t, appErr, "failed to create get command") - commandResponse, resp := Client.ExecuteCommand(channel.Id, "/getcommand") - CheckNoError(t, resp) + commandResponse, _, err := client.ExecuteCommand(channel.Id, "/getcommand") + require.NoError(t, err) assert.True(t, len(commandResponse.TriggerId) == 26) expectedCommandResponse.TriggerId = commandResponse.TriggerId @@ -732,7 +760,7 @@ func TestExecuteGetCommand(t *testing.T) { func TestExecutePostCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableCommands := *th.App.Config().ServiceSettings.EnableCommands @@ -778,11 +806,11 @@ func TestExecutePostCommand(t *testing.T) { Token: token, } - _, err := th.App.CreateCommand(postCmd) - require.Nil(t, err, "failed to create get command") + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create get command") - commandResponse, resp := Client.ExecuteCommand(channel.Id, "/postcommand") - CheckNoError(t, resp) + commandResponse, _, err := client.ExecuteCommand(channel.Id, "/postcommand") + require.NoError(t, err) assert.True(t, len(commandResponse.TriggerId) == 26) expectedCommandResponse.TriggerId = commandResponse.TriggerId @@ -792,7 +820,7 @@ func TestExecutePostCommand(t *testing.T) { func TestExecuteCommandAgainstChannelOnAnotherTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableCommands := *th.App.Config().ServiceSettings.EnableCommands @@ -832,12 +860,13 @@ func TestExecuteCommandAgainstChannelOnAnotherTeam(t *testing.T) { Method: model.CommandMethodPost, Trigger: "postcommand", } - _, err := th.App.CreateCommand(postCmd) - require.Nil(t, err, "failed to create post command") + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create post command") // the execute command endpoint will always search for the command by trigger and team id, inferring team id from the // channel id, so there is no way to use that slash command on a channel that belongs to some other team - _, resp := Client.ExecuteCommand(channel.Id, "/postcommand") + _, resp, err := client.ExecuteCommand(channel.Id, "/postcommand") + require.Error(t, err) CheckNotFoundStatus(t, resp) } @@ -883,16 +912,17 @@ func TestExecuteCommandAgainstChannelUserIsNotIn(t *testing.T) { Method: model.CommandMethodPost, Trigger: "postcommand", } - _, err := th.App.CreateCommand(postCmd) - require.Nil(t, err, "failed to create post command") + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create post command") // make a channel on that team, ensuring that our test user isn't in it channel2 := th.CreateChannelWithClientAndTeam(client, model.ChannelTypeOpen, team2.Id) - success, _ := client.RemoveUserFromChannel(channel2.Id, th.BasicUser.Id) - require.True(t, success, "Failed to remove user from channel") + _, err := th.Client.RemoveUserFromChannel(channel2.Id, th.BasicUser.Id) + require.NoError(t, err, "Failed to remove user from channel") // we should not be able to run the slash command in channel2, because we aren't in it - _, resp := client.ExecuteCommandWithTeam(channel2.Id, team2.Id, "/postcommand") + _, resp, err := client.ExecuteCommandWithTeam(channel2.Id, team2.Id, "/postcommand") + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -941,19 +971,22 @@ func TestExecuteCommandInDirectMessageChannel(t *testing.T) { Method: model.CommandMethodPost, Trigger: "postcommand", } - _, err := th.App.CreateCommand(postCmd) - require.Nil(t, err, "failed to create post command") + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create post command") // make a direct message channel - dmChannel, response := client.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) + dmChannel, response, err := client.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) + require.NoError(t, err) CheckCreatedStatus(t, response) // we should be able to run the slash command in the DM channel - _, resp := client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + _, resp, err := client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + require.NoError(t, err) CheckOKStatus(t, resp) // but we can't run the slash command in the DM channel if we sub in some other team's id - _, resp = client.ExecuteCommandWithTeam(dmChannel.Id, th.BasicTeam.Id, "/postcommand") + _, resp, err = client.ExecuteCommandWithTeam(dmChannel.Id, th.BasicTeam.Id, "/postcommand") + require.Error(t, err) CheckNotFoundStatus(t, resp) } @@ -1005,26 +1038,30 @@ func TestExecuteCommandInTeamUserIsNotOn(t *testing.T) { Method: model.CommandMethodPost, Trigger: "postcommand", } - _, err := th.App.CreateCommand(postCmd) - require.Nil(t, err, "failed to create post command") + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create post command") // make a direct message channel - dmChannel, response := client.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) + dmChannel, response, err := client.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) + require.NoError(t, err) CheckCreatedStatus(t, response) // we should be able to run the slash command in the DM channel - _, resp := client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + _, resp, err := client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + require.NoError(t, err) CheckOKStatus(t, resp) // if the user is removed from the team, they should NOT be able to run the slash command in the DM channel - success, _ := client.RemoveTeamMember(team2.Id, th.BasicUser.Id) - require.True(t, success, "Failed to remove user from team") + _, err = th.Client.RemoveTeamMember(team2.Id, th.BasicUser.Id) + require.NoError(t, err, "Failed to remove user from team") - _, resp = client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + _, resp, err = client.ExecuteCommandWithTeam(dmChannel.Id, team2.Id, "/postcommand") + require.Error(t, err) CheckForbiddenStatus(t, resp) // if we omit the team id from the request, the slash command will fail because this is a DM channel, and the // team id can't be inherited from the channel - _, resp = client.ExecuteCommand(dmChannel.Id, "/postcommand") + _, resp, err = client.ExecuteCommand(dmChannel.Id, "/postcommand") + require.Error(t, err) CheckForbiddenStatus(t, resp) } diff --git a/api4/commands_test.go b/api4/commands_test.go index 6ab3f692d4..24a2c2714d 100644 --- a/api4/commands_test.go +++ b/api4/commands_test.go @@ -18,20 +18,23 @@ func TestEchoCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel1 := th.BasicChannel echoTestString := "/echo test" - r1 := Client.Must(Client.ExecuteCommand(channel1.Id, echoTestString)).(*model.CommandResponse) + r1, _, err := client.ExecuteCommand(channel1.Id, echoTestString) + require.NoError(t, err) require.NotNil(t, r1, "Echo command failed to execute") - r1 = Client.Must(Client.ExecuteCommand(channel1.Id, "/echo ")).(*model.CommandResponse) + r1, _, err = client.ExecuteCommand(channel1.Id, "/echo ") + require.NoError(t, err) require.NotNil(t, r1, "Echo command failed to execute") time.Sleep(100 * time.Millisecond) - p1 := Client.Must(Client.GetPostsForChannel(channel1.Id, 0, 2, "", false)).(*model.PostList) + p1, _, err := client.GetPostsForChannel(channel1.Id, 0, 2, "", false) + require.NoError(t, err) require.Len(t, p1.Order, 2, "Echo command failed to send") } @@ -39,7 +42,7 @@ func TestGroupmsgCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam user1 := th.BasicUser user2 := th.BasicUser2 @@ -53,42 +56,53 @@ func TestGroupmsgCommands(t *testing.T) { th.LinkUserToTeam(user3, team) th.LinkUserToTeam(user4, team) - rs1 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username)).(*model.CommandResponse) + rs1, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username) + require.NoError(t, err) group1 := model.GetGroupNameFromUserIds([]string{user1.Id, user2.Id, user3.Id}) require.True(t, strings.HasSuffix(rs1.GotoLocation, "/"+team.Name+"/channels/"+group1), "failed to create group channel") - rs2 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user3.Username+","+user4.Username+" foobar")).(*model.CommandResponse) + rs2, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user3.Username+","+user4.Username+" foobar") + require.NoError(t, err) group2 := model.GetGroupNameFromUserIds([]string{user1.Id, user3.Id, user4.Id}) require.True(t, strings.HasSuffix(rs2.GotoLocation, "/"+team.Name+"/channels/"+group2), "failed to create second direct channel") - result := Client.Must(Client.SearchPosts(team.Id, "foobar", false)).(*model.PostList) + result, _, err := client.SearchPosts(team.Id, "foobar", false) + require.NoError(t, err) require.NotEqual(t, 0, len(result.Order), "post did not get sent to direct message") - rs3 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username)).(*model.CommandResponse) + rs3, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username) + require.NoError(t, err) require.True(t, strings.HasSuffix(rs3.GotoLocation, "/"+team.Name+"/channels/"+group1), "failed to go back to existing group channel") - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+" foobar")) - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username+","+user4.Username+","+user5.Username+","+user6.Username+","+user7.Username+","+user8.Username+","+user9.Username+" foobar")) - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg junk foobar")) - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg junk,junk2 foobar")) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+" foobar") + require.NoError(t, err) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg "+user2.Username+","+user3.Username+","+user4.Username+","+user5.Username+","+user6.Username+","+user7.Username+","+user8.Username+","+user9.Username+" foobar") + require.NoError(t, err) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg junk foobar") + require.NoError(t, err) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/groupmsg junk,junk2 foobar") + require.NoError(t, err) } func TestInvitePeopleCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel - r1 := Client.Must(Client.ExecuteCommand(channel.Id, "/invite_people test@example.com")).(*model.CommandResponse) + r1, _, err := client.ExecuteCommand(channel.Id, "/invite_people test@example.com") + require.NoError(t, err) require.NotNil(t, r1, "Command failed to execute") - r2 := Client.Must(Client.ExecuteCommand(channel.Id, "/invite_people test1@example.com test2@example.com")).(*model.CommandResponse) + r2, _, err := client.ExecuteCommand(channel.Id, "/invite_people test1@example.com test2@example.com") + require.NoError(t, err) require.NotNil(t, r2, "Command failed to execute") - r3 := Client.Must(Client.ExecuteCommand(channel.Id, "/invite_people")).(*model.CommandResponse) + r3, _, err := client.ExecuteCommand(channel.Id, "/invite_people") + require.NoError(t, err) require.NotNil(t, r3, "Command failed to execute") } @@ -97,30 +111,39 @@ func testJoinCommands(t *testing.T, alias string) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam user2 := th.BasicUser2 channel0 := &model.Channel{DisplayName: "00", Name: "00" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id} - channel0 = Client.Must(Client.CreateChannel(channel0)).(*model.Channel) + channel0, _, err := client.CreateChannel(channel0) + require.NoError(t, err) channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id} - channel1 = Client.Must(Client.CreateChannel(channel1)).(*model.Channel) - Client.Must(Client.RemoveUserFromChannel(channel1.Id, th.BasicUser.Id)) + channel1, _, err = client.CreateChannel(channel1) + require.NoError(t, err) + _, err = client.RemoveUserFromChannel(channel1.Id, th.BasicUser.Id) + require.NoError(t, err) channel2 := &model.Channel{DisplayName: "BB", Name: "bb" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id} - channel2 = Client.Must(Client.CreateChannel(channel2)).(*model.Channel) - Client.Must(Client.RemoveUserFromChannel(channel2.Id, th.BasicUser.Id)) + channel2, _, err = client.CreateChannel(channel2) + require.NoError(t, err) + _, err = client.RemoveUserFromChannel(channel2.Id, th.BasicUser.Id) + require.NoError(t, err) - channel3 := Client.Must(Client.CreateDirectChannel(th.BasicUser.Id, user2.Id)).(*model.Channel) + channel3, _, err := client.CreateDirectChannel(th.BasicUser.Id, user2.Id) + require.NoError(t, err) - rs5 := Client.Must(Client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel2.Name)).(*model.CommandResponse) + rs5, _, err := client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel2.Name) + require.NoError(t, err) require.True(t, strings.HasSuffix(rs5.GotoLocation, "/"+team.Name+"/channels/"+channel2.Name), "failed to join channel") - rs6 := Client.Must(Client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel3.Name)).(*model.CommandResponse) + rs6, _, err := client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel3.Name) + require.NoError(t, err) require.False(t, strings.HasSuffix(rs6.GotoLocation, "/"+team.Name+"/channels/"+channel3.Name), "should not have joined direct message channel") - c1 := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")).([]*model.Channel) + c1, _, err := client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) found := false for _, c := range c1 { @@ -132,9 +155,12 @@ func testJoinCommands(t *testing.T, alias string) { // test case insensitively channel4 := &model.Channel{DisplayName: "BB", Name: "bb" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id} - channel4 = Client.Must(Client.CreateChannel(channel4)).(*model.Channel) - Client.Must(Client.RemoveUserFromChannel(channel4.Id, th.BasicUser.Id)) - rs7 := Client.Must(Client.ExecuteCommand(channel0.Id, "/"+alias+" "+strings.ToUpper(channel4.Name))).(*model.CommandResponse) + channel4, _, err = client.CreateChannel(channel4) + require.NoError(t, err) + _, err = client.RemoveUserFromChannel(channel4.Id, th.BasicUser.Id) + require.NoError(t, err) + rs7, _, err := client.ExecuteCommand(channel0.Id, "/"+alias+" "+strings.ToUpper(channel4.Name)) + require.NoError(t, err) require.True(t, strings.HasSuffix(rs7.GotoLocation, "/"+team.Name+"/channels/"+channel4.Name), "failed to join channel") } @@ -146,7 +172,7 @@ func TestLoadTestHelpCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableTesting := *th.App.Config().ServiceSettings.EnableTesting @@ -156,7 +182,8 @@ func TestLoadTestHelpCommands(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableTesting = true }) - rs := Client.Must(Client.ExecuteCommand(channel.Id, "/test help")).(*model.CommandResponse) + rs, _, err := client.ExecuteCommand(channel.Id, "/test help") + require.NoError(t, err) require.True(t, strings.Contains(rs.Text, "Mattermost testing commands to help"), rs.Text) time.Sleep(2 * time.Second) @@ -166,7 +193,7 @@ func TestLoadTestSetupCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableTesting := *th.App.Config().ServiceSettings.EnableTesting @@ -176,7 +203,8 @@ func TestLoadTestSetupCommands(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableTesting = true }) - rs := Client.Must(Client.ExecuteCommand(channel.Id, "/test setup fuzz 1 1 1")).(*model.CommandResponse) + rs, _, err := client.ExecuteCommand(channel.Id, "/test setup fuzz 1 1 1") + require.NoError(t, err) require.Equal(t, "Created environment", rs.Text, rs.Text) time.Sleep(2 * time.Second) @@ -186,7 +214,7 @@ func TestLoadTestUsersCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableTesting := *th.App.Config().ServiceSettings.EnableTesting @@ -196,7 +224,8 @@ func TestLoadTestUsersCommands(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableTesting = true }) - rs := Client.Must(Client.ExecuteCommand(channel.Id, "/test users fuzz 1 2")).(*model.CommandResponse) + rs, _, err := client.ExecuteCommand(channel.Id, "/test users fuzz 1 2") + require.NoError(t, err) require.Equal(t, "Added users", rs.Text, rs.Text) time.Sleep(2 * time.Second) @@ -206,7 +235,7 @@ func TestLoadTestChannelsCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableTesting := *th.App.Config().ServiceSettings.EnableTesting @@ -216,7 +245,8 @@ func TestLoadTestChannelsCommands(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableTesting = true }) - rs := Client.Must(Client.ExecuteCommand(channel.Id, "/test channels fuzz 1 2")).(*model.CommandResponse) + rs, _, err := client.ExecuteCommand(channel.Id, "/test channels fuzz 1 2") + require.NoError(t, err) require.Equal(t, "Added channels", rs.Text, rs.Text) time.Sleep(2 * time.Second) @@ -226,7 +256,7 @@ func TestLoadTestPostsCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel enableTesting := *th.App.Config().ServiceSettings.EnableTesting @@ -236,7 +266,8 @@ func TestLoadTestPostsCommands(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableTesting = true }) - rs := Client.Must(Client.ExecuteCommand(channel.Id, "/test posts fuzz 2 3 2")).(*model.CommandResponse) + rs, _, err := client.ExecuteCommand(channel.Id, "/test posts fuzz 2 3 2") + require.NoError(t, err) require.Equal(t, "Added posts", rs.Text, rs.Text) time.Sleep(2 * time.Second) @@ -246,31 +277,40 @@ func TestLeaveCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam user2 := th.BasicUser2 channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.ChannelTypeOpen, TeamId: team.Id} - channel1 = Client.Must(Client.CreateChannel(channel1)).(*model.Channel) - Client.Must(Client.AddChannelMember(channel1.Id, th.BasicUser.Id)) + channel1, _, err := client.CreateChannel(channel1) + require.NoError(t, err) + _, _, err = client.AddChannelMember(channel1.Id, th.BasicUser.Id) + require.NoError(t, err) channel2 := &model.Channel{DisplayName: "BB", Name: "bb" + model.NewId() + "a", Type: model.ChannelTypePrivate, TeamId: team.Id} - channel2 = Client.Must(Client.CreateChannel(channel2)).(*model.Channel) - Client.Must(Client.AddChannelMember(channel2.Id, th.BasicUser.Id)) - Client.Must(Client.AddChannelMember(channel2.Id, user2.Id)) + channel2, _, err = client.CreateChannel(channel2) + require.NoError(t, err) + _, _, err = client.AddChannelMember(channel2.Id, th.BasicUser.Id) + require.NoError(t, err) + _, _, err = client.AddChannelMember(channel2.Id, user2.Id) + require.NoError(t, err) - channel3 := Client.Must(Client.CreateDirectChannel(th.BasicUser.Id, user2.Id)).(*model.Channel) + channel3, _, err := client.CreateDirectChannel(th.BasicUser.Id, user2.Id) + require.NoError(t, err) - rs1 := Client.Must(Client.ExecuteCommand(channel1.Id, "/leave")).(*model.CommandResponse) + rs1, _, err := client.ExecuteCommand(channel1.Id, "/leave") + require.NoError(t, err) require.True(t, strings.HasSuffix(rs1.GotoLocation, "/"+team.Name+"/channels/"+model.DefaultChannelName), "failed to leave open channel 1") - rs2 := Client.Must(Client.ExecuteCommand(channel2.Id, "/leave")).(*model.CommandResponse) + rs2, _, err := client.ExecuteCommand(channel2.Id, "/leave") + require.NoError(t, err) require.True(t, strings.HasSuffix(rs2.GotoLocation, "/"+team.Name+"/channels/"+model.DefaultChannelName), "failed to leave private channel 1") - _, err := Client.ExecuteCommand(channel3.Id, "/leave") - require.NotNil(t, err, "should fail leaving direct channel") + _, _, err = client.ExecuteCommand(channel3.Id, "/leave") + require.Error(t, err) - cdata := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")).([]*model.Channel) + cdata, _, err := client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + require.NoError(t, err) found := false for _, c := range cdata { @@ -282,8 +322,8 @@ func TestLeaveCommands(t *testing.T) { for _, c := range cdata { if c.Name == model.DefaultChannelName { - _, err := Client.RemoveUserFromChannel(c.Id, th.BasicUser.Id) - require.NotNil(t, err, "should have errored on leaving default channel") + _, err := client.RemoveUserFromChannel(c.Id, th.BasicUser.Id) + require.Error(t, err, "should have errored on leaving default channel") break } } @@ -293,24 +333,27 @@ func TestLogoutTestCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - th.Client.Must(th.Client.ExecuteCommand(th.BasicChannel.Id, "/logout")) + _, _, err := th.Client.ExecuteCommand(th.BasicChannel.Id, "/logout") + require.NoError(t, err) } func TestMeCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel testString := "/me hello" - r1 := Client.Must(Client.ExecuteCommand(channel.Id, testString)).(*model.CommandResponse) + r1, _, err := client.ExecuteCommand(channel.Id, testString) + require.NoError(t, err) require.NotNil(t, r1, "Command failed to execute") time.Sleep(100 * time.Millisecond) - p1 := Client.Must(Client.GetPostsForChannel(channel.Id, 0, 2, "", false)).(*model.PostList) + p1, _, err := client.GetPostsForChannel(channel.Id, 0, 2, "", false) + require.NoError(t, err) require.Len(t, p1.Order, 2, "Command failed to send") pt := p1.Posts[p1.Order[0]].Type @@ -325,39 +368,47 @@ func TestMsgCommands(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam user1 := th.BasicUser user2 := th.BasicUser2 user3 := th.CreateUser() th.LinkUserToTeam(user3, team) - Client.Must(Client.CreateDirectChannel(th.BasicUser.Id, user2.Id)) - Client.Must(Client.CreateDirectChannel(th.BasicUser.Id, user3.Id)) + _, _, err := client.CreateDirectChannel(th.BasicUser.Id, user2.Id) + require.NoError(t, err) + _, _, err = client.CreateDirectChannel(th.BasicUser.Id, user3.Id) + require.NoError(t, err) - rs1 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user2.Username)).(*model.CommandResponse) + rs1, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user2.Username) + require.NoError(t, err) require.Condition(t, func() bool { return strings.HasSuffix(rs1.GotoLocation, "/"+team.Name+"/channels/"+user1.Id+"__"+user2.Id) || strings.HasSuffix(rs1.GotoLocation, "/"+team.Name+"/channels/"+user2.Id+"__"+user1.Id) }, "failed to create direct channel") - rs2 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user3.Username+" foobar")).(*model.CommandResponse) + rs2, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user3.Username+" foobar") + require.NoError(t, err) require.Condition(t, func() bool { return strings.HasSuffix(rs2.GotoLocation, "/"+team.Name+"/channels/"+user1.Id+"__"+user3.Id) || strings.HasSuffix(rs2.GotoLocation, "/"+team.Name+"/channels/"+user3.Id+"__"+user1.Id) }, "failed to create second direct channel") - result := Client.Must(Client.SearchPosts(th.BasicTeam.Id, "foobar", false)).(*model.PostList) + result, _, err := client.SearchPosts(th.BasicTeam.Id, "foobar", false) + require.NoError(t, err) require.NotEqual(t, 0, len(result.Order), "post did not get sent to direct message") - rs3 := Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user2.Username)).(*model.CommandResponse) + rs3, _, err := client.ExecuteCommand(th.BasicChannel.Id, "/msg "+user2.Username) + require.NoError(t, err) require.Condition(t, func() bool { return strings.HasSuffix(rs3.GotoLocation, "/"+team.Name+"/channels/"+user1.Id+"__"+user2.Id) || strings.HasSuffix(rs3.GotoLocation, "/"+team.Name+"/channels/"+user2.Id+"__"+user1.Id) }, "failed to go back to existing direct channel") - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/msg "+th.BasicUser.Username+" foobar")) - Client.Must(Client.ExecuteCommand(th.BasicChannel.Id, "/msg junk foobar")) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/msg "+th.BasicUser.Username+" foobar") + require.NoError(t, err) + _, _, err = client.ExecuteCommand(th.BasicChannel.Id, "/msg junk foobar") + require.NoError(t, err) } func TestOpenCommands(t *testing.T) { @@ -368,38 +419,43 @@ func TestSearchCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - th.Client.Must(th.Client.ExecuteCommand(th.BasicChannel.Id, "/search")) + _, _, err := th.Client.ExecuteCommand(th.BasicChannel.Id, "/search") + require.NoError(t, err) } func TestSettingsCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - th.Client.Must(th.Client.ExecuteCommand(th.BasicChannel.Id, "/settings")) + _, _, err := th.Client.ExecuteCommand(th.BasicChannel.Id, "/settings") + require.NoError(t, err) } func TestShortcutsCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - th.Client.Must(th.Client.ExecuteCommand(th.BasicChannel.Id, "/shortcuts")) + _, _, err := th.Client.ExecuteCommand(th.BasicChannel.Id, "/shortcuts") + require.NoError(t, err) } func TestShrugCommand(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel testString := "/shrug" - r1 := Client.Must(Client.ExecuteCommand(channel.Id, testString)).(*model.CommandResponse) + r1, _, err := client.ExecuteCommand(channel.Id, testString) + require.NoError(t, err) require.NotNil(t, r1, "Command failed to execute") time.Sleep(100 * time.Millisecond) - p1 := Client.Must(Client.GetPostsForChannel(channel.Id, 0, 2, "", false)).(*model.PostList) + p1, _, err := client.GetPostsForChannel(channel.Id, 0, 2, "", false) + require.NoError(t, err) require.Len(t, p1.Order, 2, "Command failed to send") require.Equal(t, `¯\\\_(ツ)\_/¯`, p1.Posts[p1.Order[0]].Message, "invalid shrug response") } @@ -414,15 +470,17 @@ func TestStatusCommands(t *testing.T) { } func commandAndTest(t *testing.T, th *TestHelper, status string) { - Client := th.Client + client := th.Client channel := th.BasicChannel user := th.BasicUser - r1 := Client.Must(Client.ExecuteCommand(channel.Id, "/"+status)).(*model.CommandResponse) + r1, _, err := client.ExecuteCommand(channel.Id, "/"+status) + require.NoError(t, err) require.NotEqual(t, "Command failed to execute", r1) time.Sleep(1000 * time.Millisecond) - rstatus := Client.Must(Client.GetUserStatus(user.Id, "")).(*model.Status) + rstatus, _, err := client.GetUserStatus(user.Id, "") + require.NoError(t, err) require.Equal(t, status, rstatus.Status, "Error setting status") } diff --git a/api4/config_test.go b/api4/config_test.go index 08b64cf375..911a4d958c 100644 --- a/api4/config_test.go +++ b/api4/config_test.go @@ -23,14 +23,15 @@ import ( func TestGetConfig(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - _, resp := Client.GetConfig() + _, resp, err := client.GetConfig() + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - cfg, resp := client.GetConfig() - CheckNoError(t, resp) + cfg, _, err := client.GetConfig() + require.NoError(t, err) require.NotEqual(t, "", cfg.TeamSettings.SiteName) @@ -77,8 +78,8 @@ func TestGetConfigWithAccessTag(t *testing.T) { th.AddPermissionToRole(model.PermissionSysconsoleReadEnvironmentRateLimiting.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionSysconsoleReadEnvironmentRateLimiting.Id, model.SystemUserRoleId) - cfg, resp := th.Client.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.Client.GetConfig() + require.NoError(t, err) t.Run("Cannot read value without permission", func(t *testing.T) { assert.Nil(t, cfg.SupportSettings.SupportEmail) @@ -98,7 +99,7 @@ func TestGetConfigAnyFlagsAccess(t *testing.T) { defer th.TearDown() th.Client.Login(th.BasicUser.Username, th.BasicUser.Password) - _, resp := th.Client.GetConfig() + _, resp, _ := th.Client.GetConfig() t.Run("Check permissions error with no sysconsole read permission", func(t *testing.T) { CheckForbiddenStatus(t, resp) @@ -108,8 +109,8 @@ func TestGetConfigAnyFlagsAccess(t *testing.T) { th.AddPermissionToRole(model.PermissionSysconsoleReadEnvironmentRateLimiting.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionSysconsoleReadEnvironmentRateLimiting.Id, model.SystemUserRoleId) - cfg, resp := th.Client.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.Client.GetConfig() + require.NoError(t, err) t.Run("Can read value with permission", func(t *testing.T) { assert.NotNil(t, cfg.FeatureFlags) }) @@ -118,59 +119,59 @@ func TestGetConfigAnyFlagsAccess(t *testing.T) { func TestReloadConfig(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client t.Run("as system user", func(t *testing.T) { - ok, resp := Client.ReloadConfig() + resp, err := client.ReloadConfig() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not Reload the config due no permission.") }) t.Run("as system admin", func(t *testing.T) { - ok, resp := th.SystemAdminClient.ReloadConfig() - CheckNoError(t, resp) - require.True(t, ok, "should Reload the config") + _, err := th.SystemAdminClient.ReloadConfig() + require.NoError(t, err) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := Client.ReloadConfig() + resp, err := client.ReloadConfig() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not Reload the config due no permission.") }) } func TestUpdateConfig(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) - _, resp = Client.UpdateConfig(cfg) + _, resp, err := client.UpdateConfig(cfg) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { SiteName := th.App.Config().TeamSettings.SiteName *cfg.TeamSettings.SiteName = "MyFancyName" - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) require.Equal(t, "MyFancyName", *cfg.TeamSettings.SiteName, "It should update the SiteName") //Revert the change cfg.TeamSettings.SiteName = SiteName - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) require.Equal(t, SiteName, cfg.TeamSettings.SiteName, "It should update the SiteName") t.Run("Should set defaults for missing fields", func(t *testing.T) { - _, appErr := th.SystemAdminClient.DoApiPut(th.SystemAdminClient.GetConfigRoute(), "{}") - require.Nil(t, appErr) + _, err = th.SystemAdminClient.DoApiPut(th.SystemAdminClient.GetConfigRoute(), "{}") + require.NoError(t, err) }) t.Run("Should fail with validation error if invalid config setting is passed", func(t *testing.T) { @@ -178,23 +179,24 @@ func TestUpdateConfig(t *testing.T) { badcfg := cfg.Clone() badcfg.PasswordSettings.MinimumLength = model.NewInt(4) badcfg.PasswordSettings.MinimumLength = model.NewInt(4) - _, resp = client.UpdateConfig(badcfg) + _, resp, err = client.UpdateConfig(badcfg) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "model.config.is_valid.password_length.app_error") + CheckErrorID(t, err, "model.config.is_valid.password_length.app_error") }) t.Run("Should not be able to modify PluginSettings.EnableUploads", func(t *testing.T) { oldEnableUploads := *th.App.Config().PluginSettings.EnableUploads *cfg.PluginSettings.EnableUploads = !oldEnableUploads - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) assert.Equal(t, oldEnableUploads, *cfg.PluginSettings.EnableUploads) assert.Equal(t, oldEnableUploads, *th.App.Config().PluginSettings.EnableUploads) cfg.PluginSettings.EnableUploads = nil - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) assert.Equal(t, oldEnableUploads, *cfg.PluginSettings.EnableUploads) assert.Equal(t, oldEnableUploads, *th.App.Config().PluginSettings.EnableUploads) }) @@ -203,14 +205,14 @@ func TestUpdateConfig(t *testing.T) { oldPublicKeys := th.App.Config().PluginSettings.SignaturePublicKeyFiles cfg.PluginSettings.SignaturePublicKeyFiles = append(cfg.PluginSettings.SignaturePublicKeyFiles, "new_signature") - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) assert.Equal(t, oldPublicKeys, cfg.PluginSettings.SignaturePublicKeyFiles) assert.Equal(t, oldPublicKeys, th.App.Config().PluginSettings.SignaturePublicKeyFiles) cfg.PluginSettings.SignaturePublicKeyFiles = nil - cfg, resp = client.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = client.UpdateConfig(cfg) + require.NoError(t, err) assert.Equal(t, oldPublicKeys, cfg.PluginSettings.SignaturePublicKeyFiles) assert.Equal(t, oldPublicKeys, th.App.Config().PluginSettings.SignaturePublicKeyFiles) }) @@ -224,18 +226,19 @@ func TestUpdateConfig(t *testing.T) { cfg.ServiceSettings.SiteURL = &nonEmptyURL // Set the SiteURL - cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) require.Equal(t, nonEmptyURL, *cfg.ServiceSettings.SiteURL) // Check that the Site URL can't be cleared cfg.ServiceSettings.SiteURL = sToP("") - cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) + cfg, resp, err = th.SystemAdminClient.UpdateConfig(cfg) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.config.update_config.clear_siteurl.app_error") + CheckErrorID(t, err, "api.config.update_config.clear_siteurl.app_error") // Check that the Site URL wasn't cleared - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) require.Equal(t, nonEmptyURL, *cfg.ServiceSettings.SiteURL) }) } @@ -247,15 +250,15 @@ func TestGetConfigWithoutManageSystemPermission(t *testing.T) { t.Run("any sysconsole read permission provides config read access", func(t *testing.T) { // forbidden by default - _, resp := th.Client.GetConfig() + _, resp, err := th.Client.GetConfig() + require.Error(t, err) CheckForbiddenStatus(t, resp) // add any sysconsole read permission th.AddPermissionToRole(model.SysconsoleReadPermissions[0].Id, model.SystemUserRoleId) - _, resp = th.Client.GetConfig() - + _, _, err = th.Client.GetConfig() // should be readable now - CheckNoError(t, resp) + require.NoError(t, err) }) } @@ -270,18 +273,18 @@ func TestUpdateConfigWithoutManageSystemPermission(t *testing.T) { t.Run("sysconsole read permission does not provides config write access", func(t *testing.T) { // should be readable because has a sysconsole read permission - cfg, resp := th.Client.GetConfig() - CheckNoError(t, resp) - - _, resp = th.Client.UpdateConfig(cfg) + cfg, _, err := th.Client.GetConfig() + require.NoError(t, err) + _, resp, err := th.Client.UpdateConfig(cfg) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("the wrong write permission does not grant access", func(t *testing.T) { // should be readable because has a sysconsole read permission - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) originalValue := *cfg.ServiceSettings.AllowCorsFrom @@ -292,19 +295,19 @@ func TestUpdateConfigWithoutManageSystemPermission(t *testing.T) { // try update a config value allowed by sysconsole WRITE integrations mockVal := model.NewId() cfg.ServiceSettings.AllowCorsFrom = &mockVal - _, resp = th.Client.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.Client.UpdateConfig(cfg) + require.NoError(t, err) // ensure the config setting was not updated - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) assert.Equal(t, *cfg.ServiceSettings.AllowCorsFrom, originalValue) }) t.Run("config value is writeable by specific system console permission", func(t *testing.T) { // should be readable because has a sysconsole read permission - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) th.AddPermissionToRole(model.PermissionSysconsoleWriteIntegrationsCors.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionSysconsoleWriteIntegrationsCors.Id, model.SystemUserRoleId) @@ -314,12 +317,12 @@ func TestUpdateConfigWithoutManageSystemPermission(t *testing.T) { // try update a config value allowed by sysconsole WRITE integrations mockVal := model.NewId() cfg.ServiceSettings.AllowCorsFrom = &mockVal - _, resp = th.Client.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.Client.UpdateConfig(cfg) + require.NoError(t, err) // ensure the config setting was updated - cfg, resp = th.Client.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.Client.GetConfig() + require.NoError(t, err) assert.Equal(t, *cfg.ServiceSettings.AllowCorsFrom, mockVal) }) } @@ -342,23 +345,23 @@ func TestUpdateConfigMessageExportSpecialHandling(t *testing.T) { }) // Turn it on, timestamp should be updated. - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) *cfg.MessageExportSettings.EnableExport = true - _, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) assert.True(t, *th.App.Config().MessageExportSettings.EnableExport) assert.NotEqual(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) // Turn it off, timestamp should be cleared. - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) *cfg.MessageExportSettings.EnableExport = false - _, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) assert.False(t, *th.App.Config().MessageExportSettings.EnableExport) assert.Equal(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) @@ -370,23 +373,23 @@ func TestUpdateConfigMessageExportSpecialHandling(t *testing.T) { }) // Turn it on, timestamp should *not* be updated. - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) *cfg.MessageExportSettings.EnableExport = true - _, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) assert.True(t, *th.App.Config().MessageExportSettings.EnableExport) assert.Equal(t, int64(12345), *th.App.Config().MessageExportSettings.ExportFromTimestamp) // Turn it off, timestamp should be cleared. - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) *cfg.MessageExportSettings.EnableExport = false - _, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) assert.False(t, *th.App.Config().MessageExportSettings.EnableExport) assert.Equal(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) @@ -398,35 +401,35 @@ func TestUpdateConfigRestrictSystemAdmin(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) t.Run("Restrict flag should be honored for sysadmin", func(t *testing.T) { - originalCfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + originalCfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) cfg := originalCfg.Clone() *cfg.TeamSettings.SiteName = "MyFancyName" // Allowed *cfg.ServiceSettings.SiteURL = "http://example.com" // Ignored - returnedCfg, resp := th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + returnedCfg, _, err := th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) require.Equal(t, "MyFancyName", *returnedCfg.TeamSettings.SiteName) require.Equal(t, *originalCfg.ServiceSettings.SiteURL, *returnedCfg.ServiceSettings.SiteURL) - actualCfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + actualCfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) require.Equal(t, returnedCfg, actualCfg) }) t.Run("Restrict flag should be ignored by local mode", func(t *testing.T) { - originalCfg, resp := th.LocalClient.GetConfig() - CheckNoError(t, resp) + originalCfg, _, err := th.LocalClient.GetConfig() + require.NoError(t, err) cfg := originalCfg.Clone() *cfg.TeamSettings.SiteName = "MyFancyName" // Allowed *cfg.ServiceSettings.SiteURL = "http://example.com" // Ignored - returnedCfg, resp := th.LocalClient.UpdateConfig(cfg) - CheckNoError(t, resp) + returnedCfg, _, err := th.LocalClient.UpdateConfig(cfg) + require.NoError(t, err) require.Equal(t, "MyFancyName", *returnedCfg.TeamSettings.SiteName) require.Equal(t, "http://example.com", *returnedCfg.ServiceSettings.SiteURL) @@ -452,13 +455,13 @@ func TestUpdateConfigDiffInAuditRecord(t *testing.T) { th := SetupWithServerOptions(t, options) defer th.TearDown() - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) timeoutVal := *cfg.ServiceSettings.ReadTimeout cfg.ServiceSettings.ReadTimeout = model.NewInt(timeoutVal + 1) - cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.UpdateConfig(cfg) + require.NoError(t, err) defer th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.ReadTimeout = model.NewInt(timeoutVal) }) @@ -490,8 +493,8 @@ func TestGetEnvironmentConfig(t *testing.T) { t.Run("as system admin", func(t *testing.T) { SystemAdminClient := th.SystemAdminClient - envConfig, resp := SystemAdminClient.GetEnvironmentConfig() - CheckNoError(t, resp) + envConfig, _, err := SystemAdminClient.GetEnvironmentConfig() + require.NoError(t, err) serviceSettings, ok := envConfig["ServiceSettings"] require.True(t, ok, "should've returned ServiceSettings") @@ -521,23 +524,24 @@ func TestGetEnvironmentConfig(t *testing.T) { TeamAdminClient := th.CreateClient() th.LoginTeamAdminWithClient(TeamAdminClient) - envConfig, resp := TeamAdminClient.GetEnvironmentConfig() - CheckNoError(t, resp) + envConfig, _, err := TeamAdminClient.GetEnvironmentConfig() + require.NoError(t, err) require.Empty(t, envConfig) }) t.Run("as regular user", func(t *testing.T) { - Client := th.Client + client := th.Client - envConfig, resp := Client.GetEnvironmentConfig() - CheckNoError(t, resp) + envConfig, _, err := client.GetEnvironmentConfig() + require.NoError(t, err) require.Empty(t, envConfig) }) t.Run("as not-regular user", func(t *testing.T) { - Client := th.CreateClient() + client := th.CreateClient() - _, resp := Client.GetEnvironmentConfig() + _, resp, err := client.GetEnvironmentConfig() + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -554,10 +558,10 @@ func TestGetOldClientConfig(t *testing.T) { *cfg.ServiceSettings.GoogleDeveloperKey = testKey }) - Client := th.Client + client := th.Client - config, resp := Client.GetOldClientConfig("") - CheckNoError(t, resp) + config, _, err := client.GetOldClientConfig("") + require.NoError(t, err) require.NotEmpty(t, config["Version"], "config not returned correctly") require.Equal(t, testKey, config["GoogleDeveloperKey"]) @@ -568,29 +572,29 @@ func TestGetOldClientConfig(t *testing.T) { *cfg.ServiceSettings.GoogleDeveloperKey = testKey }) - Client := th.CreateClient() + client := th.CreateClient() - config, resp := Client.GetOldClientConfig("") - CheckNoError(t, resp) + config, _, err := client.GetOldClientConfig("") + require.NoError(t, err) require.NotEmpty(t, config["Version"], "config not returned correctly") require.Empty(t, config["GoogleDeveloperKey"], "config should be missing developer key") }) t.Run("missing format", func(t *testing.T) { - Client := th.Client + client := th.Client - _, err := Client.DoApiGet("/config/client", "") - require.NotNil(t, err) - require.Equal(t, http.StatusNotImplemented, err.StatusCode) + resp, err := client.DoApiGet("/config/client", "") + require.Error(t, err) + require.Equal(t, http.StatusNotImplemented, resp.StatusCode) }) t.Run("invalid format", func(t *testing.T) { - Client := th.Client + client := th.Client - _, err := Client.DoApiGet("/config/client?format=junk", "") - require.NotNil(t, err) - require.Equal(t, http.StatusBadRequest, err.StatusCode) + resp, err := client.DoApiGet("/config/client?format=junk", "") + require.Error(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) }) } @@ -599,12 +603,14 @@ func TestPatchConfig(t *testing.T) { defer th.TearDown() t.Run("config is missing", func(t *testing.T) { - _, response := th.Client.PatchConfig(nil) + _, response, err := th.Client.PatchConfig(nil) + require.Error(t, err) CheckBadRequestStatus(t, response) }) t.Run("user is not system admin", func(t *testing.T) { - _, response := th.Client.PatchConfig(&model.Config{}) + _, response, err := th.Client.PatchConfig(&model.Config{}) + require.Error(t, err) CheckForbiddenStatus(t, response) }) @@ -615,7 +621,7 @@ func TestPatchConfig(t *testing.T) { ConsoleLevel: model.NewString("INFO"), }} - updatedConfig, _ := th.SystemAdminClient.PatchConfig(&config) + updatedConfig, _, _ := th.SystemAdminClient.PatchConfig(&config) assert.Equal(t, "DEBUG", *updatedConfig.LogSettings.ConsoleLevel) }) @@ -627,13 +633,13 @@ func TestPatchConfig(t *testing.T) { ConsoleLevel: model.NewString("INFO"), }} - oldConfig, _ := th.LocalClient.GetConfig() - updatedConfig, _ := th.LocalClient.PatchConfig(&config) + oldConfig, _, _ := th.LocalClient.GetConfig() + updatedConfig, _, _ := th.LocalClient.PatchConfig(&config) assert.Equal(t, "INFO", *updatedConfig.LogSettings.ConsoleLevel) // reset the config - _, resp := th.LocalClient.UpdateConfig(oldConfig) - CheckNoError(t, resp) + _, _, err := th.LocalClient.UpdateConfig(oldConfig) + require.NoError(t, err) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { @@ -642,18 +648,19 @@ func TestPatchConfig(t *testing.T) { MinimumLength: model.NewInt(4), }} - _, response := client.PatchConfig(&config) + _, response, err := client.PatchConfig(&config) assert.Equal(t, http.StatusBadRequest, response.StatusCode) - assert.NotNil(t, response.Error) - assert.Equal(t, "model.config.is_valid.password_length.app_error", response.Error.Id) + assert.Error(t, err) + CheckErrorID(t, err, "model.config.is_valid.password_length.app_error") }) t.Run("should patch the config", func(t *testing.T) { *th.App.Config().ExperimentalSettings.RestrictSystemAdmin = false th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.ExperimentalDefaultChannels = []string{"some-channel"} }) - oldConfig, _ := client.GetConfig() + oldConfig, _, err := client.GetConfig() + require.NoError(t, err) assert.False(t, *oldConfig.PasswordSettings.Lowercase) assert.NotEqual(t, 15, *oldConfig.PasswordSettings.MinimumLength) @@ -676,9 +683,11 @@ func TestPatchConfig(t *testing.T) { }, } - _, response := client.PatchConfig(&config) + _, response, err := client.PatchConfig(&config) + require.NoError(t, err) - updatedConfig, _ := client.GetConfig() + updatedConfig, _, err := client.GetConfig() + require.NoError(t, err) assert.True(t, *updatedConfig.PasswordSettings.Lowercase) assert.Equal(t, "INFO", *updatedConfig.LogSettings.ConsoleLevel) assert.Equal(t, []string{"another-channel"}, updatedConfig.TeamSettings.ExperimentalDefaultChannels) @@ -686,8 +695,8 @@ func TestPatchConfig(t *testing.T) { assert.Equal(t, "no-cache, no-store, must-revalidate", response.Header.Get("Cache-Control")) // reset the config - _, resp := client.UpdateConfig(oldConfig) - CheckNoError(t, resp) + _, _, err = client.UpdateConfig(oldConfig) + require.NoError(t, err) }) t.Run("should sanitize config", func(t *testing.T) { @@ -695,7 +704,8 @@ func TestPatchConfig(t *testing.T) { Symbol: model.NewBool(true), }} - updatedConfig, _ := client.PatchConfig(&config) + updatedConfig, _, err := client.PatchConfig(&config) + require.NoError(t, err) assert.Equal(t, model.FakeSetting, *updatedConfig.SqlSettings.DataSource) }) @@ -705,19 +715,21 @@ func TestPatchConfig(t *testing.T) { EnableUploads: model.NewBool(true), }} - updatedConfig, resp := client.PatchConfig(&config) + updatedConfig, resp, err := client.PatchConfig(&config) if client == th.LocalClient { + require.NoError(t, err) CheckOKStatus(t, resp) assert.Equal(t, true, *updatedConfig.PluginSettings.EnableUploads) } else { + require.Error(t, err) CheckForbiddenStatus(t, resp) } }) }) t.Run("System Admin should not be able to clear Site URL", func(t *testing.T) { - cfg, resp := th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err := th.SystemAdminClient.GetConfig() + require.NoError(t, err) siteURL := cfg.ServiceSettings.SiteURL defer th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.SiteURL = siteURL }) @@ -728,8 +740,8 @@ func TestPatchConfig(t *testing.T) { SiteURL: model.NewString(nonEmptyURL), }, } - updatedConfig, resp := th.SystemAdminClient.PatchConfig(&config) - CheckNoError(t, resp) + updatedConfig, _, err := th.SystemAdminClient.PatchConfig(&config) + require.NoError(t, err) require.Equal(t, nonEmptyURL, *updatedConfig.ServiceSettings.SiteURL) // Check that the Site URL can't be cleared @@ -738,18 +750,19 @@ func TestPatchConfig(t *testing.T) { SiteURL: model.NewString(""), }, } - _, resp = th.SystemAdminClient.PatchConfig(&config) + _, resp, err := th.SystemAdminClient.PatchConfig(&config) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.config.update_config.clear_siteurl.app_error") + CheckErrorID(t, err, "api.config.update_config.clear_siteurl.app_error") // Check that the Site URL wasn't cleared - cfg, resp = th.SystemAdminClient.GetConfig() - CheckNoError(t, resp) + cfg, _, err = th.SystemAdminClient.GetConfig() + require.NoError(t, err) require.Equal(t, nonEmptyURL, *cfg.ServiceSettings.SiteURL) // Check that sending an empty config returns no error. - _, resp = th.SystemAdminClient.PatchConfig(&model.Config{}) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.PatchConfig(&model.Config{}) + require.NoError(t, err) }) } @@ -758,7 +771,8 @@ func TestMigrateConfig(t *testing.T) { defer th.TearDown() t.Run("user is not system admin", func(t *testing.T) { - _, response := th.Client.MigrateConfig("from", "to") + response, err := th.Client.MigrateConfig("from", "to") + require.Error(t, err) CheckForbiddenStatus(t, response) }) @@ -771,7 +785,7 @@ func TestMigrateConfig(t *testing.T) { require.NoError(t, err) defer f.RemoveFile("to.json") - _, response := client.MigrateConfig("from.json", "to.json") - CheckNoError(t, response) + _, err = client.MigrateConfig("from.json", "to.json") + require.NoError(t, err) }) } diff --git a/api4/data_retention_test.go b/api4/data_retention_test.go index 80fe760768..043b2bf8cd 100644 --- a/api4/data_retention_test.go +++ b/api4/data_retention_test.go @@ -5,12 +5,15 @@ package api4 import ( "testing" + + "github.com/stretchr/testify/require" ) func TestDataRetentionGetPolicy(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.GetDataRetentionPolicy() + _, resp, err := th.Client.GetDataRetentionPolicy() + require.Error(t, err) CheckNotImplementedStatus(t, resp) } diff --git a/api4/elasticsearch_test.go b/api4/elasticsearch_test.go index 4c55a8990b..1713080f00 100644 --- a/api4/elasticsearch_test.go +++ b/api4/elasticsearch_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/mattermost/mattermost-server/v6/model" + "github.com/stretchr/testify/require" ) func TestElasticsearchTest(t *testing.T) { @@ -14,19 +15,22 @@ func TestElasticsearchTest(t *testing.T) { defer th.TearDown() t.Run("as system user", func(t *testing.T) { - _, resp := th.Client.TestElasticsearch() + resp, err := th.Client.TestElasticsearch() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.TestElasticsearch() + resp, err := th.SystemAdminClient.TestElasticsearch() + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.TestElasticsearch() + resp, err := th.SystemAdminClient.TestElasticsearch() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -36,19 +40,22 @@ func TestElasticsearchPurgeIndexes(t *testing.T) { defer th.TearDown() t.Run("as system user", func(t *testing.T) { - _, resp := th.Client.PurgeElasticsearchIndexes() + resp, err := th.Client.PurgeElasticsearchIndexes() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.PurgeElasticsearchIndexes() + resp, err := th.SystemAdminClient.PurgeElasticsearchIndexes() + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.PurgeElasticsearchIndexes() + resp, err := th.SystemAdminClient.PurgeElasticsearchIndexes() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } diff --git a/api4/emoji_test.go b/api4/emoji_test.go index 35f1518cea..4af7098afb 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -23,7 +23,7 @@ import ( func TestCreateEmoji(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji defer func() { @@ -58,15 +58,16 @@ func TestCreateEmoji(t *testing.T) { } // try to create an emoji when they're disabled - _, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + _, resp, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.Error(t, err) CheckNotImplementedStatus(t, resp) // enable emoji creation for next cases th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) // try to create a valid gif emoji when they're enabled - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, emojiWidth, emojiHeight), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, emojiWidth, emojiHeight), "image.gif") + require.NoError(t, err) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") checkEmojiFile(newEmoji.Id, "gif") @@ -75,9 +76,10 @@ func TestCreateEmoji(t *testing.T) { CreatorId: th.BasicUser.Id, Name: newEmoji.Name, } - _, resp = Client.CreateEmoji(emoji2, utils.CreateTestGif(t, 10, 10), "image.gif") + _, resp, err = client.CreateEmoji(emoji2, utils.CreateTestGif(t, 10, 10), "image.gif") + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.emoji.create.duplicate.app_error") + CheckErrorID(t, err, "api.emoji.create.duplicate.app_error") // try to create a valid animated gif emoji emoji = &model.Emoji{ @@ -85,8 +87,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, emojiWidth, emojiHeight, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, emojiWidth, emojiHeight, 10), "image.gif") + require.NoError(t, err) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") checkEmojiFile(newEmoji.Id, "gif") @@ -96,8 +98,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestJpeg(t, emojiWidth, emojiHeight), "image.jpeg") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestJpeg(t, emojiWidth, emojiHeight), "image.jpeg") + require.NoError(t, err) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") checkEmojiFile(newEmoji.Id, "png") // emoji must be converted from jpeg to png @@ -107,8 +109,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestPng(t, emojiWidth, emojiHeight), "image.png") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestPng(t, emojiWidth, emojiHeight), "image.png") + require.NoError(t, err) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") checkEmojiFile(newEmoji.Id, "png") @@ -118,8 +120,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 1000, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 1000, 10), "image.gif") + require.NoError(t, err) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") // try to create an emoji that's too wide @@ -128,8 +130,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, app.MaxEmojiOriginalWidth+1), "image.gif") - require.NotNil(t, resp.Error, "should fail - emoji is too wide") + _, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, app.MaxEmojiOriginalWidth+1), "image.gif") + require.Error(t, err, "should fail - emoji is too wide") // try to create an emoji that's too tall emoji = &model.Emoji{ @@ -137,8 +139,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, app.MaxEmojiOriginalHeight+1, 10), "image.gif") - require.NotNil(t, resp.Error, "should fail - emoji is too tall") + _, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, app.MaxEmojiOriginalHeight+1, 10), "image.gif") + require.Error(t, err, "should fail - emoji is too tall") // try to create an emoji that's too large emoji = &model.Emoji{ @@ -146,8 +148,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 100, 100, 10000), "image.gif") - require.NotNil(t, resp.Error, "should fail - emoji is too big") + _, _, err = client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 100, 100, 10000), "image.gif") + require.Error(t, err, "should fail - emoji is too big") // try to create an emoji with data that isn't an image emoji = &model.Emoji{ @@ -155,9 +157,10 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, make([]byte, 100), "image.gif") + _, resp, err = client.CreateEmoji(emoji, make([]byte, 100), "image.gif") + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.emoji.upload.image.app_error") + CheckErrorID(t, err, "api.emoji.upload.image.app_error") // try to create an emoji as another user emoji = &model.Emoji{ @@ -165,7 +168,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + _, resp, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.Error(t, err) CheckForbiddenStatus(t, resp) // try to create an emoji without permissions @@ -176,7 +180,8 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + _, resp, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.Error(t, err) CheckForbiddenStatus(t, resp) // create an emoji with permissions in one team @@ -187,14 +192,14 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + _, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) } func TestGetEmojiList(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji defer func() { @@ -218,13 +223,13 @@ func TestGetEmojiList(t *testing.T) { } for idx, emoji := range emojis { - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) emojis[idx] = newEmoji } - listEmoji, resp := Client.GetEmojiList(0, 100) - CheckNoError(t, resp) + listEmoji, _, err := client.GetEmojiList(0, 100) + require.NoError(t, err) for _, emoji := range emojis { found := false for _, savedEmoji := range listEmoji { @@ -236,10 +241,10 @@ func TestGetEmojiList(t *testing.T) { require.Truef(t, found, "failed to get emoji with id %v, %v", emoji.Id, len(listEmoji)) } - _, resp = Client.DeleteEmoji(emojis[0].Id) - CheckNoError(t, resp) - listEmoji, resp = Client.GetEmojiList(0, 100) - CheckNoError(t, resp) + _, err = client.DeleteEmoji(emojis[0].Id) + require.NoError(t, err) + listEmoji, _, err = client.GetEmojiList(0, 100) + require.NoError(t, err) found := false for _, savedEmoji := range listEmoji { if savedEmoji.Id == emojis[0].Id { @@ -249,13 +254,13 @@ func TestGetEmojiList(t *testing.T) { } require.Falsef(t, found, "should not get a deleted emoji %v", emojis[0].Id) - listEmoji, resp = Client.GetEmojiList(0, 1) - CheckNoError(t, resp) + listEmoji, _, err = client.GetEmojiList(0, 1) + require.NoError(t, err) require.Len(t, listEmoji, 1, "should only return 1") - listEmoji, resp = Client.GetSortedEmojiList(0, 100, model.EmojiSortByName) - CheckNoError(t, resp) + listEmoji, _, err = client.GetSortedEmojiList(0, 100, model.EmojiSortByName) + require.NoError(t, err) require.Greater(t, len(listEmoji), 0, "should return more than 0") } @@ -263,7 +268,7 @@ func TestGetEmojiList(t *testing.T) { func TestDeleteEmoji(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji defer func() { @@ -281,47 +286,47 @@ func TestDeleteEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) - ok, resp := Client.DeleteEmoji(newEmoji.Id) - CheckNoError(t, resp) - require.True(t, ok, "delete did not return OK") + _, err = client.DeleteEmoji(newEmoji.Id) + require.NoError(t, err) - _, resp = Client.GetEmoji(newEmoji.Id) - require.NotNil(t, resp, "nil response") - require.NotNil(t, resp.Error, "expected error fetching deleted emoji") + _, _, err = client.GetEmoji(newEmoji.Id) + require.Error(t, err, "expected error fetching deleted emoji") //Admin can delete other users emoji - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) - ok, resp = th.SystemAdminClient.DeleteEmoji(newEmoji.Id) - CheckNoError(t, resp) - require.True(t, ok, "delete did not return OK") + _, err = th.SystemAdminClient.DeleteEmoji(newEmoji.Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetEmoji(newEmoji.Id) - require.NotNil(t, resp, "nil response") - require.NotNil(t, resp.Error, "expected error fetching deleted emoji") + _, _, err = th.SystemAdminClient.GetEmoji(newEmoji.Id) + require.Error(t, err, "expected error fetching deleted emoji") // Try to delete just deleted emoji - _, resp = Client.DeleteEmoji(newEmoji.Id) + resp, err := client.DeleteEmoji(newEmoji.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) //Try to delete non-existing emoji - _, resp = Client.DeleteEmoji(model.NewId()) + resp, err = client.DeleteEmoji(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) //Try to delete without Id - _, resp = Client.DeleteEmoji("") + resp, err = client.DeleteEmoji("") + require.Error(t, err) CheckNotFoundStatus(t, resp) //Try to delete my custom emoji without permissions - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.RemovePermissionFromRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) - _, resp = Client.DeleteEmoji(newEmoji.Id) + resp, err = client.DeleteEmoji(newEmoji.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) @@ -331,22 +336,23 @@ func TestDeleteEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.RemovePermissionFromRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) th.AddPermissionToRole(model.PermissionDeleteOthersEmojis.Id, model.SystemUserRoleId) - Client.Logout() + client.Logout() th.LoginBasic2() - _, resp = Client.DeleteEmoji(newEmoji.Id) + resp, err = client.DeleteEmoji(newEmoji.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.RemovePermissionFromRole(model.PermissionDeleteOthersEmojis.Id, model.SystemUserRoleId) th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) - Client.Logout() + client.Logout() th.LoginBasic() //Try to delete other user's custom emoji without DELETE_OTHERS_EMOJIS permissions @@ -355,16 +361,17 @@ func TestDeleteEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) - Client.Logout() + client.Logout() th.LoginBasic2() - _, resp = Client.DeleteEmoji(newEmoji.Id) + resp, err = client.DeleteEmoji(newEmoji.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() th.LoginBasic() //Try to delete other user's custom emoji with permissions @@ -373,29 +380,29 @@ func TestDeleteEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) th.AddPermissionToRole(model.PermissionDeleteOthersEmojis.Id, model.SystemUserRoleId) - Client.Logout() + client.Logout() th.LoginBasic2() - _, resp = Client.DeleteEmoji(newEmoji.Id) - CheckNoError(t, resp) + _, err = client.DeleteEmoji(newEmoji.Id) + require.NoError(t, err) - Client.Logout() + client.Logout() th.LoginBasic() //Try to delete my custom emoji with permissions at team level - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.RemovePermissionFromRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.TeamUserRoleId) - _, resp = Client.DeleteEmoji(newEmoji.Id) - CheckNoError(t, resp) + _, err = client.DeleteEmoji(newEmoji.Id) + require.NoError(t, err) th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) th.RemovePermissionFromRole(model.PermissionDeleteEmojis.Id, model.TeamUserRoleId) @@ -405,8 +412,8 @@ func TestDeleteEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err = client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.RemovePermissionFromRole(model.PermissionDeleteEmojis.Id, model.SystemUserRoleId) th.RemovePermissionFromRole(model.PermissionDeleteOthersEmojis.Id, model.SystemUserRoleId) @@ -414,17 +421,17 @@ func TestDeleteEmoji(t *testing.T) { th.AddPermissionToRole(model.PermissionDeleteEmojis.Id, model.TeamUserRoleId) th.AddPermissionToRole(model.PermissionDeleteOthersEmojis.Id, model.TeamUserRoleId) - Client.Logout() + client.Logout() th.LoginBasic2() - _, resp = Client.DeleteEmoji(newEmoji.Id) - CheckNoError(t, resp) + _, err = client.DeleteEmoji(newEmoji.Id) + require.NoError(t, err) } func TestGetEmoji(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji defer func() { @@ -437,21 +444,22 @@ func TestGetEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) - emoji, resp = Client.GetEmoji(newEmoji.Id) - CheckNoError(t, resp) + emoji, _, err = client.GetEmoji(newEmoji.Id) + require.NoError(t, err) require.Equal(t, newEmoji.Id, emoji.Id, "wrong emoji was returned") - _, resp = Client.GetEmoji(model.NewId()) + _, resp, err := client.GetEmoji(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) } func TestGetEmojiByName(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) @@ -460,25 +468,27 @@ func TestGetEmojiByName(t *testing.T) { Name: model.NewId(), } - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) - emoji, resp = Client.GetEmojiByName(newEmoji.Name) - CheckNoError(t, resp) + emoji, _, err = client.GetEmojiByName(newEmoji.Name) + require.NoError(t, err) assert.Equal(t, newEmoji.Name, emoji.Name) - _, resp = Client.GetEmojiByName(model.NewId()) + _, resp, err := client.GetEmojiByName(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetEmojiByName(newEmoji.Name) + client.Logout() + _, resp, err = client.GetEmojiByName(newEmoji.Name) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestGetEmojiImage(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) @@ -487,20 +497,21 @@ func TestGetEmojiImage(t *testing.T) { Name: model.NewId(), } - emoji1, resp := Client.CreateEmoji(emoji1, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + emoji1, _, err := client.CreateEmoji(emoji1, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = false }) - _, resp = Client.GetEmojiImage(emoji1.Id) + _, resp, err := client.GetEmojiImage(emoji1.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.emoji.disabled.app_error") + CheckErrorID(t, err, "api.emoji.disabled.app_error") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = "local" }) - emojiImage, resp := Client.GetEmojiImage(emoji1.Id) - CheckNoError(t, resp) + emojiImage, _, err := client.GetEmojiImage(emoji1.Id) + require.NoError(t, err) require.Greater(t, len(emojiImage), 0, "should return the image") _, imageType, err := image.DecodeConfig(bytes.NewReader(emojiImage)) @@ -512,11 +523,11 @@ func TestGetEmojiImage(t *testing.T) { Name: model.NewId(), } - emoji2, resp = Client.CreateEmoji(emoji2, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") - CheckNoError(t, resp) + emoji2, _, err = client.CreateEmoji(emoji2, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") + require.NoError(t, err) - emojiImage, resp = Client.GetEmojiImage(emoji2.Id) - CheckNoError(t, resp) + emojiImage, _, err = client.GetEmojiImage(emoji2.Id) + require.NoError(t, err) require.Greater(t, len(emojiImage), 0, "no image returned") _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) @@ -527,11 +538,11 @@ func TestGetEmojiImage(t *testing.T) { CreatorId: th.BasicUser.Id, Name: model.NewId(), } - emoji3, resp = Client.CreateEmoji(emoji3, utils.CreateTestJpeg(t, 10, 10), "image.jpg") - CheckNoError(t, resp) + emoji3, _, err = client.CreateEmoji(emoji3, utils.CreateTestJpeg(t, 10, 10), "image.jpg") + require.NoError(t, err) - emojiImage, resp = Client.GetEmojiImage(emoji3.Id) - CheckNoError(t, resp) + emojiImage, _, err = client.GetEmojiImage(emoji3.Id) + require.NoError(t, err) require.Greater(t, len(emojiImage), 0, "no image returned") _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) @@ -542,34 +553,37 @@ func TestGetEmojiImage(t *testing.T) { CreatorId: th.BasicUser.Id, Name: model.NewId(), } - emoji4, resp = Client.CreateEmoji(emoji4, utils.CreateTestPng(t, 10, 10), "image.png") - CheckNoError(t, resp) + emoji4, _, err = client.CreateEmoji(emoji4, utils.CreateTestPng(t, 10, 10), "image.png") + require.NoError(t, err) - emojiImage, resp = Client.GetEmojiImage(emoji4.Id) - CheckNoError(t, resp) + emojiImage, _, err = client.GetEmojiImage(emoji4.Id) + require.NoError(t, err) require.Greater(t, len(emojiImage), 0, "no image returned") _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) require.NoError(t, err, "unable to idenitify received image") require.Equal(t, imageType, "png", "expected png") - _, resp = Client.DeleteEmoji(emoji4.Id) - CheckNoError(t, resp) + _, err = client.DeleteEmoji(emoji4.Id) + require.NoError(t, err) - _, resp = Client.GetEmojiImage(emoji4.Id) + _, resp, err = client.GetEmojiImage(emoji4.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetEmojiImage(model.NewId()) + _, resp, err = client.GetEmojiImage(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetEmojiImage("") + _, resp, err = client.GetEmojiImage("") + require.Error(t, err) CheckBadRequestStatus(t, resp) } func TestSearchEmoji(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) @@ -588,14 +602,14 @@ func TestSearchEmoji(t *testing.T) { } for idx, emoji := range emojis { - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) emojis[idx] = newEmoji } search := &model.EmojiSearch{Term: searchTerm1} - remojis, resp := Client.SearchEmoji(search) - CheckNoError(t, resp) + remojis, resp, err := client.SearchEmoji(search) + require.NoError(t, err) CheckOKStatus(t, resp) found := false @@ -609,8 +623,8 @@ func TestSearchEmoji(t *testing.T) { search.Term = searchTerm2 search.PrefixOnly = true - remojis, resp = Client.SearchEmoji(search) - CheckNoError(t, resp) + remojis, resp, err = client.SearchEmoji(search) + require.NoError(t, err) CheckOKStatus(t, resp) found = false @@ -623,8 +637,8 @@ func TestSearchEmoji(t *testing.T) { assert.False(t, found) search.PrefixOnly = false - remojis, resp = Client.SearchEmoji(search) - CheckNoError(t, resp) + remojis, resp, err = client.SearchEmoji(search) + require.NoError(t, err) CheckOKStatus(t, resp) found = false @@ -637,18 +651,20 @@ func TestSearchEmoji(t *testing.T) { assert.True(t, found) search.Term = "" - _, resp = Client.SearchEmoji(search) + _, resp, err = client.SearchEmoji(search) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.SearchEmoji(search) + client.Logout() + _, resp, err = client.SearchEmoji(search) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestAutocompleteEmoji(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) @@ -666,13 +682,13 @@ func TestAutocompleteEmoji(t *testing.T) { } for idx, emoji := range emojis { - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") - CheckNoError(t, resp) + newEmoji, _, err := client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + require.NoError(t, err) emojis[idx] = newEmoji } - remojis, resp := Client.AutocompleteEmoji(searchTerm1, "") - CheckNoError(t, resp) + remojis, resp, err := client.AutocompleteEmoji(searchTerm1, "") + require.NoError(t, err) CheckOKStatus(t, resp) found1 := false @@ -690,10 +706,12 @@ func TestAutocompleteEmoji(t *testing.T) { assert.True(t, found1) assert.False(t, found2) - _, resp = Client.AutocompleteEmoji("", "") + _, resp, err = client.AutocompleteEmoji("", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.AutocompleteEmoji(searchTerm1, "") + client.Logout() + _, resp, err = client.AutocompleteEmoji(searchTerm1, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } diff --git a/api4/export_test.go b/api4/export_test.go index 48e060ef6c..db3a961807 100644 --- a/api4/export_test.go +++ b/api4/export_test.go @@ -22,15 +22,15 @@ func TestListExports(t *testing.T) { defer th.TearDown() t.Run("no permissions", func(t *testing.T) { - exports, resp := th.Client.ListExports() - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + exports, _, err := th.Client.ListExports() + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Nil(t, exports) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - exports, resp := c.ListExports() - require.Nil(t, resp.Error) + exports, _, err := c.ListExports() + require.NoError(t, err) require.Empty(t, exports) }, "no exports") @@ -47,8 +47,8 @@ func TestListExports(t *testing.T) { require.NoError(t, err) f.Close() - exports, resp := c.ListExports() - require.Nil(t, resp.Error) + exports, _, err := c.ListExports() + require.NoError(t, err) require.Len(t, exports, 1) require.Equal(t, exports[0], "export.zip") }, "expected exports") @@ -63,16 +63,16 @@ func TestListExports(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(exportDir) - exports, resp := c.ListExports() - require.Nil(t, resp.Error) + exports, _, err := c.ListExports() + require.NoError(t, err) require.Empty(t, exports) f, err := os.Create(filepath.Join(exportDir, "export.zip")) require.NoError(t, err) f.Close() - exports, resp = c.ListExports() - require.Nil(t, resp.Error) + exports, _, err = c.ListExports() + require.NoError(t, err) require.Len(t, exports, 1) require.Equal(t, "export.zip", exports[0]) }, "change export directory") @@ -83,10 +83,9 @@ func TestDeleteExport(t *testing.T) { defer th.TearDown() t.Run("no permissions", func(t *testing.T) { - ok, resp := th.Client.DeleteExport("export.zip") - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) - require.False(t, ok) + _, err := th.Client.DeleteExport("export.zip") + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") }) dataDir, found := fileutils.FindDir("data") @@ -102,23 +101,21 @@ func TestDeleteExport(t *testing.T) { require.NoError(t, err) f.Close() - exports, resp := c.ListExports() - require.Nil(t, resp.Error) + exports, _, err := c.ListExports() + require.NoError(t, err) require.Len(t, exports, 1) require.Equal(t, exports[0], exportName) - ok, resp := c.DeleteExport(exportName) - require.Nil(t, resp.Error) - require.True(t, ok) + _, err = c.DeleteExport(exportName) + require.NoError(t, err) - exports, resp = c.ListExports() - require.Nil(t, resp.Error) + exports, _, err = c.ListExports() + require.NoError(t, err) require.Empty(t, exports) // verify idempotence - ok, resp = c.DeleteExport(exportName) - require.Nil(t, resp.Error) - require.True(t, ok) + _, err = c.DeleteExport(exportName) + require.NoError(t, err) }, "successfully delete export") } @@ -128,9 +125,9 @@ func TestDownloadExport(t *testing.T) { t.Run("no permissions", func(t *testing.T) { var buf bytes.Buffer - n, resp := th.Client.DownloadExport("export.zip", &buf, 0) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + n, _, err := th.Client.DownloadExport("export.zip", &buf, 0) + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Zero(t, n) }) @@ -140,9 +137,9 @@ func TestDownloadExport(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { var buf bytes.Buffer - n, resp := c.DownloadExport("export.zip", &buf, 0) - require.NotNil(t, resp.Error) - require.Equal(t, "api.export.export_not_found.app_error", resp.Error.Id) + n, _, err := c.DownloadExport("export.zip", &buf, 0) + require.Error(t, err) + CheckErrorID(t, err, "api.export.export_not_found.app_error") require.Zero(t, n) }, "not found") @@ -157,8 +154,8 @@ func TestDownloadExport(t *testing.T) { err = ioutil.WriteFile(filepath.Join(exportDir, exportName), data, 0600) require.NoError(t, err) - n, resp := c.DownloadExport(exportName, &buf, 0) - require.Nil(t, resp.Error) + n, _, err := c.DownloadExport(exportName, &buf, 0) + require.NoError(t, err) require.Equal(t, len(data), int(n)) require.Equal(t, data, buf.Bytes()) }, "full download") @@ -175,8 +172,8 @@ func TestDownloadExport(t *testing.T) { require.NoError(t, err) offset := 1024 * 512 - n, resp := c.DownloadExport(exportName, &buf, int64(offset)) - require.Nil(t, resp.Error) + n, _, err := c.DownloadExport(exportName, &buf, int64(offset)) + require.NoError(t, err) require.Equal(t, len(data)-offset, int(n)) require.Equal(t, data[offset:], buf.Bytes()) }, "download with offset") diff --git a/api4/file_test.go b/api4/file_test.go index 25ec9f7a7d..d8dd23f1a2 100644 --- a/api4/file_test.go +++ b/api4/file_test.go @@ -59,7 +59,7 @@ func fileBytes(t *testing.T, path string) []byte { } func testDoUploadFileRequest(t testing.TB, c *model.Client4, url string, blob []byte, contentType string, - contentLength int64) (*model.FileUploadResponse, *model.Response) { + contentLength int64) (*model.FileUploadResponse, *model.Response, error) { req, err := http.NewRequest("POST", c.ApiUrl+c.GetFilesRoute()+url, bytes.NewReader(blob)) require.NoError(t, err) @@ -77,10 +77,10 @@ func testDoUploadFileRequest(t testing.TB, c *model.Client4, url string, blob [] defer closeBody(resp) if resp.StatusCode >= 300 { - return nil, model.BuildErrorResponse(resp, model.AppErrorFromJson(resp.Body)) + return nil, model.BuildResponse(resp), model.AppErrorFromJson(resp.Body) } - return model.FileUploadResponseFromJson(resp.Body), model.BuildResponse(resp) + return model.FileUploadResponseFromJson(resp.Body), model.BuildResponse(resp), nil } func testUploadFilesPost( @@ -91,7 +91,7 @@ func testUploadFilesPost( blobs [][]byte, clientIds []string, useChunked bool, -) (*model.FileUploadResponse, *model.Response) { +) (*model.FileUploadResponse, *model.Response, error) { // Do not check len(clientIds), leave it entirely to the user to // provide. The server will error out if it does not match the number @@ -116,9 +116,9 @@ func testUploadFilesPost( postURL += fmt.Sprintf("&client_id=%v", url.QueryEscape(clientIds[i])) } - fur, resp := testDoUploadFileRequest(t, c, postURL, blob, ct, cl) - if resp.Error != nil { - return nil, resp + fur, resp, err := testDoUploadFileRequest(t, c, postURL, blob, ct, cl) + if err != nil { + return nil, resp, err } fileUploadResponse.FileInfos = append(fileUploadResponse.FileInfos, fur.FileInfos[0]) @@ -131,7 +131,7 @@ func testUploadFilesPost( } } - return fileUploadResponse, nil + return fileUploadResponse, nil, nil } func testUploadFilesMultipart( @@ -142,8 +142,9 @@ func testUploadFilesMultipart( blobs [][]byte, clientIds []string, ) ( - fileUploadResponse *model.FileUploadResponse, - response *model.Response, + *model.FileUploadResponse, + *model.Response, + error, ) { // Do not check len(clientIds), leave it entirely to the user to // provide. The server will error out if it does not match the number @@ -171,7 +172,8 @@ func testUploadFilesMultipart( h.Set("Content-Type", ct) // If we error here, writing to mw, the deferred handler - part, err := mw.CreatePart(h) + var part io.Writer + part, err = mw.CreatePart(h) require.NoError(t, err) _, err = io.Copy(part, bytes.NewReader(blob)) @@ -179,7 +181,12 @@ func testUploadFilesMultipart( } require.NoError(t, mw.Close()) - return testDoUploadFileRequest(t, c, "", mwBody.Bytes(), mw.FormDataContentType(), -1) + fur, resp, err := testDoUploadFileRequest(t, c, "", mwBody.Bytes(), mw.FormDataContentType(), -1) + if err != nil { + return nil, resp, err + } + + return fur, resp, nil } func TestUploadFiles(t *testing.T) { @@ -603,18 +610,17 @@ func TestUploadFiles(t *testing.T) { var fileResp *model.FileUploadResponse var resp *model.Response + var err error if useMultipart { - fileResp, resp = testUploadFilesMultipart(t, client, channelId, tc.names, blobs, tc.clientIds) + fileResp, resp, err = testUploadFilesMultipart(t, client, channelId, tc.names, blobs, tc.clientIds) } else { - fileResp, resp = testUploadFilesPost(t, client, channelId, tc.names, blobs, tc.clientIds, tc.useChunkedInSimplePost) + fileResp, resp, err = testUploadFilesPost(t, client, channelId, tc.names, blobs, tc.clientIds, tc.useChunkedInSimplePost) } if tc.checkResponse != nil { tc.checkResponse(t, resp) } else { - if resp != nil { - require.Nil(t, resp.Error) - } + require.NoError(t, err) } if tc.skipSuccessValidation { return @@ -674,10 +680,9 @@ func TestUploadFiles(t *testing.T) { } if !tc.skipPayloadValidation { - compare := func(get func(string) ([]byte, *model.Response), name string) { - data, resp := get(ri.Id) - require.NotNil(t, resp) - require.Nil(t, resp.Error) + compare := func(get func(string) ([]byte, *model.Response, error), name string) { + data, _, err := get(ri.Id) + require.NoError(t, err) expected, err := ioutil.ReadFile(filepath.Join(testDir, name)) require.NoError(t, err) @@ -714,7 +719,7 @@ func TestUploadFiles(t *testing.T) { func TestGetFile(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel if *th.App.Config().FileSettings.DriverName == "" { @@ -724,38 +729,41 @@ func TestGetFile(t *testing.T) { sent, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(sent, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - data, resp := Client.GetFile(fileId) - CheckNoError(t, resp) + data, _, err := client.GetFile(fileId) + require.NoError(t, err) require.NotEqual(t, 0, len(data), "should not be empty") for i := range data { require.Equal(t, sent[i], data[i], "received file didn't match sent one") } - _, resp = Client.GetFile("junk") + _, resp, err := client.GetFile("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFile(model.NewId()) + _, resp, err = client.GetFile(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetFile(fileId) + client.Logout() + _, resp, err = client.GetFile(fileId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetFile(fileId) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetFile(fileId) + require.NoError(t, err) } func TestGetFileHeaders(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel if *th.App.Config().FileSettings.DriverName == "" { @@ -764,13 +772,13 @@ func TestGetFileHeaders(t *testing.T) { testHeaders := func(data []byte, filename string, expectedContentType string, getInline bool) func(*testing.T) { return func(t *testing.T) { - fileResp, resp := Client.UploadFile(data, channel.Id, filename) - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(data, channel.Id, filename) + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - _, resp = Client.GetFile(fileId) - CheckNoError(t, resp) + _, resp, err := client.GetFile(fileId) + require.NoError(t, err) CheckStartsWith(t, resp.Header.Get("Content-Type"), expectedContentType, "returned incorrect Content-Type") @@ -780,8 +788,8 @@ func TestGetFileHeaders(t *testing.T) { CheckStartsWith(t, resp.Header.Get("Content-Disposition"), "attachment", "returned incorrect Content-Disposition") } - _, resp = Client.DownloadFile(fileId, true) - CheckNoError(t, resp) + _, resp, err = client.DownloadFile(fileId, true) + require.NoError(t, err) CheckStartsWith(t, resp.Header.Get("Content-Type"), expectedContentType, "returned incorrect Content-Type") CheckStartsWith(t, resp.Header.Get("Content-Disposition"), "attachment", "returned incorrect Content-Disposition") @@ -809,7 +817,7 @@ func TestGetFileHeaders(t *testing.T) { func TestGetFileThumbnail(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel if *th.App.Config().FileSettings.DriverName == "" { @@ -819,39 +827,43 @@ func TestGetFileThumbnail(t *testing.T) { sent, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(sent, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - data, resp := Client.GetFileThumbnail(fileId) - CheckNoError(t, resp) + data, _, err := client.GetFileThumbnail(fileId) + require.NoError(t, err) require.NotEqual(t, 0, len(data), "should not be empty") - _, resp = Client.GetFileThumbnail("junk") + _, resp, err := client.GetFileThumbnail("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFileThumbnail(model.NewId()) + _, resp, err = client.GetFileThumbnail(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetFileThumbnail(fileId) + client.Logout() + _, resp, err = client.GetFileThumbnail(fileId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) otherUser := th.CreateUser() - Client.Login(otherUser.Email, otherUser.Password) - _, resp = Client.GetFileThumbnail(fileId) + client.Login(otherUser.Email, otherUser.Password) + _, resp, err = client.GetFileThumbnail(fileId) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = th.SystemAdminClient.GetFileThumbnail(fileId) - CheckNoError(t, resp) + client.Logout() + _, _, err = th.SystemAdminClient.GetFileThumbnail(fileId) + require.NoError(t, err) } func TestGetFileLink(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel if *th.App.Config().FileSettings.DriverName == "" { @@ -864,12 +876,13 @@ func TestGetFileLink(t *testing.T) { data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, uploadResp := Client.UploadFile(data, channel.Id, "test.png") - CheckNoError(t, uploadResp) + fileResp, _, err := client.UploadFile(data, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - _, resp := Client.GetFileLink(fileId) + _, resp, err := client.GetFileLink(fileId) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Hacky way to assign file to a post (usually would be done by CreatePost call) @@ -877,32 +890,37 @@ func TestGetFileLink(t *testing.T) { require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnablePublicLink = false }) - _, resp = Client.GetFileLink(fileId) + _, resp, err = client.GetFileLink(fileId) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnablePublicLink = true }) - link, resp := Client.GetFileLink(fileId) - CheckNoError(t, resp) + link, _, err := client.GetFileLink(fileId) + require.NoError(t, err) require.NotEqual(t, "", link, "should've received public link") - _, resp = Client.GetFileLink("junk") + _, resp, err = client.GetFileLink("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFileLink(model.NewId()) + _, resp, err = client.GetFileLink(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetFileLink(fileId) + client.Logout() + _, resp, err = client.GetFileLink(fileId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) otherUser := th.CreateUser() - Client.Login(otherUser.Email, otherUser.Password) - _, resp = Client.GetFileLink(fileId) + client.Login(otherUser.Email, otherUser.Password) + _, resp, err = client.GetFileLink(fileId) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = th.SystemAdminClient.GetFileLink(fileId) - CheckNoError(t, resp) + client.Logout() + _, _, err = th.SystemAdminClient.GetFileLink(fileId) + require.NoError(t, err) fileInfo, err := th.App.Srv().Store.FileInfo().Get(fileId) require.NoError(t, err) @@ -912,7 +930,7 @@ func TestGetFileLink(t *testing.T) { func TestGetFilePreview(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel if *th.App.Config().FileSettings.DriverName == "" { @@ -922,38 +940,42 @@ func TestGetFilePreview(t *testing.T) { sent, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(sent, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - data, resp := Client.GetFilePreview(fileId) - CheckNoError(t, resp) + data, _, err := client.GetFilePreview(fileId) + require.NoError(t, err) require.NotEqual(t, 0, len(data), "should not be empty") - _, resp = Client.GetFilePreview("junk") + _, resp, err := client.GetFilePreview("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFilePreview(model.NewId()) + _, resp, err = client.GetFilePreview(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetFilePreview(fileId) + client.Logout() + _, resp, err = client.GetFilePreview(fileId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) otherUser := th.CreateUser() - Client.Login(otherUser.Email, otherUser.Password) - _, resp = Client.GetFilePreview(fileId) + client.Login(otherUser.Email, otherUser.Password) + _, resp, err = client.GetFilePreview(fileId) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = th.SystemAdminClient.GetFilePreview(fileId) - CheckNoError(t, resp) + client.Logout() + _, _, err = th.SystemAdminClient.GetFilePreview(fileId) + require.NoError(t, err) } func TestGetFileInfo(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser channel := th.BasicChannel @@ -964,12 +986,12 @@ func TestGetFileInfo(t *testing.T) { sent, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(sent, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - info, resp := Client.GetFileInfo(fileId) - CheckNoError(t, resp) + info, _, err := client.GetFileInfo(fileId) + require.NoError(t, err) require.NoError(t, err) require.Equal(t, fileId, info.Id, "got incorrect file") @@ -980,30 +1002,34 @@ func TestGetFileInfo(t *testing.T) { require.Equal(t, "", info.PreviewPath, "file preview path shouldn't have been returned to client") require.Equal(t, "image/png", info.MimeType, "mime type should've been image/png") - _, resp = Client.GetFileInfo("junk") + _, resp, err := client.GetFileInfo("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFileInfo(model.NewId()) + _, resp, err = client.GetFileInfo(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() - _, resp = Client.GetFileInfo(fileId) + client.Logout() + _, resp, err = client.GetFileInfo(fileId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) otherUser := th.CreateUser() - Client.Login(otherUser.Email, otherUser.Password) - _, resp = Client.GetFileInfo(fileId) + client.Login(otherUser.Email, otherUser.Password) + _, resp, err = client.GetFileInfo(fileId) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = th.SystemAdminClient.GetFileInfo(fileId) - CheckNoError(t, resp) + client.Logout() + _, _, err = th.SystemAdminClient.GetFileInfo(fileId) + require.NoError(t, err) } func TestGetPublicFile(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnablePublicLink = true }) @@ -1012,8 +1038,8 @@ func TestGetPublicFile(t *testing.T) { data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - fileResp, httpResp := Client.UploadFile(data, channel.Id, "test.png") - CheckNoError(t, httpResp) + fileResp, _, err := client.UploadFile(data, channel.Id, "test.png") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id @@ -1023,7 +1049,7 @@ func TestGetPublicFile(t *testing.T) { info, err := th.App.Srv().Store.FileInfo().Get(fileId) require.NoError(t, err) - link := th.App.GeneratePublicLink(Client.Url, info) + link := th.App.GeneratePublicLink(client.Url, info) resp, err := http.Get(link) require.NoError(t, err) @@ -1056,7 +1082,7 @@ func TestGetPublicFile(t *testing.T) { require.NoError(t, th.cleanupTestFile(fileInfo)) th.cleanupTestFile(info) - link = th.App.GeneratePublicLink(Client.Url, info) + link = th.App.GeneratePublicLink(client.Url, info) resp, err = http.Get(link) require.NoError(t, err) require.Equal(t, http.StatusNotFound, resp.StatusCode, "should've failed to get file after it is deleted") @@ -1078,7 +1104,7 @@ func TestSearchFiles(t *testing.T) { require.NoError(t, err) th.LoginBasic() - Client := th.Client + client := th.Client filename := "search for fileInfo1" fileInfo1, appErr := th.App.UploadFile(th.Context, data, th.BasicChannel.Id, filename) @@ -1108,8 +1134,8 @@ func TestSearchFiles(t *testing.T) { fileInfo5, appErr := th.App.UploadFile(th.Context, data, archivedChannel.Id, "tagged for fileInfo3") require.Nil(t, appErr) post := &model.Post{ChannelId: archivedChannel.Id, Message: model.NewId() + "a"} - rpost, resp := Client.CreatePost(post) - CheckNoError(t, resp) + rpost, _, err := client.CreatePost(post) + require.NoError(t, err) err = th.App.Srv().Store.FileInfo().AttachToPost(fileInfo5.Id, rpost.Id, th.BasicUser.Id) require.NoError(t, err) th.Client.DeleteChannel(archivedChannel.Id) @@ -1122,8 +1148,8 @@ func TestSearchFiles(t *testing.T) { IsOrSearch: &isOrSearch, TimeZoneOffset: &timezoneOffset, } - fileInfos, resp := Client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + fileInfos, _, err := client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, fileInfos.Order, 3, "wrong search") terms = "search" @@ -1136,8 +1162,8 @@ func TestSearchFiles(t *testing.T) { Page: &page, PerPage: &perPage, } - fileInfos2, resp := Client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + fileInfos2, _, err := client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) // We don't support paging for DB search yet, modify this when we do. require.Len(t, fileInfos2.Order, 3, "Wrong number of fileInfos") assert.Equal(t, fileInfos.Order[0], fileInfos2.Order[0]) @@ -1151,17 +1177,17 @@ func TestSearchFiles(t *testing.T) { Page: &page, PerPage: &perPage, } - fileInfos2, resp = Client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + fileInfos2, _, err = client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) // We don't support paging for DB search yet, modify this when we do. require.Empty(t, fileInfos2.Order, "Wrong number of fileInfos") - fileInfos, resp = Client.SearchFiles(th.BasicTeam.Id, "search", false) - CheckNoError(t, resp) + fileInfos, _, err = client.SearchFiles(th.BasicTeam.Id, "search", false) + require.NoError(t, err) require.Len(t, fileInfos.Order, 3, "wrong search") - fileInfos, resp = Client.SearchFiles(th.BasicTeam.Id, "fileInfo2", false) - CheckNoError(t, resp) + fileInfos, _, err = client.SearchFiles(th.BasicTeam.Id, "fileInfo2", false) + require.NoError(t, err) require.Len(t, fileInfos.Order, 1, "wrong number of fileInfos") require.Equal(t, fileInfo2.Id, fileInfos.Order[0], "wrong search") @@ -1173,35 +1199,39 @@ func TestSearchFiles(t *testing.T) { TimeZoneOffset: &timezoneOffset, IncludeDeletedChannels: &includeDeletedChannels, } - fileInfos, resp = Client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + fileInfos, _, err = client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, fileInfos.Order, 3, "wrong search") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.ExperimentalViewArchivedChannels = false }) - fileInfos, resp = Client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + fileInfos, _, err = client.SearchFilesWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, fileInfos.Order, 2, "wrong search") - fileInfos, _ = Client.SearchFiles(th.BasicTeam.Id, "*", false) + fileInfos, _, _ = client.SearchFiles(th.BasicTeam.Id, "*", false) require.Empty(t, fileInfos.Order, "searching for just * shouldn't return any results") - fileInfos, resp = Client.SearchFiles(th.BasicTeam.Id, "fileInfo1 fileInfo2", true) - CheckNoError(t, resp) + fileInfos, _, err = client.SearchFiles(th.BasicTeam.Id, "fileInfo1 fileInfo2", true) + require.NoError(t, err) require.Len(t, fileInfos.Order, 2, "wrong search results") - _, resp = Client.SearchFiles("junk", "#sgtitlereview", false) + _, resp, err := client.SearchFiles("junk", "#sgtitlereview", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.SearchFiles(model.NewId(), "#sgtitlereview", false) + _, resp, err = client.SearchFiles(model.NewId(), "#sgtitlereview", false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.SearchFiles(th.BasicTeam.Id, "", false) + _, resp, err = client.SearchFiles(th.BasicTeam.Id, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.SearchFiles(th.BasicTeam.Id, "#sgtitlereview", false) + client.Logout() + _, resp, err = client.SearchFiles(th.BasicTeam.Id, "#sgtitlereview", false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } diff --git a/api4/group_test.go b/api4/group_test.go index 25aeb7b32c..402cf156ed 100644 --- a/api4/group_test.go +++ b/api4/group_test.go @@ -21,25 +21,27 @@ func TestGetGroup(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - _, response := th.Client.GetGroup(g.Id, "") + _, response, err := th.Client.GetGroup(g.Id, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.GetGroup(g.Id, "") + _, response, err = th.SystemAdminClient.GetGroup(g.Id, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - group, response := th.SystemAdminClient.GetGroup(g.Id, "") - CheckNoError(t, response) + group, _, err := th.SystemAdminClient.GetGroup(g.Id, "") + require.NoError(t, err) assert.Equal(t, g.DisplayName, group.DisplayName) assert.Equal(t, g.Name, group.Name) @@ -50,14 +52,17 @@ func TestGetGroup(t *testing.T) { assert.Equal(t, g.UpdateAt, group.UpdateAt) assert.Equal(t, g.DeleteAt, group.DeleteAt) - _, response = th.SystemAdminClient.GetGroup(model.NewId(), "") + _, response, err = th.SystemAdminClient.GetGroup(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.GetGroup("12345", "") + _, response, err = th.SystemAdminClient.GetGroup("12345", "") + require.Error(t, err) CheckBadRequestStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.GetGroup(group.Id, "") + _, response, err = th.SystemAdminClient.GetGroup(group.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -66,14 +71,14 @@ func TestPatchGroup(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) updateFmt := "%s_updated" @@ -87,19 +92,22 @@ func TestPatchGroup(t *testing.T) { Description: &newDescription, } - _, response := th.Client.PatchGroup(g.Id, gp) + _, response, err := th.Client.PatchGroup(g.Id, gp) + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.PatchGroup(g.Id, gp) + _, response, err = th.SystemAdminClient.PatchGroup(g.Id, gp) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - group2, response := th.SystemAdminClient.PatchGroup(g.Id, gp) + group2, response, err := th.SystemAdminClient.PatchGroup(g.Id, gp) + require.NoError(t, err) CheckOKStatus(t, response) - group, response := th.SystemAdminClient.GetGroup(g.Id, "") - CheckNoError(t, response) + group, _, err := th.SystemAdminClient.GetGroup(g.Id, "") + require.NoError(t, err) assert.Equal(t, *gp.DisplayName, group.DisplayName) assert.Equal(t, *gp.DisplayName, group2.DisplayName) @@ -119,11 +127,13 @@ func TestPatchGroup(t *testing.T) { assert.Equal(t, g.DeleteAt, group.DeleteAt) assert.Equal(t, g.DeleteAt, group2.DeleteAt) - _, response = th.SystemAdminClient.PatchGroup(model.NewId(), gp) + _, response, err = th.SystemAdminClient.PatchGroup(model.NewId(), gp) + require.Error(t, err) CheckNotFoundStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.PatchGroup(group.Id, gp) + _, response, err = th.SystemAdminClient.PatchGroup(group.Id, gp) + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -132,35 +142,37 @@ func TestLinkGroupTeam(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), } - _, response := th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err := th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) - assert.NotNil(t, response.Error) + _, _, err = th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + assert.Error(t, err) th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) th.Client.Logout() th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - groupTeam, response := th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + groupTeam, response, _ := th.Client.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) assert.NotNil(t, groupTeam) } @@ -170,39 +182,41 @@ func TestLinkGroupChannel(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), } - _, response := th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err := th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - groupTeam, response := th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + groupTeam, response, _ := th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) assert.Equal(t, th.BasicChannel.TeamId, groupTeam.TeamID) assert.NotNil(t, groupTeam) - _, response = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) th.Client.Logout() th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - _, response = th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) - assert.NotNil(t, response.Error) + _, _, err = th.Client.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + assert.Error(t, err) } func TestUnlinkGroupTeam(t *testing.T) { @@ -210,14 +224,14 @@ func TestUnlinkGroupTeam(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), @@ -225,30 +239,34 @@ func TestUnlinkGroupTeam(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) th.App.Srv().SetLicense(nil) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + response, err := th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + require.Error(t, err) CheckNotImplementedStatus(t, response) - response = th.SystemAdminClient.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + response, err = th.SystemAdminClient.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) - assert.NotNil(t, response.Error) + _, err = th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + assert.Error(t, err) time.Sleep(2 * time.Second) // A hack to let "go c.App.SyncRolesAndMembership" finish before moving on. th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) - ok, response := th.Client.Logout() - assert.True(t, ok) + response, err = th.Client.Logout() + require.NoError(t, err) CheckOKStatus(t, response) - _, response = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + _, response, err = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) CheckOKStatus(t, response) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + response, err = th.Client.UnlinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam) + require.NoError(t, err) CheckOKStatus(t, response) } @@ -257,14 +275,14 @@ func TestUnlinkGroupChannel(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), @@ -272,34 +290,36 @@ func TestUnlinkGroupChannel(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) th.App.Srv().SetLicense(nil) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + response, err := th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + require.Error(t, err) CheckNotImplementedStatus(t, response) - response = th.SystemAdminClient.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + response, err = th.SystemAdminClient.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) th.Client.Logout() th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) - assert.NotNil(t, response.Error) + _, err = th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + assert.Error(t, err) - _, response = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "channel_admin channel_user") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "channel_admin channel_user") + require.NoError(t, err) th.Client.Logout() th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - response = th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) - assert.Nil(t, response.Error) + _, err = th.Client.UnlinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel) + assert.NoError(t, err) } func TestGetGroupTeam(t *testing.T) { @@ -307,19 +327,21 @@ func TestGetGroupTeam(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - _, response := th.Client.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + _, response, err := th.Client.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) @@ -328,10 +350,11 @@ func TestGetGroupTeam(t *testing.T) { AutoAdd: model.NewBool(true), } - _, response = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, _ = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) - groupSyncable, response := th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + groupSyncable, response, err := th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.NoError(t, err) CheckOKStatus(t, response) assert.NotNil(t, groupSyncable) @@ -339,20 +362,25 @@ func TestGetGroupTeam(t *testing.T) { assert.Equal(t, th.BasicTeam.Id, groupSyncable.SyncableId) assert.Equal(t, *patch.AutoAdd, groupSyncable.AutoAdd) - _, response = th.SystemAdminClient.GetGroupSyncable(model.NewId(), th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(model.NewId(), th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable("asdfasdfe3", th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable("asdfasdfe3", th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckBadRequestStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, "asdfasdfe3", model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, "asdfasdfe3", model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckBadRequestStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -361,19 +389,21 @@ func TestGetGroupChannel(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - _, response := th.Client.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + _, response, err := th.Client.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) @@ -382,10 +412,11 @@ func TestGetGroupChannel(t *testing.T) { AutoAdd: model.NewBool(true), } - _, response = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, _ = th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) - groupSyncable, response := th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + groupSyncable, response, err := th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.NoError(t, err) CheckOKStatus(t, response) assert.NotNil(t, groupSyncable) @@ -393,20 +424,25 @@ func TestGetGroupChannel(t *testing.T) { assert.Equal(t, th.BasicChannel.Id, groupSyncable.SyncableId) assert.Equal(t, *patch.AutoAdd, groupSyncable.AutoAdd) - _, response = th.SystemAdminClient.GetGroupSyncable(model.NewId(), th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(model.NewId(), th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable("asdfasdfe3", th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable("asdfasdfe3", th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckBadRequestStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, "asdfasdfe3", model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, "asdfasdfe3", model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckBadRequestStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -415,14 +451,14 @@ func TestGetGroupTeams(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) @@ -432,30 +468,34 @@ func TestGetGroupTeams(t *testing.T) { for i := 0; i < 10; i++ { team := th.CreateTeam() - _, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, team.Id, model.GroupSyncableTypeTeam, patch) + _, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, team.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) } th.App.Srv().SetLicense(nil) - _, response := th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + _, response, err := th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + _, response, _ = th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") assert.Equal(t, http.StatusForbidden, response.StatusCode) - groupSyncables, response := th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + groupSyncables, response, err := th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + require.NoError(t, err) CheckOKStatus(t, response) assert.Len(t, groupSyncables, 10) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + _, response, err = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeTeam, "") + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -464,14 +504,14 @@ func TestGetGroupChannels(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) @@ -481,30 +521,33 @@ func TestGetGroupChannels(t *testing.T) { for i := 0; i < 10; i++ { channel := th.CreatePublicChannel() - _, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, channel.Id, model.GroupSyncableTypeChannel, patch) + _, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, channel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) } th.App.Srv().SetLicense(nil) - _, response := th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + _, response, err := th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) - _, response = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + _, response, _ = th.Client.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") assert.Equal(t, http.StatusForbidden, response.StatusCode) - groupSyncables, response := th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + groupSyncables, response, _ := th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") CheckOKStatus(t, response) assert.Len(t, groupSyncables, 10) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + _, response, err = th.SystemAdminClient.GetGroupSyncables(g.Id, model.GroupSyncableTypeChannel, "") + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -513,14 +556,14 @@ func TestPatchGroupTeam(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), @@ -528,23 +571,25 @@ func TestPatchGroupTeam(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - groupSyncable, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + groupSyncable, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) assert.NotNil(t, groupSyncable) assert.True(t, groupSyncable.AutoAdd) - _, response = th.Client.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, _ = th.Client.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) assert.Equal(t, http.StatusForbidden, response.StatusCode) th.App.Srv().SetLicense(nil) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err := th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) patch.AutoAdd = model.NewBool(false) - groupSyncable, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + groupSyncable, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.NoError(t, err) CheckOKStatus(t, response) assert.False(t, groupSyncable.AutoAdd) @@ -553,23 +598,28 @@ func TestPatchGroupTeam(t *testing.T) { assert.Equal(t, model.GroupSyncableTypeTeam, groupSyncable.Type) patch.AutoAdd = model.NewBool(true) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, _ = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) CheckOKStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(model.NewId(), th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(model.NewId(), th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable("abc", th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable("abc", th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckBadRequestStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, "abc", model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, "abc", model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckBadRequestStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicTeam.Id, model.GroupSyncableTypeTeam, patch) + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -578,14 +628,14 @@ func TestPatchGroupChannel(t *testing.T) { defer th.TearDown() id := model.NewId() - g, err := th.App.CreateGroup(&model.Group{ + g, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) patch := &model.GroupSyncablePatch{ AutoAdd: model.NewBool(true), @@ -593,32 +643,34 @@ func TestPatchGroupChannel(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - groupSyncable, response := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + groupSyncable, response, _ := th.SystemAdminClient.LinkGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusCreated, response.StatusCode) assert.NotNil(t, groupSyncable) assert.True(t, groupSyncable.AutoAdd) - role, err := th.App.GetRoleByName(context.Background(), "channel_user") - require.Nil(t, err) + role, appErr := th.App.GetRoleByName(context.Background(), "channel_user") + require.Nil(t, appErr) originalPermissions := role.Permissions - _, err = th.App.PatchRole(role, &model.RolePatch{Permissions: &[]string{}}) - require.Nil(t, err) + _, appErr = th.App.PatchRole(role, &model.RolePatch{Permissions: &[]string{}}) + require.Nil(t, appErr) - _, response = th.Client.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, _ = th.Client.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) assert.Equal(t, http.StatusForbidden, response.StatusCode) - _, err = th.App.PatchRole(role, &model.RolePatch{Permissions: &originalPermissions}) - require.Nil(t, err) + _, appErr = th.App.PatchRole(role, &model.RolePatch{Permissions: &originalPermissions}) + require.Nil(t, appErr) th.App.Srv().SetLicense(nil) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err := th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) patch.AutoAdd = model.NewBool(false) - groupSyncable, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + groupSyncable, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.NoError(t, err) CheckOKStatus(t, response) assert.False(t, groupSyncable.AutoAdd) @@ -628,23 +680,29 @@ func TestPatchGroupChannel(t *testing.T) { assert.Equal(t, model.GroupSyncableTypeChannel, groupSyncable.Type) patch.AutoAdd = model.NewBool(true) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.NoError(t, err) CheckOKStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(model.NewId(), th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(model.NewId(), th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, model.NewId(), model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckNotFoundStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable("abc", th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable("abc", th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckBadRequestStatus(t, response) - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, "abc", model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, "abc", model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckBadRequestStatus(t, response) th.SystemAdminClient.Logout() - _, response = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + _, response, err = th.SystemAdminClient.PatchGroupSyncable(g.Id, th.BasicChannel.Id, model.GroupSyncableTypeChannel, patch) + require.Error(t, err) CheckUnauthorizedStatus(t, response) } @@ -653,22 +711,22 @@ func TestGetGroupsByChannel(t *testing.T) { defer th.TearDown() id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - groupSyncable, err := th.App.UpsertGroupSyncable(&model.GroupSyncable{ + groupSyncable, appErr := th.App.UpsertGroupSyncable(&model.GroupSyncable{ AutoAdd: true, SyncableId: th.BasicChannel.Id, Type: model.GroupSyncableTypeChannel, GroupId: group.Id, }) - assert.Nil(t, err) + assert.Nil(t, appErr) opts := model.GroupSearchOpts{ PageOpts: &model.PageOpts{ @@ -678,14 +736,16 @@ func TestGetGroupsByChannel(t *testing.T) { } th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, _, response := client.GetGroupsByChannel("asdfasdf", opts) + _, _, response, err := client.GetGroupsByChannel("asdfasdf", opts) + require.Error(t, err) CheckBadRequestStatus(t, response) }) th.App.Srv().SetLicense(nil) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, _, response := client.GetGroupsByChannel(th.BasicChannel.Id, opts) + _, _, response, err := client.GetGroupsByChannel(th.BasicChannel.Id, opts) + require.Error(t, err) CheckNotImplementedStatus(t, response) }) @@ -693,12 +753,14 @@ func TestGetGroupsByChannel(t *testing.T) { privateChannel := th.CreateChannelWithClient(th.SystemAdminClient, model.ChannelTypePrivate) - _, _, response := th.Client.GetGroupsByChannel(privateChannel.Id, opts) + _, _, response, err := th.Client.GetGroupsByChannel(privateChannel.Id, opts) + require.Error(t, err) CheckForbiddenStatus(t, response) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - groups, _, response := client.GetGroupsByChannel(th.BasicChannel.Id, opts) - assert.Nil(t, response.Error) + var groups []*model.GroupWithSchemeAdmin + groups, _, _, err = client.GetGroupsByChannel(th.BasicChannel.Id, opts) + assert.NoError(t, err) assert.ElementsMatch(t, []*model.GroupWithSchemeAdmin{{Group: *group, SchemeAdmin: model.NewBool(false)}}, groups) require.NotNil(t, groups[0].SchemeAdmin) require.False(t, *groups[0].SchemeAdmin) @@ -706,19 +768,19 @@ func TestGetGroupsByChannel(t *testing.T) { // set syncable to true groupSyncable.SchemeAdmin = true - _, err = th.App.UpdateGroupSyncable(groupSyncable) - require.Nil(t, err) + _, appErr = th.App.UpdateGroupSyncable(groupSyncable) + require.Nil(t, appErr) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - groups, _, response := client.GetGroupsByChannel(th.BasicChannel.Id, opts) - assert.Nil(t, response.Error) + groups, _, _, err := client.GetGroupsByChannel(th.BasicChannel.Id, opts) + assert.NoError(t, err) // ensure that SchemeAdmin field is updated assert.ElementsMatch(t, []*model.GroupWithSchemeAdmin{{Group: *group, SchemeAdmin: model.NewBool(true)}}, groups) require.NotNil(t, groups[0].SchemeAdmin) require.True(t, *groups[0].SchemeAdmin) - groups, _, response = client.GetGroupsByChannel(model.NewId(), opts) - assert.Equal(t, "app.channel.get.existing.app_error", response.Error.Id) + groups, _, _, err = client.GetGroupsByChannel(model.NewId(), opts) + CheckErrorID(t, err, "app.channel.get.existing.app_error") assert.Empty(t, groups) }) } @@ -728,22 +790,22 @@ func TestGetGroupsAssociatedToChannelsByTeam(t *testing.T) { defer th.TearDown() id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - groupSyncable, err := th.App.UpsertGroupSyncable(&model.GroupSyncable{ + groupSyncable, appErr := th.App.UpsertGroupSyncable(&model.GroupSyncable{ AutoAdd: true, SyncableId: th.BasicChannel.Id, Type: model.GroupSyncableTypeChannel, GroupId: group.Id, }) - assert.Nil(t, err) + assert.Nil(t, appErr) opts := model.GroupSearchOpts{ PageOpts: &model.PageOpts{ @@ -752,18 +814,20 @@ func TestGetGroupsAssociatedToChannelsByTeam(t *testing.T) { }, } - _, response := th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam("asdfasdf", opts) + _, response, err := th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam("asdfasdf", opts) + require.Error(t, err) CheckBadRequestStatus(t, response) th.App.Srv().SetLicense(nil) - _, response = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) + _, response, err = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - groups, response := th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) - assert.Nil(t, response.Error) + groups, _, err := th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) + assert.NoError(t, err) assert.Equal(t, map[string][]*model.GroupWithSchemeAdmin{ th.BasicChannel.Id: { @@ -776,12 +840,12 @@ func TestGetGroupsAssociatedToChannelsByTeam(t *testing.T) { // set syncable to true groupSyncable.SchemeAdmin = true - _, err = th.App.UpdateGroupSyncable(groupSyncable) - require.Nil(t, err) + _, appErr = th.App.UpdateGroupSyncable(groupSyncable) + require.Nil(t, appErr) // ensure that SchemeAdmin field is updated - groups, response = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) - assert.Nil(t, response.Error) + groups, _, err = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(th.BasicTeam.Id, opts) + assert.NoError(t, err) assert.Equal(t, map[string][]*model.GroupWithSchemeAdmin{ th.BasicChannel.Id: { @@ -792,8 +856,8 @@ func TestGetGroupsAssociatedToChannelsByTeam(t *testing.T) { require.NotNil(t, groups[th.BasicChannel.Id][0].SchemeAdmin) require.True(t, *groups[th.BasicChannel.Id][0].SchemeAdmin) - groups, response = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(model.NewId(), opts) - assert.Nil(t, response.Error) + groups, _, err = th.SystemAdminClient.GetGroupsAssociatedToChannelsByTeam(model.NewId(), opts) + assert.NoError(t, err) assert.Empty(t, groups) } @@ -827,22 +891,24 @@ func TestGetGroupsByTeam(t *testing.T) { } th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, _, response := client.GetGroupsByTeam("asdfasdf", opts) + _, _, response, err := client.GetGroupsByTeam("asdfasdf", opts) + require.Error(t, err) CheckBadRequestStatus(t, response) }) th.App.Srv().SetLicense(nil) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, _, response := client.GetGroupsByTeam(th.BasicTeam.Id, opts) + _, _, response, err := client.GetGroupsByTeam(th.BasicTeam.Id, opts) + require.Error(t, err) CheckNotImplementedStatus(t, response) }) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - groups, _, response := client.GetGroupsByTeam(th.BasicTeam.Id, opts) - assert.Nil(t, response.Error) + groups, _, _, err := client.GetGroupsByTeam(th.BasicTeam.Id, opts) + assert.NoError(t, err) assert.ElementsMatch(t, []*model.GroupWithSchemeAdmin{{Group: *group, SchemeAdmin: model.NewBool(false)}}, groups) require.NotNil(t, groups[0].SchemeAdmin) require.False(t, *groups[0].SchemeAdmin) @@ -854,15 +920,15 @@ func TestGetGroupsByTeam(t *testing.T) { require.Nil(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - groups, _, response := client.GetGroupsByTeam(th.BasicTeam.Id, opts) - assert.Nil(t, response.Error) + groups, _, _, err := client.GetGroupsByTeam(th.BasicTeam.Id, opts) + assert.NoError(t, err) // ensure that SchemeAdmin field is updated assert.ElementsMatch(t, []*model.GroupWithSchemeAdmin{{Group: *group, SchemeAdmin: model.NewBool(true)}}, groups) require.NotNil(t, groups[0].SchemeAdmin) require.True(t, *groups[0].SchemeAdmin) - groups, _, response = client.GetGroupsByTeam(model.NewId(), opts) - assert.Nil(t, response.Error) + groups, _, _, err = client.GetGroupsByTeam(model.NewId(), opts) + assert.NoError(t, err) assert.Empty(t, groups) }) } @@ -874,14 +940,14 @@ func TestGetGroups(t *testing.T) { // make sure "createdDate" for next group is after one created in InitBasic() time.Sleep(2 * time.Millisecond) id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) start := group.UpdateAt - 1 opts := model.GroupSearchOpts{ @@ -893,73 +959,74 @@ func TestGetGroups(t *testing.T) { th.App.Srv().SetLicense(nil) - _, response := th.SystemAdminClient.GetGroups(opts) + _, response, err := th.SystemAdminClient.GetGroups(opts) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.SystemAdminClient.GetGroups(opts) - require.Nil(t, response.Error) + _, _, err = th.SystemAdminClient.GetGroups(opts) + require.NoError(t, err) - _, response = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) opts.NotAssociatedToChannel = th.BasicChannel.Id - _, response = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "channel_user channel_admin") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateChannelRoles(th.BasicChannel.Id, th.BasicUser.Id, "channel_user channel_admin") + require.NoError(t, err) - groups, response := th.SystemAdminClient.GetGroups(opts) - assert.Nil(t, response.Error) + groups, _, err := th.SystemAdminClient.GetGroups(opts) + assert.NoError(t, err) assert.ElementsMatch(t, []*model.Group{group, th.Group}, groups) assert.Nil(t, groups[0].MemberCount) opts.IncludeMemberCount = true - groups, _ = th.SystemAdminClient.GetGroups(opts) + groups, _, _ = th.SystemAdminClient.GetGroups(opts) assert.NotNil(t, groups[0].MemberCount) opts.IncludeMemberCount = false opts.Q = "-fOo" - groups, _ = th.SystemAdminClient.GetGroups(opts) + groups, _, _ = th.SystemAdminClient.GetGroups(opts) assert.Len(t, groups, 1) opts.Q = "" - _, response = th.SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) opts.NotAssociatedToTeam = th.BasicTeam.Id - _, response = th.SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "team_user team_admin") - require.Nil(t, response.Error) + _, err = th.SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "team_user team_admin") + require.NoError(t, err) - _, response = th.Client.GetGroups(opts) - assert.Nil(t, response.Error) + _, _, err = th.Client.GetGroups(opts) + assert.NoError(t, err) // test "since", should only return group created in this test, not th.Group opts.Since = start - groups, response = th.Client.GetGroups(opts) - assert.Nil(t, response.Error) + groups, _, err = th.Client.GetGroups(opts) + assert.NoError(t, err) assert.Len(t, groups, 1) // test correct group returned assert.Equal(t, groups[0].Id, group.Id) // delete group, should still return th.App.DeleteGroup(group.Id) - groups, response = th.Client.GetGroups(opts) - assert.Nil(t, response.Error) + groups, _, err = th.Client.GetGroups(opts) + assert.NoError(t, err) assert.Len(t, groups, 1) assert.Equal(t, groups[0].Id, group.Id) // test with current since value, return none opts.Since = model.GetMillis() - groups, response = th.Client.GetGroups(opts) - assert.Nil(t, response.Error) + groups, _, err = th.Client.GetGroups(opts) + assert.NoError(t, err) assert.Empty(t, groups) // make sure delete group is not returned without Since opts.Since = 0 - groups, response = th.Client.GetGroups(opts) - assert.Nil(t, response.Error) + groups, _, err = th.Client.GetGroups(opts) + assert.NoError(t, err) //'Normal getGroups should not return delete groups assert.Len(t, groups, 1) // make sure it returned th.Group,not group @@ -971,59 +1038,63 @@ func TestGetGroupsByUserId(t *testing.T) { defer th.TearDown() id := model.NewId() - group1, err := th.App.CreateGroup(&model.Group{ + group1, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - user1, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user1", Password: "test-password-1", Username: "test-user-1", Roles: model.SystemUserRoleId}) - assert.Nil(t, err) + user1, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user1", Password: "test-password-1", Username: "test-user-1", Roles: model.SystemUserRoleId}) + assert.Nil(t, appErr) user1.Password = "test-password-1" - _, err = th.App.UpsertGroupMember(group1.Id, user1.Id) - assert.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group1.Id, user1.Id) + assert.Nil(t, appErr) id = model.NewId() - group2, err := th.App.CreateGroup(&model.Group{ + group2, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) - _, err = th.App.UpsertGroupMember(group2.Id, user1.Id) - assert.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group2.Id, user1.Id) + assert.Nil(t, appErr) th.App.Srv().SetLicense(nil) - _, response := th.SystemAdminClient.GetGroupsByUserId(user1.Id) + _, response, err := th.SystemAdminClient.GetGroupsByUserId(user1.Id) + require.Error(t, err) CheckNotImplementedStatus(t, response) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) - _, response = th.SystemAdminClient.GetGroupsByUserId("") + _, response, err = th.SystemAdminClient.GetGroupsByUserId("") + require.Error(t, err) CheckBadRequestStatus(t, response) - _, response = th.SystemAdminClient.GetGroupsByUserId("notvaliduserid") + _, response, err = th.SystemAdminClient.GetGroupsByUserId("notvaliduserid") + require.Error(t, err) CheckBadRequestStatus(t, response) - groups, response := th.SystemAdminClient.GetGroupsByUserId(user1.Id) - require.Nil(t, response.Error) + groups, _, err := th.SystemAdminClient.GetGroupsByUserId(user1.Id) + require.NoError(t, err) assert.ElementsMatch(t, []*model.Group{group1, group2}, groups) // test permissions th.Client.Logout() th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - _, response = th.Client.GetGroupsByUserId(user1.Id) + _, response, err = th.Client.GetGroupsByUserId(user1.Id) + require.Error(t, err) CheckForbiddenStatus(t, response) th.Client.Logout() th.Client.Login(user1.Email, user1.Password) - groups, response = th.Client.GetGroupsByUserId(user1.Id) - require.Nil(t, response.Error) + groups, _, err = th.Client.GetGroupsByUserId(user1.Id) + require.NoError(t, err) assert.ElementsMatch(t, []*model.Group{group1, group2}, groups) } @@ -1033,20 +1104,18 @@ func TestGetGroupStats(t *testing.T) { defer th.TearDown() id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) - - var response *model.Response - var stats *model.GroupStats + assert.Nil(t, appErr) t.Run("Requires ldap license", func(t *testing.T) { - _, response = th.SystemAdminClient.GetGroupStats(group.Id) + _, response, err := th.SystemAdminClient.GetGroupStats(group.Id) + require.Error(t, err) CheckNotImplementedStatus(t, response) }) @@ -1054,23 +1123,24 @@ func TestGetGroupStats(t *testing.T) { t.Run("Requires manage system permission to access group stats", func(t *testing.T) { th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - _, response = th.Client.GetGroupStats(group.Id) + _, response, err := th.Client.GetGroupStats(group.Id) + require.Error(t, err) CheckForbiddenStatus(t, response) }) t.Run("Returns stats for a group with no members", func(t *testing.T) { - stats, _ = th.SystemAdminClient.GetGroupStats(group.Id) + stats, _, _ := th.SystemAdminClient.GetGroupStats(group.Id) assert.Equal(t, stats.GroupID, group.Id) assert.Equal(t, stats.TotalMemberCount, int64(0)) }) user1, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user1", Password: "test-password-1", Username: "test-user-1", Roles: model.SystemUserRoleId}) assert.Nil(t, err) - _, err = th.App.UpsertGroupMember(group.Id, user1.Id) - assert.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group.Id, user1.Id) + assert.Nil(t, appErr) t.Run("Returns stats for a group with members", func(t *testing.T) { - stats, _ = th.SystemAdminClient.GetGroupStats(group.Id) + stats, _, _ := th.SystemAdminClient.GetGroupStats(group.Id) assert.Equal(t, stats.GroupID, group.Id) assert.Equal(t, stats.TotalMemberCount, int64(1)) }) @@ -1106,55 +1176,55 @@ func TestGetGroupsGroupConstrainedParentTeam(t *testing.T) { TeamId: team.Id, GroupConstrained: model.NewBool(true), } - channel, err := th.App.CreateChannel(th.Context, channel, false) - require.Nil(t, err) + channel, appErr := th.App.CreateChannel(th.Context, channel, false) + require.Nil(t, appErr) // normal result of groups are returned if the team is not group-constrained - apiGroups, response := th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id}) - require.Nil(t, response.Error) + apiGroups, _, err := th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id}) + require.NoError(t, err) require.Contains(t, apiGroups, groups[0]) require.Contains(t, apiGroups, groups[1]) require.Contains(t, apiGroups, groups[2]) team.GroupConstrained = model.NewBool(true) - team, err = th.App.UpdateTeam(team) - require.Nil(t, err) + team, appErr = th.App.UpdateTeam(team) + require.Nil(t, appErr) // team is group-constrained but has no associated groups - apiGroups, response = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true}) - require.Nil(t, response.Error) + apiGroups, _, err = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true}) + require.NoError(t, err) require.Len(t, apiGroups, 0) for _, group := range []*model.Group{groups[0], groups[2], groups[3]} { - _, err = th.App.UpsertGroupSyncable(model.NewGroupTeam(group.Id, team.Id, false)) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupSyncable(model.NewGroupTeam(group.Id, team.Id, false)) + require.Nil(t, appErr) } // set of the teams groups are returned - apiGroups, response = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true}) - require.Nil(t, response.Error) + apiGroups, _, err = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true}) + require.NoError(t, err) require.Contains(t, apiGroups, groups[0]) require.NotContains(t, apiGroups, groups[1]) require.Contains(t, apiGroups, groups[2]) // paged results function as expected - apiGroups, response = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true, PageOpts: &model.PageOpts{PerPage: 2, Page: 0}}) - require.Nil(t, response.Error) + apiGroups, _, err = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true, PageOpts: &model.PageOpts{PerPage: 2, Page: 0}}) + require.NoError(t, err) require.Len(t, apiGroups, 2) require.Equal(t, apiGroups[0].Id, groups[0].Id) require.Equal(t, apiGroups[1].Id, groups[2].Id) - apiGroups, response = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true, PageOpts: &model.PageOpts{PerPage: 2, Page: 1}}) - require.Nil(t, response.Error) + apiGroups, _, err = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id, FilterParentTeamPermitted: true, PageOpts: &model.PageOpts{PerPage: 2, Page: 1}}) + require.NoError(t, err) require.Len(t, apiGroups, 1) require.Equal(t, apiGroups[0].Id, groups[3].Id) - _, err = th.App.UpsertGroupSyncable(model.NewGroupChannel(groups[0].Id, channel.Id, false)) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupSyncable(model.NewGroupChannel(groups[0].Id, channel.Id, false)) + require.Nil(t, appErr) // as usual it doesn't return groups already associated to the channel - apiGroups, response = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id}) - require.Nil(t, response.Error) + apiGroups, _, err = th.SystemAdminClient.GetGroups(model.GroupSearchOpts{NotAssociatedToChannel: channel.Id}) + require.NoError(t, err) require.NotContains(t, apiGroups, groups[0]) require.Contains(t, apiGroups, groups[2]) } diff --git a/api4/import_test.go b/api4/import_test.go index 8811f91d39..165703adad 100644 --- a/api4/import_test.go +++ b/api4/import_test.go @@ -38,21 +38,21 @@ func TestListImports(t *testing.T) { us.UserId = model.UploadNoUserID } - u, resp := c.CreateUpload(us) - require.Nil(t, resp.Error) + u, _, err := c.CreateUpload(us) + require.NoError(t, err) require.NotNil(t, u) - finfo, resp := c.UploadData(u.Id, file) - require.Nil(t, resp.Error) + finfo, _, err := c.UploadData(u.Id, file) + require.NoError(t, err) require.NotNil(t, finfo) return u.Id } t.Run("no permissions", func(t *testing.T) { - imports, resp := th.Client.ListImports() - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + imports, _, err := th.Client.ListImports() + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Nil(t, imports) }) @@ -60,8 +60,8 @@ func TestListImports(t *testing.T) { require.True(t, found) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - imports, resp := c.ListImports() - require.Nil(t, resp.Error) + imports, _, err := c.ListImports() + require.NoError(t, err) require.Empty(t, imports) }, "no imports") @@ -74,8 +74,8 @@ func TestListImports(t *testing.T) { require.NoError(t, err) f.Close() - imports, resp := c.ListImports() - require.Nil(t, resp.Error) + imports, _, err := c.ListImports() + require.NoError(t, err) require.NotEmpty(t, imports) require.Len(t, imports, 2) require.Contains(t, imports, id+"_import_test.zip") @@ -90,13 +90,13 @@ func TestListImports(t *testing.T) { importDir := filepath.Join(dataDir, "import_new") - imports, resp := c.ListImports() - require.Nil(t, resp.Error) + imports, _, err := c.ListImports() + require.NoError(t, err) require.Empty(t, imports) id := uploadNewImport(c, t) - imports, resp = c.ListImports() - require.Nil(t, resp.Error) + imports, _, err = c.ListImports() + require.NoError(t, err) require.NotEmpty(t, imports) require.Len(t, imports, 1) require.Equal(t, id+"_import_test.zip", imports[0]) diff --git a/api4/integration_action_test.go b/api4/integration_action_test.go index eca8c8a955..8b62200b2c 100644 --- a/api4/integration_action_test.go +++ b/api4/integration_action_test.go @@ -43,7 +43,7 @@ func (th *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func TestPostActionCookies(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost,127.0.0.1" @@ -127,14 +127,12 @@ func TestPostActionCookies(t *testing.T) { assert.Equal(t, 32, len(th.App.PostActionCookieSecret())) post = model.AddPostActionCookies(post, th.App.PostActionCookieSecret()) - ok, resp := Client.DoPostActionWithCookie(post.Id, test.Action.Id, "", test.Action.Cookie) + resp, err := client.DoPostActionWithCookie(post.Id, test.Action.Id, "", test.Action.Cookie) require.NotNil(t, resp) if test.ExpectedSucess { - assert.True(t, ok) - assert.Nil(t, resp.Error) + assert.NoError(t, err) } else { - assert.False(t, ok) - assert.NotNil(t, resp.Error) + assert.Error(t, err) } assert.Equal(t, test.ExpectedStatusCode, resp.StatusCode) assert.NotNil(t, resp.RequestId) @@ -146,14 +144,14 @@ func TestPostActionCookies(t *testing.T) { func TestOpenDialog(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost,127.0.0.1" }) - _, triggerId, err := model.GenerateTriggerId(th.BasicUser.Id, th.App.AsymmetricSigningKey()) - require.Nil(t, err) + _, triggerId, appErr := model.GenerateTriggerId(th.BasicUser.Id, th.App.AsymmetricSigningKey()) + require.Nil(t, appErr) request := model.OpenDialogRequest{ TriggerId: triggerId, @@ -175,51 +173,47 @@ func TestOpenDialog(t *testing.T) { }, } - pass, resp := Client.OpenInteractiveDialog(request) - CheckNoError(t, resp) - assert.True(t, pass) + _, err := client.OpenInteractiveDialog(request) + require.NoError(t, err) // Should fail on bad trigger ID request.TriggerId = "junk" - pass, resp = Client.OpenInteractiveDialog(request) + resp, err := client.OpenInteractiveDialog(request) + require.Error(t, err) CheckBadRequestStatus(t, resp) - assert.False(t, pass) // URL is required request.TriggerId = triggerId request.URL = "" - pass, resp = Client.OpenInteractiveDialog(request) + resp, err = client.OpenInteractiveDialog(request) + require.Error(t, err) CheckBadRequestStatus(t, resp) - assert.False(t, pass) // Should pass with markdown formatted introduction text request.URL = "http://localhost:8065" request.Dialog.IntroductionText = "**Some** _introduction text" - pass, resp = Client.OpenInteractiveDialog(request) - CheckNoError(t, resp) - assert.True(t, pass) + _, err = client.OpenInteractiveDialog(request) + require.NoError(t, err) // Should pass with empty introduction text request.Dialog.IntroductionText = "" - pass, resp = Client.OpenInteractiveDialog(request) - CheckNoError(t, resp) - assert.True(t, pass) + _, err = client.OpenInteractiveDialog(request) + require.NoError(t, err) // Should pass with no elements request.Dialog.Elements = nil - pass, resp = Client.OpenInteractiveDialog(request) - CheckNoError(t, resp) - assert.True(t, pass) + _, err = client.OpenInteractiveDialog(request) + require.NoError(t, err) + request.Dialog.Elements = []model.DialogElement{} - pass, resp = Client.OpenInteractiveDialog(request) - CheckNoError(t, resp) - assert.True(t, pass) + _, err = client.OpenInteractiveDialog(request) + require.NoError(t, err) } func TestSubmitDialog(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost,127.0.0.1" @@ -253,25 +247,28 @@ func TestSubmitDialog(t *testing.T) { submit.URL = ts.URL - submitResp, resp := Client.SubmitInteractiveDialog(submit) - CheckNoError(t, resp) + submitResp, _, err := client.SubmitInteractiveDialog(submit) + require.NoError(t, err) assert.NotNil(t, submitResp) submit.URL = "" - submitResp, resp = Client.SubmitInteractiveDialog(submit) + submitResp, resp, err := client.SubmitInteractiveDialog(submit) + require.Error(t, err) CheckBadRequestStatus(t, resp) assert.Nil(t, submitResp) submit.URL = ts.URL submit.ChannelId = model.NewId() - submitResp, resp = Client.SubmitInteractiveDialog(submit) + submitResp, resp, err = client.SubmitInteractiveDialog(submit) + require.Error(t, err) CheckForbiddenStatus(t, resp) assert.Nil(t, submitResp) submit.URL = ts.URL submit.ChannelId = th.BasicChannel.Id submit.TeamId = model.NewId() - submitResp, resp = Client.SubmitInteractiveDialog(submit) + submitResp, resp, err = client.SubmitInteractiveDialog(submit) + require.Error(t, err) CheckForbiddenStatus(t, resp) assert.Nil(t, submitResp) } diff --git a/api4/job_test.go b/api4/job_test.go index 546f2b45bc..422843050d 100644 --- a/api4/job_test.go +++ b/api4/job_test.go @@ -25,11 +25,12 @@ func TestCreateJob(t *testing.T) { }, } - _, resp := th.SystemManagerClient.CreateJob(job) + _, resp, err := th.SystemManagerClient.CreateJob(job) + require.Error(t, err) CheckForbiddenStatus(t, resp) - received, resp := th.SystemAdminClient.CreateJob(job) - require.Nil(t, resp.Error) + received, _, err := th.SystemAdminClient.CreateJob(job) + require.NoError(t, err) defer th.App.Srv().Store.Job().Delete(received.Id) @@ -37,11 +38,13 @@ func TestCreateJob(t *testing.T) { Type: model.NewId(), } - _, resp = th.SystemAdminClient.CreateJob(job) + _, resp, err = th.SystemAdminClient.CreateJob(job) + require.Error(t, err) CheckBadRequestStatus(t, resp) job.Type = model.JobTypeElasticsearchPostIndexing - _, resp = th.Client.CreateJob(job) + _, resp, err = th.Client.CreateJob(job) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -59,19 +62,22 @@ func TestGetJob(t *testing.T) { defer th.App.Srv().Store.Job().Delete(job.Id) - received, resp := th.SystemAdminClient.GetJob(job.Id) - require.Nil(t, resp.Error) + received, _, err := th.SystemAdminClient.GetJob(job.Id) + require.NoError(t, err) require.Equal(t, job.Id, received.Id, "incorrect job received") require.Equal(t, job.Status, received.Status, "incorrect job received") - _, resp = th.SystemAdminClient.GetJob("1234") + _, resp, err := th.SystemAdminClient.GetJob("1234") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.GetJob(job.Id) + _, resp, err = th.Client.GetJob(job.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetJob(model.NewId()) + _, resp, err = th.SystemAdminClient.GetJob(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) } @@ -106,19 +112,20 @@ func TestGetJobs(t *testing.T) { defer th.App.Srv().Store.Job().Delete(job.Id) } - received, resp := th.SystemAdminClient.GetJobs(0, 2) - require.Nil(t, resp.Error) + received, _, err := th.SystemAdminClient.GetJobs(0, 2) + require.NoError(t, err) require.Len(t, received, 2, "received wrong number of jobs") require.Equal(t, jobs[2].Id, received[0].Id, "should've received newest job first") require.Equal(t, jobs[0].Id, received[1].Id, "should've received second newest job second") - received, resp = th.SystemAdminClient.GetJobs(1, 2) - require.Nil(t, resp.Error) + received, _, err = th.SystemAdminClient.GetJobs(1, 2) + require.NoError(t, err) require.Equal(t, jobs[1].Id, received[0].Id, "should've received oldest job last") - _, resp = th.Client.GetJobs(0, 60) + _, resp, err := th.Client.GetJobs(0, 60) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -157,30 +164,33 @@ func TestGetJobsByType(t *testing.T) { defer th.App.Srv().Store.Job().Delete(job.Id) } - received, resp := th.SystemAdminClient.GetJobsByType(jobType, 0, 2) - require.Nil(t, resp.Error) + received, _, err := th.SystemAdminClient.GetJobsByType(jobType, 0, 2) + require.NoError(t, err) require.Len(t, received, 2, "received wrong number of jobs") require.Equal(t, jobs[2].Id, received[0].Id, "should've received newest job first") require.Equal(t, jobs[0].Id, received[1].Id, "should've received second newest job second") - received, resp = th.SystemAdminClient.GetJobsByType(jobType, 1, 2) - require.Nil(t, resp.Error) + received, _, err = th.SystemAdminClient.GetJobsByType(jobType, 1, 2) + require.NoError(t, err) require.Len(t, received, 1, "received wrong number of jobs") require.Equal(t, jobs[1].Id, received[0].Id, "should've received oldest job last") - _, resp = th.SystemAdminClient.GetJobsByType("", 0, 60) + _, resp, err := th.SystemAdminClient.GetJobsByType("", 0, 60) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = th.SystemAdminClient.GetJobsByType(strings.Repeat("a", 33), 0, 60) + _, resp, err = th.SystemAdminClient.GetJobsByType(strings.Repeat("a", 33), 0, 60) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.GetJobsByType(jobType, 0, 60) + _, resp, err = th.Client.GetJobsByType(jobType, 0, 60) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemManagerClient.GetJobsByType(model.JobTypeElasticsearchPostIndexing, 0, 60) - require.Nil(t, resp.Error) + _, _, err = th.SystemManagerClient.GetJobsByType(model.JobTypeElasticsearchPostIndexing, 0, 60) + require.NoError(t, err) } func TestDownloadJob(t *testing.T) { @@ -197,7 +207,8 @@ func TestDownloadJob(t *testing.T) { } // DownloadExportResults is not set to true so we should get a not implemented error status - _, resp := th.Client.DownloadJob(job.Id) + _, resp, err := th.Client.DownloadJob(job.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { @@ -205,16 +216,18 @@ func TestDownloadJob(t *testing.T) { }) // Normal user cannot download the results of these job (non-existent job) - _, resp = th.Client.DownloadJob(job.Id) + _, resp, err = th.Client.DownloadJob(job.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) // System admin trying to download the results of a non-existent job - _, resp = th.SystemAdminClient.DownloadJob(job.Id) + _, resp, err = th.SystemAdminClient.DownloadJob(job.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) // Here we have a job that exist in our database but the results do not exist therefore when we try to download the results // as a system admin, we should get a not found status. - _, err := th.App.Srv().Store.Job().Save(job) + _, err = th.App.Srv().Store.Job().Save(job) require.NoError(t, err) defer th.App.Srv().Store.Job().Delete(job.Id) @@ -224,14 +237,17 @@ func TestDownloadJob(t *testing.T) { os.Create(filePath) // Normal user cannot download the results of these job (not the right permission) - _, resp = th.Client.DownloadJob(job.Id) + _, resp, err = th.Client.DownloadJob(job.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - + th.SystemManagerClient.DownloadJob(job.Id) // System manager with default permissions cannot download the results of these job (Doesn't have correct permissions) - _, resp = th.SystemManagerClient.DownloadJob(job.Id) + _, resp, err = th.SystemManagerClient.DownloadJob(job.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.DownloadJob(job.Id) + _, resp, err = th.SystemAdminClient.DownloadJob(job.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) job.Data["is_downloadable"] = "true" @@ -239,7 +255,8 @@ func TestDownloadJob(t *testing.T) { require.True(t, updateStatus) require.NoError(t, err) - _, resp = th.SystemAdminClient.DownloadJob(job.Id) + _, resp, err = th.SystemAdminClient.DownloadJob(job.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) // Now we stub the results of the job into the same directory and try to download it again @@ -249,8 +266,8 @@ func TestDownloadJob(t *testing.T) { require.NoError(t, mkdirAllErr) os.Create(filePath) - _, resp = th.SystemAdminClient.DownloadJob(job.Id) - require.Nil(t, resp.Error) + _, _, err = th.SystemAdminClient.DownloadJob(job.Id) + require.NoError(t, err) // Here we are creating a new job which doesn't have type of message export jobName = model.NewId() @@ -267,7 +284,8 @@ func TestDownloadJob(t *testing.T) { defer th.App.Srv().Store.Job().Delete(job.Id) // System admin shouldn't be able to download since the job type is not message export - _, resp = th.SystemAdminClient.DownloadJob(job.Id) + _, resp, err = th.SystemAdminClient.DownloadJob(job.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) } @@ -300,18 +318,21 @@ func TestCancelJob(t *testing.T) { defer th.App.Srv().Store.Job().Delete(job.Id) } - _, resp := th.Client.CancelJob(jobs[0].Id) + resp, err := th.Client.CancelJob(jobs[0].Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.CancelJob(jobs[0].Id) - require.Nil(t, resp.Error) + _, err = th.SystemAdminClient.CancelJob(jobs[0].Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.CancelJob(jobs[1].Id) - require.Nil(t, resp.Error) + _, err = th.SystemAdminClient.CancelJob(jobs[1].Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.CancelJob(jobs[2].Id) + resp, err = th.SystemAdminClient.CancelJob(jobs[2].Id) + require.Error(t, err) CheckInternalErrorStatus(t, resp) - _, resp = th.SystemAdminClient.CancelJob(model.NewId()) + resp, err = th.SystemAdminClient.CancelJob(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) } diff --git a/api4/ldap_test.go b/api4/ldap_test.go index 8aec812fbc..b90e4a12b1 100644 --- a/api4/ldap_test.go +++ b/api4/ldap_test.go @@ -104,23 +104,24 @@ func TestTestLdap(t *testing.T) { defer th.TearDown() th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.TestLdap() + resp, err := client.TestLdap() CheckNotImplementedStatus(t, resp) - require.NotNil(t, resp.Error) - require.Equal(t, "api.ldap_groups.license_error", resp.Error.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.ldap_groups.license_error") }) th.App.Srv().SetLicense(model.NewTestLicense("ldap_groups")) - _, resp := th.Client.TestLdap() + resp, err := th.Client.TestLdap() CheckForbiddenStatus(t, resp) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.TestLdap() + resp, err = client.TestLdap() + require.Error(t, err) CheckNotImplementedStatus(t, resp) - require.NotNil(t, resp.Error) - require.Equal(t, "ent.ldap.disabled.app_error", resp.Error.Id) + require.Error(t, err) + CheckErrorID(t, err, "ent.ldap.disabled.app_error") }) } @@ -129,10 +130,10 @@ func TestSyncLdap(t *testing.T) { defer th.TearDown() th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.TestLdap() + resp, err := client.TestLdap() CheckNotImplementedStatus(t, resp) - require.NotNil(t, resp.Error) - require.Equal(t, "api.ldap_groups.license_error", resp.Error.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.ldap_groups.license_error") }) th.App.Srv().SetLicense(model.NewTestLicense("ldap_groups")) @@ -155,18 +156,19 @@ func TestSyncLdap(t *testing.T) { th.App.Srv().Ldap = ldapMock th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.SyncLdap(false) + _, err := client.SyncLdap(false) <-ready - CheckNoError(t, resp) - require.Equal(t, false, includeRemovedMembers) + require.NoError(t, err) + require.False(t, includeRemovedMembers) - _, resp = client.SyncLdap(true) + _, err = client.SyncLdap(true) <-ready - CheckNoError(t, resp) - require.Equal(t, true, includeRemovedMembers) + require.NoError(t, err) + require.True(t, includeRemovedMembers) }) - _, resp := th.Client.SyncLdap(false) + resp, err := th.Client.SyncLdap(false) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -174,11 +176,13 @@ func TestGetLdapGroups(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.GetLdapGroups() + _, resp, err := th.Client.GetLdapGroups() + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.GetLdapGroups() + _, resp, err := client.GetLdapGroups() + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) } @@ -189,10 +193,12 @@ func TestLinkLdapGroup(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.LinkLdapGroup(entryUUID) + _, resp, err := th.Client.LinkLdapGroup(entryUUID) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.LinkLdapGroup(entryUUID) + _, resp, err = th.SystemAdminClient.LinkLdapGroup(entryUUID) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } @@ -202,10 +208,12 @@ func TestUnlinkLdapGroup(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.UnlinkLdapGroup(entryUUID) + _, resp, err := th.Client.UnlinkLdapGroup(entryUUID) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.UnlinkLdapGroup(entryUUID) + _, resp, err = th.SystemAdminClient.UnlinkLdapGroup(entryUUID) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } @@ -213,14 +221,17 @@ func TestMigrateIdLdap(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.MigrateIdLdap("objectGUID") + resp, err := th.Client.MigrateIdLdap("objectGUID") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.MigrateIdLdap("") + resp, err = client.MigrateIdLdap("") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.MigrateIdLdap("objectGUID") + resp, err = client.MigrateIdLdap("objectGUID") + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) } @@ -229,20 +240,20 @@ func TestUploadPublicCertificate(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.UploadLdapPublicCertificate([]byte(spPublicCertificate)) - require.NotNil(t, resp.Error, "Should have failed. No System Admin privileges") + _, err := th.Client.UploadLdapPublicCertificate([]byte(spPublicCertificate)) + require.Error(t, err, "Should have failed. No System Admin privileges") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.UploadLdapPublicCertificate([]byte(spPrivateKey)) - require.Nil(t, resp.Error, "Should have passed. System Admin privileges %v", resp.Error) + _, err = client.UploadLdapPublicCertificate([]byte(spPrivateKey)) + require.NoErrorf(t, err, "Should have passed. System Admin privileges %v", err) }) - _, resp = th.Client.DeleteLdapPublicCertificate() - require.NotNil(t, resp.Error, "Should have failed. No System Admin privileges") + _, err = th.Client.DeleteLdapPublicCertificate() + require.Error(t, err, "Should have failed. No System Admin privileges") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.DeleteLdapPublicCertificate() - require.Nil(t, resp.Error, "Should have passed. System Admin privileges %v", resp.Error) + _, err := client.DeleteLdapPublicCertificate() + require.NoError(t, err, "Should have passed. System Admin privileges") }) } @@ -250,19 +261,19 @@ func TestUploadPrivateCertificate(t *testing.T) { th := Setup(t) defer th.TearDown() - _, resp := th.Client.UploadLdapPrivateCertificate([]byte(spPrivateKey)) - require.NotNil(t, resp.Error, "Should have failed. No System Admin privileges") + _, err := th.Client.UploadLdapPrivateCertificate([]byte(spPrivateKey)) + require.Error(t, err, "Should have failed. No System Admin privileges") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.UploadLdapPrivateCertificate([]byte(spPrivateKey)) - require.Nil(t, resp.Error, "Should have passed. System Admin privileges %v", resp.Error) + _, err = client.UploadLdapPrivateCertificate([]byte(spPrivateKey)) + require.NoErrorf(t, err, "Should have passed. System Admin privileges %v", err) }) - _, resp = th.Client.DeleteLdapPrivateCertificate() - require.NotNil(t, resp.Error, "Should have failed. No System Admin privileges") + _, err = th.Client.DeleteLdapPrivateCertificate() + require.Error(t, err, "Should have failed. No System Admin privileges") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.DeleteLdapPrivateCertificate() - require.Nil(t, resp.Error, "Should have passed. System Admin privileges %v", resp.Error) + _, err := client.DeleteLdapPrivateCertificate() + require.NoErrorf(t, err, "Should have passed. System Admin privileges %v", err) }) } diff --git a/api4/license_test.go b/api4/license_test.go index 7e52284035..354fe3c3b9 100644 --- a/api4/license_test.go +++ b/api4/license_test.go @@ -22,30 +22,30 @@ import ( func TestGetOldClientLicense(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - license, resp := Client.GetOldClientLicense("") - CheckNoError(t, resp) + license, _, err := client.GetOldClientLicense("") + require.NoError(t, err) require.NotEqual(t, license["IsLicensed"], "", "license not returned correctly") - Client.Logout() + client.Logout() - _, resp = Client.GetOldClientLicense("") - CheckNoError(t, resp) + _, _, err = client.GetOldClientLicense("") + require.NoError(t, err) - _, err := Client.DoApiGet("/license/client", "") - require.NotNil(t, err, "get /license/client did not return an error") - require.Equal(t, err.StatusCode, http.StatusNotImplemented, + resp, err := client.DoApiGet("/license/client", "") + require.Error(t, err, "get /license/client did not return an error") + require.Equal(t, http.StatusNotImplemented, resp.StatusCode, "expected 501 Not Implemented") - _, err = Client.DoApiGet("/license/client?format=junk", "") - require.NotNil(t, err, "get /license/client?format=junk did not return an error") - require.Equal(t, err.StatusCode, http.StatusBadRequest, + resp, err = client.DoApiGet("/license/client?format=junk", "") + require.Error(t, err, "get /license/client?format=junk did not return an error") + require.Equal(t, http.StatusBadRequest, resp.StatusCode, "expected 400 Bad Request") - license, resp = th.SystemAdminClient.GetOldClientLicense("") - CheckNoError(t, resp) + license, _, err = th.SystemAdminClient.GetOldClientLicense("") + require.NoError(t, err) require.NotEmpty(t, license["IsLicensed"], "license not returned correctly") } @@ -53,34 +53,34 @@ func TestGetOldClientLicense(t *testing.T) { func TestUploadLicenseFile(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client LocalClient := th.LocalClient t.Run("as system user", func(t *testing.T) { - ok, resp := Client.UploadLicenseFile([]byte{}) + resp, err := client.UploadLicenseFile([]byte{}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - ok, resp := c.UploadLicenseFile([]byte{}) + resp, err := c.UploadLicenseFile([]byte{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok) }, "as system admin user") t.Run("as restricted system admin user", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := th.SystemAdminClient.UploadLicenseFile([]byte{}) + resp, err := th.SystemAdminClient.UploadLicenseFile([]byte{}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok) }) t.Run("restricted admin setting not honoured through local client", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := LocalClient.UploadLicenseFile([]byte{}) + resp, err := LocalClient.UploadLicenseFile([]byte{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok) }) t.Run("server has already gone through trial", func(t *testing.T) { @@ -117,10 +117,9 @@ func TestUploadLicenseFile(t *testing.T) { licenseManagerMock.On("CanStartTrial").Return(false, nil).Once() th.App.Srv().LicenseManager = licenseManagerMock - ok, resp := th.SystemAdminClient.UploadLicenseFile([]byte("sadasdasdasdasdasdsa")) - require.False(t, ok) + resp, err := th.SystemAdminClient.UploadLicenseFile([]byte("sadasdasdasdasdasdsa")) + CheckErrorID(t, err, "api.license.request-trial.can-start-trial.not-allowed") require.Equal(t, http.StatusBadRequest, resp.StatusCode) - require.Equal(t, "api.license.request-trial.can-start-trial.not-allowed", resp.Error.Id) }) t.Run("allow uploading sanctioned trials even if server already gone through trial", func(t *testing.T) { @@ -156,45 +155,42 @@ func TestUploadLicenseFile(t *testing.T) { licenseManagerMock.On("CanStartTrial").Return(false, nil).Once() th.App.Srv().LicenseManager = licenseManagerMock - ok, resp := th.SystemAdminClient.UploadLicenseFile([]byte("sadasdasdasdasdasdsa")) - require.False(t, ok) + resp, err := th.SystemAdminClient.UploadLicenseFile([]byte("sadasdasdasdasdasdsa")) + require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode) - require.Nil(t, resp.Error) }) } func TestRemoveLicenseFile(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client LocalClient := th.LocalClient t.Run("as system user", func(t *testing.T) { - ok, resp := Client.RemoveLicenseFile() + resp, err := client.RemoveLicenseFile() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - ok, resp := c.RemoveLicenseFile() - CheckNoError(t, resp) - require.True(t, ok) + _, err := c.RemoveLicenseFile() + require.NoError(t, err) }, "as system admin user") t.Run("as restricted system admin user", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := th.SystemAdminClient.RemoveLicenseFile() + resp, err := th.SystemAdminClient.RemoveLicenseFile() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok) }) t.Run("restricted admin setting not honoured through local client", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := LocalClient.RemoveLicenseFile() - CheckNoError(t, resp) - require.True(t, ok) + _, err := LocalClient.RemoveLicenseFile() + require.NoError(t, err) }) } @@ -209,32 +205,29 @@ func TestRequestTrialLicense(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.SiteURL = "http://localhost:8065/" }) t.Run("permission denied", func(t *testing.T) { - ok, resp := th.Client.RequestTrialLicense(1000) + resp, err := th.Client.RequestTrialLicense(1000) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok) }) t.Run("blank site url", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.SiteURL = "" }) defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.SiteURL = "http://localhost:8065/" }) - ok, resp := th.SystemAdminClient.RequestTrialLicense(1000) + resp, err := th.SystemAdminClient.RequestTrialLicense(1000) + CheckErrorID(t, err, "api.license.request_trial_license.no-site-url.app_error") CheckBadRequestStatus(t, resp) - require.Equal(t, "api.license.request_trial_license.no-site-url.app_error", resp.Error.Id) - require.False(t, ok) }) t.Run("trial license user count less than current users", func(t *testing.T) { - ok, resp := th.SystemAdminClient.RequestTrialLicense(1) + resp, err := th.SystemAdminClient.RequestTrialLicense(1) + CheckErrorID(t, err, "api.license.add_license.unique_users.app_error") CheckBadRequestStatus(t, resp) - require.Equal(t, "api.license.add_license.unique_users.app_error", resp.Error.Id) - require.False(t, ok) }) th.App.Srv().LicenseManager = nil t.Run("trial license should fail if LicenseManager is nil", func(t *testing.T) { - ok, resp := th.SystemAdminClient.RequestTrialLicense(1) + resp, err := th.SystemAdminClient.RequestTrialLicense(1) + CheckErrorID(t, err, "api.license.upgrade_needed.app_error") CheckForbiddenStatus(t, resp) - require.False(t, ok) - require.Equal(t, "api.license.upgrade_needed.app_error", resp.Error.Id) }) } diff --git a/api4/oauth_test.go b/api4/oauth_test.go index 52fd1934c9..d24a3a3268 100644 --- a/api4/oauth_test.go +++ b/api4/oauth_test.go @@ -17,8 +17,8 @@ import ( func TestCreateOAuthApp(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -34,8 +34,8 @@ func TestCreateOAuthApp(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}, IsTrusted: true} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, resp, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) CheckCreatedStatus(t, resp) assert.Equal(t, oapp.Name, rapp.Name, "names did not match") assert.Equal(t, oapp.IsTrusted, rapp.IsTrusted, "trusted did no match") @@ -43,40 +43,44 @@ func TestCreateOAuthApp(t *testing.T) { // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.CreateOAuthApp(oapp) + _, resp, err = client.CreateOAuthApp(oapp) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Grant permission to regular users. th.AddPermissionToRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - rapp, resp = Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, resp, err = client.CreateOAuthApp(oapp) + require.NoError(t, err) CheckCreatedStatus(t, resp) assert.False(t, rapp.IsTrusted, "trusted should be false - created by non admin") oapp.Name = "" - _, resp = AdminClient.CreateOAuthApp(oapp) + _, resp, err = adminClient.CreateOAuthApp(oapp) + require.Error(t, err) CheckBadRequestStatus(t, resp) - r, err := Client.DoApiPost("/oauth/apps", "garbage") - require.NotNil(t, err, "expected error from garbage post") + r, err := client.DoApiPost("/oauth/apps", "garbage") + require.Error(t, err, "expected error from garbage post") assert.Equal(t, http.StatusBadRequest, r.StatusCode) - Client.Logout() - _, resp = Client.CreateOAuthApp(oapp) + client.Logout() + _, resp, err = client.CreateOAuthApp(oapp) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) oapp.Name = GenerateTestAppName() - _, resp = AdminClient.CreateOAuthApp(oapp) + _, resp, err = adminClient.CreateOAuthApp(oapp) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestUpdateOAuthApp(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -98,7 +102,7 @@ func TestUpdateOAuthApp(t *testing.T) { CallbackUrls: []string{"https://callback.com"}, } - oapp, _ = AdminClient.CreateOAuthApp(oapp) + oapp, _, _ = adminClient.CreateOAuthApp(oapp) oapp.Name = "oapp_update" oapp.IsTrusted = true @@ -107,8 +111,8 @@ func TestUpdateOAuthApp(t *testing.T) { oapp.Description = "test_update" oapp.CallbackUrls = []string{"https://callback_update.com", "https://another_callback.com"} - updatedApp, resp := AdminClient.UpdateOAuthApp(oapp) - CheckNoError(t, resp) + updatedApp, _, err := adminClient.UpdateOAuthApp(oapp) + require.NoError(t, err) assert.Equal(t, oapp.Id, updatedApp.Id, "Id should have not updated") assert.Equal(t, oapp.CreatorId, updatedApp.CreatorId, "CreatorId should have not updated") assert.Equal(t, oapp.CreateAt, updatedApp.CreateAt, "CreateAt should have not updated") @@ -128,7 +132,8 @@ func TestUpdateOAuthApp(t *testing.T) { th.LoginBasic2() updatedApp.CreatorId = th.BasicUser2.Id - _, resp = Client.UpdateOAuthApp(oapp) + _, resp, err := client.UpdateOAuthApp(oapp) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() @@ -136,24 +141,29 @@ func TestUpdateOAuthApp(t *testing.T) { // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.UpdateOAuthApp(oapp) + _, resp, err = client.UpdateOAuthApp(oapp) + require.Error(t, err) CheckForbiddenStatus(t, resp) oapp.Id = "zhk9d1ggatrqz236c7h87im7bc" - _, resp = AdminClient.UpdateOAuthApp(oapp) + _, resp, err = adminClient.UpdateOAuthApp(oapp) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.UpdateOAuthApp(oapp) + _, resp, err = adminClient.UpdateOAuthApp(oapp) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - Client.Logout() - _, resp = Client.UpdateOAuthApp(oapp) + client.Logout() + _, resp, err = client.UpdateOAuthApp(oapp) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) oapp.Id = "junk" - _, resp = AdminClient.UpdateOAuthApp(oapp) + _, resp, err = adminClient.UpdateOAuthApp(oapp) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = true }) @@ -169,30 +179,30 @@ func TestUpdateOAuthApp(t *testing.T) { CallbackUrls: []string{"https://callback.com"}, } - userOapp, resp = Client.CreateOAuthApp(userOapp) - CheckNoError(t, resp) + userOapp, _, err = client.CreateOAuthApp(userOapp) + require.NoError(t, err) userOapp.IsTrusted = true - userOapp, resp = Client.UpdateOAuthApp(userOapp) - CheckNoError(t, resp) + userOapp, _, err = client.UpdateOAuthApp(userOapp) + require.NoError(t, err) assert.False(t, userOapp.IsTrusted) userOapp.IsTrusted = true - userOapp, resp = AdminClient.UpdateOAuthApp(userOapp) - CheckNoError(t, resp) + userOapp, _, err = adminClient.UpdateOAuthApp(userOapp) + require.NoError(t, err) assert.True(t, userOapp.IsTrusted) userOapp.IsTrusted = false - userOapp, resp = Client.UpdateOAuthApp(userOapp) - CheckNoError(t, resp) + userOapp, _, err = client.UpdateOAuthApp(userOapp) + require.NoError(t, err) assert.True(t, userOapp.IsTrusted) } func TestGetOAuthApps(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -207,15 +217,15 @@ func TestGetOAuthApps(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp := Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err := client.CreateOAuthApp(oapp) + require.NoError(t, err) - apps, resp := AdminClient.GetOAuthApps(0, 1000) - CheckNoError(t, resp) + apps, _, err := adminClient.GetOAuthApps(0, 1000) + require.NoError(t, err) found1 := false found2 := false @@ -230,35 +240,38 @@ func TestGetOAuthApps(t *testing.T) { assert.Truef(t, found1, "missing oauth app %v", rapp.Id) assert.Truef(t, found2, "missing oauth app %v", rapp2.Id) - apps, resp = AdminClient.GetOAuthApps(1, 1) - CheckNoError(t, resp) + apps, _, err = adminClient.GetOAuthApps(1, 1) + require.NoError(t, err) require.Equal(t, 1, len(apps), "paging failed") - apps, resp = Client.GetOAuthApps(0, 1000) - CheckNoError(t, resp) + apps, _, err = client.GetOAuthApps(0, 1000) + require.NoError(t, err) require.True(t, len(apps) == 1 || apps[0].Id == rapp2.Id, "wrong apps returned") // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.GetOAuthApps(0, 1000) + _, resp, err := client.GetOAuthApps(0, 1000) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.GetOAuthApps(0, 1000) + _, resp, err = client.GetOAuthApps(0, 1000) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.GetOAuthApps(0, 1000) + _, resp, err = adminClient.GetOAuthApps(0, 1000) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestGetOAuthApp(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -273,56 +286,62 @@ func TestGetOAuthApp(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp := Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err := client.CreateOAuthApp(oapp) + require.NoError(t, err) - rrapp, resp := AdminClient.GetOAuthApp(rapp.Id) - CheckNoError(t, resp) + rrapp, _, err := adminClient.GetOAuthApp(rapp.Id) + require.NoError(t, err) assert.Equal(t, rapp.Id, rrapp.Id, "wrong app") assert.NotEqual(t, "", rrapp.ClientSecret, "should not be sanitized") - rrapp2, resp := AdminClient.GetOAuthApp(rapp2.Id) - CheckNoError(t, resp) + rrapp2, _, err := adminClient.GetOAuthApp(rapp2.Id) + require.NoError(t, err) assert.Equal(t, rapp2.Id, rrapp2.Id, "wrong app") assert.NotEqual(t, "", rrapp2.ClientSecret, "should not be sanitized") - _, resp = Client.GetOAuthApp(rapp2.Id) - CheckNoError(t, resp) + _, _, err = client.GetOAuthApp(rapp2.Id) + require.NoError(t, err) - _, resp = Client.GetOAuthApp(rapp.Id) + _, resp, err := client.GetOAuthApp(rapp.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.GetOAuthApp(rapp2.Id) + _, resp, err = client.GetOAuthApp(rapp2.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.GetOAuthApp(rapp2.Id) + _, resp, err = client.GetOAuthApp(rapp2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = AdminClient.GetOAuthApp("junk") + _, resp, err = adminClient.GetOAuthApp("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = AdminClient.GetOAuthApp(model.NewId()) + _, resp, err = adminClient.GetOAuthApp(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.GetOAuthApp(rapp.Id) + _, resp, err = adminClient.GetOAuthApp(rapp.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestGetOAuthAppInfo(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -337,56 +356,60 @@ func TestGetOAuthAppInfo(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp := Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err := client.CreateOAuthApp(oapp) + require.NoError(t, err) - rrapp, resp := AdminClient.GetOAuthAppInfo(rapp.Id) - CheckNoError(t, resp) + rrapp, _, err := adminClient.GetOAuthAppInfo(rapp.Id) + require.NoError(t, err) assert.Equal(t, rapp.Id, rrapp.Id, "wrong app") assert.Equal(t, "", rrapp.ClientSecret, "should be sanitized") - rrapp2, resp := AdminClient.GetOAuthAppInfo(rapp2.Id) - CheckNoError(t, resp) + rrapp2, _, err := adminClient.GetOAuthAppInfo(rapp2.Id) + require.NoError(t, err) assert.Equal(t, rapp2.Id, rrapp2.Id, "wrong app") assert.Equal(t, "", rrapp2.ClientSecret, "should be sanitized") - _, resp = Client.GetOAuthAppInfo(rapp2.Id) - CheckNoError(t, resp) + _, _, err = client.GetOAuthAppInfo(rapp2.Id) + require.NoError(t, err) - _, resp = Client.GetOAuthAppInfo(rapp.Id) - CheckNoError(t, resp) + _, _, err = client.GetOAuthAppInfo(rapp.Id) + require.NoError(t, err) // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.GetOAuthAppInfo(rapp2.Id) - CheckNoError(t, resp) + _, _, err = client.GetOAuthAppInfo(rapp2.Id) + require.NoError(t, err) - Client.Logout() + client.Logout() - _, resp = Client.GetOAuthAppInfo(rapp2.Id) + _, resp, err := client.GetOAuthAppInfo(rapp2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = AdminClient.GetOAuthAppInfo("junk") + _, resp, err = adminClient.GetOAuthAppInfo("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = AdminClient.GetOAuthAppInfo(model.NewId()) + _, resp, err = adminClient.GetOAuthAppInfo(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.GetOAuthAppInfo(rapp.Id) + _, resp, err = adminClient.GetOAuthAppInfo(rapp.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestDeleteOAuthApp(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -401,59 +424,64 @@ func TestDeleteOAuthApp(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp := Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err := client.CreateOAuthApp(oapp) + require.NoError(t, err) - pass, resp := AdminClient.DeleteOAuthApp(rapp.Id) - CheckNoError(t, resp) - assert.True(t, pass, "should have passed") + _, err = adminClient.DeleteOAuthApp(rapp.Id) + require.NoError(t, err) - _, resp = AdminClient.DeleteOAuthApp(rapp2.Id) - CheckNoError(t, resp) + _, err = adminClient.DeleteOAuthApp(rapp2.Id) + require.NoError(t, err) - rapp, resp = AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err = adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp = Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err = client.CreateOAuthApp(oapp) + require.NoError(t, err) - _, resp = Client.DeleteOAuthApp(rapp.Id) + resp, err := client.DeleteOAuthApp(rapp.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.DeleteOAuthApp(rapp2.Id) - CheckNoError(t, resp) + _, err = client.DeleteOAuthApp(rapp2.Id) + require.NoError(t, err) // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.DeleteOAuthApp(rapp.Id) + resp, err = client.DeleteOAuthApp(rapp.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.DeleteOAuthApp(rapp.Id) + client.Logout() + resp, err = client.DeleteOAuthApp(rapp.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = AdminClient.DeleteOAuthApp("junk") + resp, err = adminClient.DeleteOAuthApp("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = AdminClient.DeleteOAuthApp(model.NewId()) + resp, err = adminClient.DeleteOAuthApp(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.DeleteOAuthApp(rapp.Id) + resp, err = adminClient.DeleteOAuthApp(rapp.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestRegenerateOAuthAppSecret(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient defaultRolePermissions := th.SaveDefaultRolePermissions() enableOAuthServiceProvider := th.App.Config().ServiceSettings.EnableOAuthServiceProvider @@ -468,60 +496,66 @@ func TestRegenerateOAuthAppSecret(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp := Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err := client.CreateOAuthApp(oapp) + require.NoError(t, err) - rrapp, resp := AdminClient.RegenerateOAuthAppSecret(rapp.Id) - CheckNoError(t, resp) + rrapp, _, err := adminClient.RegenerateOAuthAppSecret(rapp.Id) + require.NoError(t, err) assert.Equal(t, rrapp.Id, rapp.Id, "wrong app") assert.NotEqual(t, rapp.ClientSecret, rrapp.ClientSecret, "secret didn't change") - _, resp = AdminClient.RegenerateOAuthAppSecret(rapp2.Id) - CheckNoError(t, resp) + _, _, err = adminClient.RegenerateOAuthAppSecret(rapp2.Id) + require.NoError(t, err) - rapp, resp = AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err = adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) oapp.Name = GenerateTestAppName() - rapp2, resp = Client.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp2, _, err = client.CreateOAuthApp(oapp) + require.NoError(t, err) - _, resp = Client.RegenerateOAuthAppSecret(rapp.Id) + _, resp, err := client.RegenerateOAuthAppSecret(rapp.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.RegenerateOAuthAppSecret(rapp2.Id) - CheckNoError(t, resp) + _, _, err = client.RegenerateOAuthAppSecret(rapp2.Id) + require.NoError(t, err) // Revoke permission from regular users. th.RemovePermissionFromRole(model.PermissionManageOAuth.Id, model.SystemUserRoleId) - _, resp = Client.RegenerateOAuthAppSecret(rapp.Id) + _, resp, err = client.RegenerateOAuthAppSecret(rapp.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.RegenerateOAuthAppSecret(rapp.Id) + client.Logout() + _, resp, err = client.RegenerateOAuthAppSecret(rapp.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = AdminClient.RegenerateOAuthAppSecret("junk") + _, resp, err = adminClient.RegenerateOAuthAppSecret("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = AdminClient.RegenerateOAuthAppSecret(model.NewId()) + _, resp, err = adminClient.RegenerateOAuthAppSecret(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) - _, resp = AdminClient.RegenerateOAuthAppSecret(rapp.Id) + _, resp, err = adminClient.RegenerateOAuthAppSecret(rapp.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } func TestGetAuthorizedOAuthAppsForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client - AdminClient := th.SystemAdminClient + client := th.Client + adminClient := th.SystemAdminClient enableOAuth := th.App.Config().ServiceSettings.EnableOAuthServiceProvider defer func() { @@ -531,8 +565,8 @@ func TestGetAuthorizedOAuthAppsForUser(t *testing.T) { oapp := &model.OAuthApp{Name: GenerateTestAppName(), Homepage: "https://nowhere.com", Description: "test", CallbackUrls: []string{"https://nowhere.com"}} - rapp, resp := AdminClient.CreateOAuthApp(oapp) - CheckNoError(t, resp) + rapp, _, err := adminClient.CreateOAuthApp(oapp) + require.NoError(t, err) authRequest := &model.AuthorizeRequest{ ResponseType: model.AuthCodeResponseType, @@ -542,11 +576,11 @@ func TestGetAuthorizedOAuthAppsForUser(t *testing.T) { State: "123", } - _, resp = Client.AuthorizeOAuthApp(authRequest) - CheckNoError(t, resp) + _, _, err = client.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) - apps, resp := Client.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) - CheckNoError(t, resp) + apps, _, err := client.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) + require.NoError(t, err) found := false for _, a := range apps { @@ -557,18 +591,21 @@ func TestGetAuthorizedOAuthAppsForUser(t *testing.T) { } require.True(t, found, "missing app") - _, resp = Client.GetAuthorizedOAuthAppsForUser(th.BasicUser2.Id, 0, 1000) + _, resp, err := client.GetAuthorizedOAuthAppsForUser(th.BasicUser2.Id, 0, 1000) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetAuthorizedOAuthAppsForUser("junk", 0, 1000) + _, resp, err = client.GetAuthorizedOAuthAppsForUser("junk", 0, 1000) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) + client.Logout() + _, resp, err = client.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = AdminClient.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) - CheckNoError(t, resp) + _, _, err = adminClient.GetAuthorizedOAuthAppsForUser(th.BasicUser.Id, 0, 1000) + require.NoError(t, err) } func closeBody(r *http.Response) { @@ -577,3 +614,13 @@ func closeBody(r *http.Response) { r.Body.Close() } } + +func TestNilAuthorizeOAuthApp(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + client := th.Client + + _, _, err := client.AuthorizeOAuthApp(nil) + require.Error(t, err) + CheckErrorID(t, err, "api.context.invalid_body_param.app_error") +} diff --git a/api4/openGraph_test.go b/api4/openGraph_test.go index c21ffccc7c..41d8a3ae55 100644 --- a/api4/openGraph_test.go +++ b/api4/openGraph_test.go @@ -18,7 +18,7 @@ func TestGetOpenGraphMetadata(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client enableLinkPreviews := *th.App.Config().ServiceSettings.EnableLinkPreviews allowedInternalConnections := *th.App.Config().ServiceSettings.AllowedUntrustedInternalConnections @@ -59,8 +59,8 @@ func TestGetOpenGraphMetadata(t *testing.T) { {"path": "/no-og-data/", "title": "", "cacheMissCount": 2}, } { - openGraph, resp := Client.OpenGraph(ts.URL + data["path"].(string)) - CheckNoError(t, resp) + openGraph, _, err := client.OpenGraph(ts.URL + data["path"].(string)) + require.NoError(t, err) require.Equalf(t, openGraph["title"], data["title"].(string), "OG data title mismatch for path \"%s\".") @@ -70,6 +70,7 @@ func TestGetOpenGraphMetadata(t *testing.T) { } th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = false }) - _, resp := Client.OpenGraph(ts.URL + "/og-data/") + _, resp, err := client.OpenGraph(ts.URL + "/og-data/") + require.Error(t, err) CheckNotImplementedStatus(t, resp) } diff --git a/api4/permissions_test.go b/api4/permissions_test.go index a6f5107f1c..1eb4b3d01e 100644 --- a/api4/permissions_test.go +++ b/api4/permissions_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/mattermost/mattermost-server/v6/model" ) @@ -20,23 +21,24 @@ func TestGetAncillaryPermissions(t *testing.T) { t.Run("Valid Case, Passing in SubSection Permissions", func(t *testing.T) { subsectionPermissions = []string{model.PermissionSysconsoleReadReportingSiteStatistics.Id} expectedAncillaryPermissions = []string{model.PermissionGetAnalytics.Id} - actualAncillaryPermissions, resp := th.Client.GetAncillaryPermissions(subsectionPermissions) - CheckNoError(t, resp) + actualAncillaryPermissions, _, err := th.Client.GetAncillaryPermissions(subsectionPermissions) + require.NoError(t, err) assert.Equal(t, append(subsectionPermissions, expectedAncillaryPermissions...), actualAncillaryPermissions) }) t.Run("Invalid Case, Passing in SubSection Permissions That Don't Exist", func(t *testing.T) { subsectionPermissions = []string{"All", "The", "Things", "She", "Said", "Running", "Through", "My", "Head"} expectedAncillaryPermissions = []string{} - actualAncillaryPermissions, resp := th.Client.GetAncillaryPermissions(subsectionPermissions) - CheckNoError(t, resp) + actualAncillaryPermissions, _, err := th.Client.GetAncillaryPermissions(subsectionPermissions) + require.NoError(t, err) assert.Equal(t, append(subsectionPermissions, expectedAncillaryPermissions...), actualAncillaryPermissions) }) t.Run("Invalid Case, Passing in nothing", func(t *testing.T) { subsectionPermissions = []string{} expectedAncillaryPermissions = []string{} - _, resp := th.Client.GetAncillaryPermissions(subsectionPermissions) + _, resp, err := th.Client.GetAncillaryPermissions(subsectionPermissions) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } diff --git a/api4/plugin_test.go b/api4/plugin_test.go index 88bda8512d..30e6f1d6ae 100644 --- a/api4/plugin_test.go +++ b/api4/plugin_test.go @@ -56,15 +56,16 @@ func TestPlugin(t *testing.T) { url := testServer.URL - manifest, resp := client.InstallPluginFromUrl(url, false) - CheckNoError(t, resp) + manifest, _, err := client.InstallPluginFromUrl(url, false) + require.NoError(t, err) assert.Equal(t, "testplugin", manifest.Id) - _, resp = client.InstallPluginFromUrl(url, false) + _, resp, err := client.InstallPluginFromUrl(url, false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - manifest, resp = client.InstallPluginFromUrl(url, true) - CheckNoError(t, resp) + manifest, _, err = client.InstallPluginFromUrl(url, true) + require.NoError(t, err) assert.Equal(t, "testplugin", manifest.Id) // Stored in File Store: Install Plugin from URL case @@ -72,9 +73,8 @@ func TestPlugin(t *testing.T) { assert.Nil(t, appErr) assert.True(t, pluginStored) - ok, resp := client.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err = client.RemovePlugin(manifest.Id) + require.NoError(t, err) t.Run("install plugin from URL with slow response time", func(t *testing.T) { if testing.Short() { @@ -89,8 +89,8 @@ func TestPlugin(t *testing.T) { })) defer func() { slowTestServer.Close() }() - manifest, resp = client.InstallPluginFromUrl(slowTestServer.URL, true) - CheckNoError(t, resp) + manifest, _, err = client.InstallPluginFromUrl(slowTestServer.URL, true) + require.NoError(t, err) assert.Equal(t, "testplugin", manifest.Id) }) @@ -98,31 +98,35 @@ func TestPlugin(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = false }) - _, resp = client.InstallPluginFromUrl(url, false) + _, resp, err = client.InstallPluginFromUrl(url, false) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true }) - _, resp = th.Client.InstallPluginFromUrl(url, false) + _, resp, err = th.Client.InstallPluginFromUrl(url, false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = client.InstallPluginFromUrl("http://nodata", false) + _, resp, err = client.InstallPluginFromUrl("http://nodata", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.AllowInsecureDownloadUrl = false }) - _, resp = client.InstallPluginFromUrl(url, false) + _, resp, err = client.InstallPluginFromUrl(url, false) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Successful upload - manifest, resp = client.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err = client.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.EnableUploads = true }) - manifest, resp = client.UploadPluginForced(bytes.NewReader(tarData)) + manifest, _, err = client.UploadPluginForced(bytes.NewReader(tarData)) defer os.RemoveAll("plugins/testplugin") - CheckNoError(t, resp) + require.NoError(t, err) assert.Equal(t, "testplugin", manifest.Id) @@ -132,30 +136,35 @@ func TestPlugin(t *testing.T) { assert.True(t, pluginStored) // Upload error cases - _, resp = client.UploadPlugin(bytes.NewReader([]byte("badfile"))) + _, resp, err = client.UploadPlugin(bytes.NewReader([]byte("badfile"))) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = false }) - _, resp = client.UploadPlugin(bytes.NewReader(tarData)) + _, resp, err = client.UploadPlugin(bytes.NewReader(tarData)) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true *cfg.PluginSettings.EnableUploads = false }) - _, resp = client.UploadPlugin(bytes.NewReader(tarData)) + _, resp, err = client.UploadPlugin(bytes.NewReader(tarData)) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - _, resp = client.InstallPluginFromUrl(url, false) + _, resp, err = client.InstallPluginFromUrl(url, false) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.EnableUploads = true }) - _, resp = th.Client.UploadPlugin(bytes.NewReader(tarData)) + _, resp, err = th.Client.UploadPlugin(bytes.NewReader(tarData)) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Successful gets - pluginsResp, resp := client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err := client.GetPlugins() + require.NoError(t, err) found := false for _, m := range pluginsResp.Inactive { @@ -176,12 +185,11 @@ func TestPlugin(t *testing.T) { assert.False(t, found) // Successful activate - ok, resp = client.EnablePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.EnablePlugin(manifest.Id) + require.NoError(t, err) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) found = false for _, m := range pluginsResp.Active { @@ -193,21 +201,20 @@ func TestPlugin(t *testing.T) { assert.True(t, found) // Activate error case - ok, resp = client.EnablePlugin("junk") + resp, err = client.EnablePlugin("junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) - assert.False(t, ok) - ok, resp = client.EnablePlugin("JUNK") + resp, err = client.EnablePlugin("JUNK") + require.Error(t, err) CheckNotFoundStatus(t, resp) - assert.False(t, ok) // Successful deactivate - ok, resp = client.DisablePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.DisablePlugin(manifest.Id) + require.NoError(t, err) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) found = false for _, m := range pluginsResp.Inactive { @@ -219,25 +226,27 @@ func TestPlugin(t *testing.T) { assert.True(t, found) // Deactivate error case - ok, resp = client.DisablePlugin("junk") + resp, err = client.DisablePlugin("junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) - assert.False(t, ok) // Get error cases th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = false }) - _, resp = client.GetPlugins() + _, resp, err = client.GetPlugins() + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true }) - _, resp = th.Client.GetPlugins() + _, resp, err = th.Client.GetPlugins() + require.Error(t, err) CheckForbiddenStatus(t, resp) // Successful webapp get - _, resp = client.EnablePlugin(manifest.Id) - CheckNoError(t, resp) + _, err = client.EnablePlugin(manifest.Id) + require.NoError(t, err) - manifests, resp := th.Client.GetWebappPlugins() - CheckNoError(t, resp) + manifests, _, err := th.Client.GetWebappPlugins() + require.NoError(t, err) found = false for _, m := range manifests { @@ -249,24 +258,26 @@ func TestPlugin(t *testing.T) { assert.True(t, found) // Successful remove - ok, resp = client.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.RemovePlugin(manifest.Id) + require.NoError(t, err) // Remove error cases - ok, resp = client.RemovePlugin(manifest.Id) + resp, err = client.RemovePlugin(manifest.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) - assert.False(t, ok) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = false }) - _, resp = client.RemovePlugin(manifest.Id) + resp, err = client.RemovePlugin(manifest.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true }) - _, resp = th.Client.RemovePlugin(manifest.Id) + resp, err = th.Client.RemovePlugin(manifest.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = client.RemovePlugin("bad.id") + resp, err = client.RemovePlugin("bad.id") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } @@ -290,8 +301,8 @@ func TestNotifyClusterPluginEvent(t *testing.T) { testCluster.ClearMessages() // Successful upload - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) require.Equal(t, "testplugin", manifest.Id) // Stored in File Store: Upload Plugin case @@ -317,13 +328,13 @@ func TestNotifyClusterPluginEvent(t *testing.T) { // Upgrade testCluster.ClearMessages() - manifest, resp = th.SystemAdminClient.UploadPluginForced(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err = th.SystemAdminClient.UploadPluginForced(bytes.NewReader(tarData)) + require.NoError(t, err) require.Equal(t, "testplugin", manifest.Id) // Successful remove - webSocketClient, appErr := th.CreateWebSocketSystemAdminClient() - require.Nil(t, appErr) + webSocketClient, err := th.CreateWebSocketSystemAdminClient() + require.NoError(t, err) webSocketClient.Listen() defer webSocketClient.Close() done := make(chan bool) @@ -343,9 +354,8 @@ func TestNotifyClusterPluginEvent(t *testing.T) { }() testCluster.ClearMessages() - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) result := <-done require.True(t, result, "plugin_statuses_changed websocket event was not received") @@ -397,26 +407,25 @@ func TestDisableOnRemove(t *testing.T) { }) // Upload - manifest, resp := client.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := client.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) require.Equal(t, "testplugin", manifest.Id) // Check initial status - pluginsResp, resp := client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err := client.GetPlugins() + require.NoError(t, err) require.Empty(t, pluginsResp.Active) require.Equal(t, pluginsResp.Inactive, []*model.PluginInfo{{ Manifest: *manifest, }}) // Enable plugin - ok, resp := client.EnablePlugin(manifest.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err = client.EnablePlugin(manifest.Id) + require.NoError(t, err) // Confirm enabled status - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Empty(t, pluginsResp.Inactive) require.Equal(t, pluginsResp.Active, []*model.PluginInfo{{ Manifest: *manifest, @@ -424,13 +433,13 @@ func TestDisableOnRemove(t *testing.T) { if tc.Upgrade { // Upgrade - manifest, resp = client.UploadPluginForced(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err = client.UploadPluginForced(bytes.NewReader(tarData)) + require.NoError(t, err) require.Equal(t, "testplugin", manifest.Id) // Plugin should remain active - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Empty(t, pluginsResp.Inactive) require.Equal(t, pluginsResp.Active, []*model.PluginInfo{{ Manifest: *manifest, @@ -438,33 +447,31 @@ func TestDisableOnRemove(t *testing.T) { } // Remove plugin - ok, resp = client.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err = client.RemovePlugin(manifest.Id) + require.NoError(t, err) // Plugin should have no status - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Empty(t, pluginsResp.Inactive) require.Empty(t, pluginsResp.Active) // Upload same plugin - manifest, resp = client.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err = client.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) require.Equal(t, "testplugin", manifest.Id) // Plugin should be inactive - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Empty(t, pluginsResp.Active) require.Equal(t, pluginsResp.Inactive, []*model.PluginInfo{{ Manifest: *manifest, }}) // Clean up - ok, resp = client.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - require.True(t, ok) + _, err = client.RemovePlugin(manifest.Id) + require.NoError(t, err) }) }) } @@ -486,7 +493,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + plugins, resp, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.Error(t, err) CheckNotImplementedStatus(t, resp) require.Nil(t, plugins) }, "marketplace disabled") @@ -497,7 +505,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + plugins, resp, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, plugins) }, "no server") @@ -508,7 +517,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugins, resp := th.Client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + plugins, resp, err := th.Client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.Error(t, err) CheckForbiddenStatus(t, resp) require.Nil(t, plugins) }) @@ -527,8 +537,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "empty response from server") @@ -552,8 +562,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify server version is passed through") @@ -576,8 +586,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify EnterprisePlugins is false for TE") @@ -605,8 +615,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *l.Features.EnterprisePlugins = false th.App.Srv().SetLicense(l) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify EnterprisePlugins is false for E10") @@ -631,8 +641,8 @@ func TestGetMarketplacePlugins(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("enterprise_plugins")) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify EnterprisePlugins is true for E20") @@ -655,8 +665,8 @@ func TestGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify EnterprisePlugins is false if there is no license") @@ -681,8 +691,8 @@ func TestGetMarketplacePlugins(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("cloud")) - plugins, resp := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := client.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Empty(t, plugins) }, "verify Cloud is true for cloud license") } @@ -735,12 +745,12 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, samplePlugins, plugins) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) require.NoError(t, err) @@ -765,16 +775,15 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { return strings.ToLower(expectedPlugins[i].Manifest.Name) < strings.ToLower(expectedPlugins[j].Manifest.Name) }) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, expectedPlugins, plugins) - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, samplePlugins, plugins) }) @@ -788,8 +797,8 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.EnableMarketplace = true }) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) newPlugin := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ @@ -807,25 +816,25 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { res.WriteHeader(http.StatusOK) - json, err := json.Marshal([]*model.MarketplacePlugin{samplePlugins[0], newPlugin}) + var out []byte + out, err = json.Marshal([]*model.MarketplacePlugin{samplePlugins[0], newPlugin}) require.NoError(t, err) - res.Write(json) + res.Write(out) })) defer func() { testServer.Close() }() th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, expectedPlugins, plugins) - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) newPlugin.InstalledVersion = "" require.Equal(t, expectedPlugins, plugins) }) @@ -881,12 +890,12 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, samplePlugins, plugins) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) plugin1 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ @@ -904,8 +913,8 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { } expectedPlugins := append(samplePlugins, plugin1) - manifest, resp = th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarDataV2)) - CheckNoError(t, resp) + manifest, _, err = th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarDataV2)) + require.NoError(t, err) plugin2 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ @@ -926,35 +935,33 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { return strings.ToLower(expectedPlugins[i].Manifest.Name) < strings.ToLower(expectedPlugins[j].Manifest.Name) }) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Equal(t, expectedPlugins, plugins) // Search for plugins from the server - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "testplugin2"}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "testplugin2"}) + require.NoError(t, err) require.Equal(t, []*model.MarketplacePlugin{plugin2}, plugins) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "a second plugin"}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "a second plugin"}) + require.NoError(t, err) require.Equal(t, []*model.MarketplacePlugin{plugin2}, plugins) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "User Satisfaction Surveys"}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "User Satisfaction Surveys"}) + require.NoError(t, err) require.Equal(t, samplePlugins, plugins) - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "NOFILTER"}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{Filter: "NOFILTER"}) + require.NoError(t, err) require.Nil(t, plugins) // cleanup - ok, resp := th.SystemAdminClient.RemovePlugin(plugin1.Manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(plugin1.Manifest.Id) + require.NoError(t, err) - ok, resp = th.SystemAdminClient.RemovePlugin(plugin2.Manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(plugin2.Manifest.Id) + require.NoError(t, err) }) } @@ -999,8 +1006,8 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { *cfg.PluginSettings.EnableRemoteMarketplace = true }) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Len(t, plugins, len(samplePlugins)) require.Equal(t, samplePlugins, plugins) @@ -1017,17 +1024,16 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { tarData, err := ioutil.ReadFile(filepath.Join(path, "testplugin.tar.gz")) require.NoError(t, err) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Len(t, plugins, 2) - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) }) t.Run("EnableRemoteMarketplace disabled", func(t *testing.T) { @@ -1037,8 +1043,8 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { }) // No marketplace plugins returned - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Len(t, plugins, 0) @@ -1047,8 +1053,8 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { tarData, err := ioutil.ReadFile(filepath.Join(path, "testplugin.tar.gz")) require.NoError(t, err) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) require.NoError(t, err) @@ -1065,16 +1071,15 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { InstalledVersion: manifest.Version, } - plugins, resp = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err = th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) // Only get the local plugins require.Len(t, plugins, 1) require.Equal(t, newPlugin, plugins[0]) - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) }) t.Run("local_only true", func(t *testing.T) { @@ -1088,8 +1093,8 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { tarData, err := ioutil.ReadFile(filepath.Join(path, "testplugin.tar.gz")) require.NoError(t, err) - manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) - CheckNoError(t, resp) + manifest, _, err := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) + require.NoError(t, err) testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) require.NoError(t, err) @@ -1110,15 +1115,14 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { InstalledVersion: manifest.Version, } - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{LocalOnly: true}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{LocalOnly: true}) + require.NoError(t, err) require.Len(t, plugins, 1) require.Equal(t, newPlugin, plugins[0]) - ok, resp := th.SystemAdminClient.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = th.SystemAdminClient.RemovePlugin(manifest.Id) + require.NoError(t, err) }) } @@ -1174,8 +1178,8 @@ func TestGetPrepackagedPluginInMarketplace(t *testing.T) { *cfg.PluginSettings.EnableUploads = true }) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) expectedPlugins := marketplacePlugins expectedPlugins = append(expectedPlugins, &model.MarketplacePlugin{ @@ -1195,8 +1199,8 @@ func TestGetPrepackagedPluginInMarketplace(t *testing.T) { }) // No marketplace plugins returned - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) // Only returns the prepackaged plugins require.Len(t, plugins, 1) @@ -1221,8 +1225,8 @@ func TestGetPrepackagedPluginInMarketplace(t *testing.T) { env := th.App.GetPluginsEnvironment() env.SetPrepackagedPlugins([]*plugin.PrepackagedPlugin{newerPrepackagePlugin}) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.Len(t, plugins, 1) require.Equal(t, newerPrepackagePlugin.Manifest, plugins[0].Manifest) @@ -1236,8 +1240,8 @@ func TestGetPrepackagedPluginInMarketplace(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("cloud")) - plugins, resp := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) - CheckNoError(t, resp) + plugins, _, err := th.SystemAdminClient.GetMarketplacePlugins(&model.MarketplacePluginFilter{}) + require.NoError(t, err) require.ElementsMatch(t, marketplacePlugins, plugins) require.Len(t, plugins, 1) @@ -1311,7 +1315,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.EnableMarketplace = false *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugin, resp := client.InstallMarketplacePlugin(request) + plugin, resp, err := client.InstallMarketplacePlugin(request) + require.Error(t, err) CheckNotImplementedStatus(t, resp) require.Nil(t, plugin) }, "marketplace disabled") @@ -1321,11 +1326,13 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.Enable = true *cfg.PluginSettings.RequirePluginSignature = true }) - manifest, resp := client.UploadPlugin(bytes.NewReader(tarData)) + manifest, resp, err := client.UploadPlugin(bytes.NewReader(tarData)) + require.Error(t, err) CheckNotImplementedStatus(t, resp) require.Nil(t, manifest) - manifest, resp = client.InstallPluginFromUrl("some_url", true) + manifest, resp, err = client.InstallPluginFromUrl("some_url", true) + require.Error(t, err) CheckNotImplementedStatus(t, resp) require.Nil(t, manifest) }, "RequirePluginSignature enabled") @@ -1336,7 +1343,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugin, resp := client.InstallMarketplacePlugin(request) + plugin, resp, err := client.InstallMarketplacePlugin(request) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, plugin) }, "no server") @@ -1347,7 +1355,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = "invalid.com" }) - plugin, resp := th.Client.InstallMarketplacePlugin(request) + plugin, resp, err := th.Client.InstallMarketplacePlugin(request) + require.Error(t, err) CheckForbiddenStatus(t, resp) require.Nil(t, plugin) }) @@ -1366,7 +1375,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.MarketplaceUrl = testServer.URL }) pRequest := &model.InstallMarketplacePluginRequest{Id: "some_plugin_id", Version: "0.0.1"} - plugin, resp := client.InstallMarketplacePlugin(pRequest) + plugin, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, plugin) }, "plugin not found on the server") @@ -1386,7 +1396,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { *cfg.PluginSettings.AllowInsecureDownloadUrl = true }) pRequest := &model.InstallMarketplacePluginRequest{Id: "testplugin2", Version: "1.2.2"} - plugin, resp := client.InstallMarketplacePlugin(pRequest) + plugin, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, plugin) }, "plugin not verified") @@ -1415,8 +1426,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { require.Nil(t, appErr) pRequest := &model.InstallMarketplacePluginRequest{Id: "testplugin2", Version: "1.2.3"} - manifest, resp := client.InstallMarketplacePlugin(pRequest) - CheckNoError(t, resp) + manifest, _, err := client.InstallMarketplacePlugin(pRequest) + require.NoError(t, err) require.NotNil(t, manifest) require.Equal(t, "testplugin2", manifest.Id) require.Equal(t, "1.2.3", manifest.Version) @@ -1426,9 +1437,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { require.Nil(t, appErr) require.EqualValues(t, sigFile, savedSigFile) - ok, resp := client.RemovePlugin(manifest.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.RemovePlugin(manifest.Id) + require.NoError(t, err) exists, appErr := th.App.FileExists(filePath) require.Nil(t, appErr) require.False(t, exists) @@ -1464,7 +1474,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { // The content of the request is irrelevant. This test only cares about enterprise_plugins. pRequest := &model.InstallMarketplacePluginRequest{} - manifest, resp := client.InstallMarketplacePlugin(pRequest) + manifest, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) assert.True(t, requestHandled) @@ -1502,7 +1513,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { // The content of the request is irrelevant. This test only cares about enterprise_plugins. pRequest := &model.InstallMarketplacePluginRequest{} - manifest, resp := client.InstallMarketplacePlugin(pRequest) + manifest, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) assert.True(t, requestHandled) @@ -1536,7 +1548,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { // The content of the request is irrelevant. This test only cares about enterprise_plugins. pRequest := &model.InstallMarketplacePluginRequest{} - manifest, resp := client.InstallMarketplacePlugin(pRequest) + manifest, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) assert.True(t, requestHandled) @@ -1580,9 +1593,10 @@ func TestInstallMarketplacePlugin(t *testing.T) { require.NotEmpty(t, serverVersion) require.Equal(t, model.CurrentVersion, serverVersion) res.WriteHeader(http.StatusOK) - json, err := json.Marshal([]*model.MarketplacePlugin{samplePlugins[1]}) + var out []byte + out, err = json.Marshal([]*model.MarketplacePlugin{samplePlugins[1]}) require.NoError(t, err) - res.Write(json) + res.Write(out) })) defer testServer.Close() @@ -1595,14 +1609,15 @@ func TestInstallMarketplacePlugin(t *testing.T) { env := th2.App.GetPluginsEnvironment() - pluginsResp, resp := client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err := client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Len(t, pluginsResp.Inactive, 0) // Should fail to install unknown prepackaged plugin pRequest := &model.InstallMarketplacePluginRequest{Id: "testplugin", Version: "0.0.2"} - manifest, resp := client.InstallMarketplacePlugin(pRequest) + manifest, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) @@ -1611,20 +1626,20 @@ func TestInstallMarketplacePlugin(t *testing.T) { require.Equal(t, "testplugin", plugins[0].Manifest.Id) require.Equal(t, pluginSignatureData, plugins[0].Signature) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Len(t, pluginsResp.Inactive, 0) pRequest = &model.InstallMarketplacePluginRequest{Id: "testplugin", Version: "0.0.1"} - manifest1, resp := client.InstallMarketplacePlugin(pRequest) - CheckNoError(t, resp) + manifest1, _, err := client.InstallMarketplacePlugin(pRequest) + require.NoError(t, err) require.NotNil(t, manifest1) require.Equal(t, "testplugin", manifest1.Id) require.Equal(t, "0.0.1", manifest1.Version) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Equal(t, pluginsResp.Inactive, []*model.PluginInfo{{ Manifest: *manifest1, @@ -1632,7 +1647,8 @@ func TestInstallMarketplacePlugin(t *testing.T) { // Try to install remote marketplace plugin pRequest = &model.InstallMarketplacePluginRequest{Id: "testplugin2", Version: "1.2.3"} - manifest, resp = client.InstallMarketplacePlugin(pRequest) + manifest, resp, err = client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) @@ -1645,14 +1661,14 @@ func TestInstallMarketplacePlugin(t *testing.T) { }) pRequest = &model.InstallMarketplacePluginRequest{Id: "testplugin2", Version: "1.2.3"} - manifest2, resp := client.InstallMarketplacePlugin(pRequest) - CheckNoError(t, resp) + manifest2, _, err := client.InstallMarketplacePlugin(pRequest) + require.NoError(t, err) require.NotNil(t, manifest2) require.Equal(t, "testplugin2", manifest2.Id) require.Equal(t, "1.2.3", manifest2.Version) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.ElementsMatch(t, pluginsResp.Inactive, []*model.PluginInfo{ { @@ -1664,13 +1680,11 @@ func TestInstallMarketplacePlugin(t *testing.T) { }) // Clean up - ok, resp := client.RemovePlugin(manifest1.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.RemovePlugin(manifest1.Id) + require.NoError(t, err) - ok, resp = client.RemovePlugin(manifest2.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err = client.RemovePlugin(manifest2.Id) + require.NoError(t, err) appErr = th2.App.DeletePublicKey("pub_key") require.Nil(t, appErr) @@ -1710,9 +1724,10 @@ func TestInstallMarketplacePlugin(t *testing.T) { mPlugins := []*model.MarketplacePlugin{samplePlugins[0]} require.Empty(t, mPlugins[0].Signature) res.WriteHeader(http.StatusOK) - json, err := json.Marshal(mPlugins) + var out []byte + out, err = json.Marshal(mPlugins) require.NoError(t, err) - res.Write(json) + res.Write(out) })) defer testServer.Close() @@ -1729,28 +1744,30 @@ func TestInstallMarketplacePlugin(t *testing.T) { require.Equal(t, "testplugin", plugins[0].Manifest.Id) require.Empty(t, plugins[0].Signature) - pluginsResp, resp := client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err := client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Len(t, pluginsResp.Inactive, 0) pRequest := &model.InstallMarketplacePluginRequest{Id: "testplugin", Version: "0.0.1"} - manifest, resp := client.InstallMarketplacePlugin(pRequest) + manifest, resp, err := client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Len(t, pluginsResp.Inactive, 0) pRequest = &model.InstallMarketplacePluginRequest{Id: "testplugin2", Version: "1.2.3"} - manifest, resp = client.InstallMarketplacePlugin(pRequest) + manifest, resp, err = client.InstallMarketplacePlugin(pRequest) + require.Error(t, err) CheckInternalErrorStatus(t, resp) require.Nil(t, manifest) - pluginsResp, resp = client.GetPlugins() - CheckNoError(t, resp) + pluginsResp, _, err = client.GetPlugins() + require.NoError(t, err) require.Len(t, pluginsResp.Active, 0) require.Len(t, pluginsResp.Inactive, 0) diff --git a/api4/post_test.go b/api4/post_test.go index 77b6ef8926..547bc39d26 100644 --- a/api4/post_test.go +++ b/api4/post_test.go @@ -32,11 +32,12 @@ import ( func TestCreatePost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post := &model.Post{ChannelId: th.BasicChannel.Id, Message: "#hashtag a" + model.NewId() + "a", Props: model.StringInterface{model.PropsAddChannelMember: "no good"}} - rpost, resp := Client.CreatePost(post) - CheckNoError(t, resp) + + rpost, resp, err2 := client.CreatePost(post) + require.NoError(t, err2) CheckCreatedStatus(t, resp) require.Equal(t, post.Message, rpost.Message, "message didn't match") @@ -47,80 +48,82 @@ func TestCreatePost(t *testing.T) { post.RootId = rpost.Id post.ParentId = rpost.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err2 = client.CreatePost(post) + require.NoError(t, err2) post.RootId = "junk" - _, resp = Client.CreatePost(post) + _, resp, err2 = client.CreatePost(post) + require.Error(t, err2) CheckBadRequestStatus(t, resp) post.RootId = rpost.Id post.ParentId = "junk" - _, resp = Client.CreatePost(post) + _, resp, err2 = client.CreatePost(post) + require.Error(t, err2) CheckBadRequestStatus(t, resp) post2 := &model.Post{ChannelId: th.BasicChannel2.Id, Message: "zz" + model.NewId() + "a", CreateAt: 123} - rpost2, _ := Client.CreatePost(post2) + rpost2, _, _ := client.CreatePost(post2) require.NotEqual(t, post2.CreateAt, rpost2.CreateAt, "create at should not match") t.Run("with file uploaded by same user", func(t *testing.T) { - fileResp, subResponse := Client.UploadFile([]byte("data"), th.BasicChannel.Id, "test") - CheckNoError(t, subResponse) + fileResp, _, err := client.UploadFile([]byte("data"), th.BasicChannel.Id, "test") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - postWithFiles, subResponse := Client.CreatePost(&model.Post{ + postWithFiles, _, err := client.CreatePost(&model.Post{ ChannelId: th.BasicChannel.Id, Message: "with files", FileIds: model.StringArray{fileId}, }) - CheckNoError(t, subResponse) + require.NoError(t, err) assert.Equal(t, model.StringArray{fileId}, postWithFiles.FileIds) - actualPostWithFiles, subResponse := Client.GetPost(postWithFiles.Id, "") - CheckNoError(t, subResponse) + actualPostWithFiles, _, err := client.GetPost(postWithFiles.Id, "") + require.NoError(t, err) assert.Equal(t, model.StringArray{fileId}, actualPostWithFiles.FileIds) }) t.Run("with file uploaded by different user", func(t *testing.T) { - fileResp, subResponse := th.SystemAdminClient.UploadFile([]byte("data"), th.BasicChannel.Id, "test") - CheckNoError(t, subResponse) + fileResp, _, err := th.SystemAdminClient.UploadFile([]byte("data"), th.BasicChannel.Id, "test") + require.NoError(t, err) fileId := fileResp.FileInfos[0].Id - postWithFiles, subResponse := Client.CreatePost(&model.Post{ + postWithFiles, _, err := client.CreatePost(&model.Post{ ChannelId: th.BasicChannel.Id, Message: "with files", FileIds: model.StringArray{fileId}, }) - CheckNoError(t, subResponse) + require.NoError(t, err) assert.Empty(t, postWithFiles.FileIds) - actualPostWithFiles, subResponse := Client.GetPost(postWithFiles.Id, "") - CheckNoError(t, subResponse) + actualPostWithFiles, _, err := client.GetPost(postWithFiles.Id, "") + require.NoError(t, err) assert.Empty(t, actualPostWithFiles.FileIds) }) t.Run("with file uploaded by nouser", func(t *testing.T) { - fileInfo, err := th.App.UploadFile(th.Context, []byte("data"), th.BasicChannel.Id, "test") - require.Nil(t, err) + fileInfo, appErr := th.App.UploadFile(th.Context, []byte("data"), th.BasicChannel.Id, "test") + require.Nil(t, appErr) fileId := fileInfo.Id - postWithFiles, subResponse := Client.CreatePost(&model.Post{ + postWithFiles, _, err := client.CreatePost(&model.Post{ ChannelId: th.BasicChannel.Id, Message: "with files", FileIds: model.StringArray{fileId}, }) - CheckNoError(t, subResponse) + require.NoError(t, err) assert.Equal(t, model.StringArray{fileId}, postWithFiles.FileIds) - actualPostWithFiles, subResponse := Client.GetPost(postWithFiles.Id, "") - CheckNoError(t, subResponse) + actualPostWithFiles, _, err := client.GetPost(postWithFiles.Id, "") + require.NoError(t, err) assert.Equal(t, model.StringArray{fileId}, actualPostWithFiles.FileIds) }) t.Run("Create posts without the USE_CHANNEL_MENTIONS Permission - returns ephemeral message with mentions and no ephemeral message without mentions", func(t *testing.T) { WebSocketClient, err := th.CreateWebSocketClient() WebSocketClient.Listen() - require.Nil(t, err) + require.NoError(t, err) defer th.RestoreDefaultRolePermissions(th.SaveDefaultRolePermissions()) @@ -129,8 +132,8 @@ func TestCreatePost(t *testing.T) { post.RootId = rpost.Id post.ParentId = rpost.Id post.Message = "a post with no channel mentions" - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) // Message with no channel mentions should result in no ephemeral message timeout := time.After(300 * time.Millisecond) @@ -147,20 +150,20 @@ func TestCreatePost(t *testing.T) { post.RootId = rpost.Id post.ParentId = rpost.Id post.Message = "a post with @channel" - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.RootId = rpost.Id post.ParentId = rpost.Id post.Message = "a post with @all" - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.RootId = rpost.Id post.ParentId = rpost.Id post.Message = "a post with @here" - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) timeout = time.After(600 * time.Millisecond) eventsToGo := 3 // 3 Posts created with @ mentions should result in 3 websocket events @@ -181,66 +184,73 @@ func TestCreatePost(t *testing.T) { post.RootId = "" post.ParentId = "" post.Type = model.PostTypeSystemGeneric - _, resp = Client.CreatePost(post) + _, resp, err := client.CreatePost(post) + require.Error(t, err) CheckBadRequestStatus(t, resp) post.Type = "" post.RootId = rpost2.Id post.ParentId = rpost2.Id - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckBadRequestStatus(t, resp) post.RootId = "" post.ParentId = "" post.ChannelId = "junk" - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) post.ChannelId = model.NewId() - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) - r, err := Client.DoApiPost("/posts", "garbage") - require.NotNil(t, err) + r, err := client.DoApiPost("/posts", "garbage") + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) - Client.Logout() - _, resp = Client.CreatePost(post) + client.Logout() + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) post.ChannelId = th.BasicChannel.Id post.CreateAt = 123 - rpost, resp = th.SystemAdminClient.CreatePost(post) - CheckNoError(t, resp) + rpost, _, err = th.SystemAdminClient.CreatePost(post) + require.NoError(t, err) require.Equal(t, post.CreateAt, rpost.CreateAt, "create at should match") } func TestCreatePostEphemeral(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.SystemAdminClient + client := th.SystemAdminClient ephemeralPost := &model.PostEphemeral{ UserID: th.BasicUser2.Id, Post: &model.Post{ChannelId: th.BasicChannel.Id, Message: "a" + model.NewId() + "a", Props: model.StringInterface{model.PropsAddChannelMember: "no good"}}, } - rpost, resp := Client.CreatePostEphemeral(ephemeralPost) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePostEphemeral(ephemeralPost) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, ephemeralPost.Post.Message, rpost.Message, "message didn't match") require.Equal(t, 0, int(rpost.EditAt), "newly created ephemeral post shouldn't have EditAt set") - r, err := Client.DoApiPost("/posts/ephemeral", "garbage") - require.NotNil(t, err) + r, err := client.DoApiPost("/posts/ephemeral", "garbage") + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) - Client.Logout() - _, resp = Client.CreatePostEphemeral(ephemeralPost) + client.Logout() + _, resp, err = client.CreatePostEphemeral(ephemeralPost) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - Client = th.Client - _, resp = Client.CreatePostEphemeral(ephemeralPost) + client = th.Client + _, resp, err = client.CreatePostEphemeral(ephemeralPost) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -365,8 +375,8 @@ func testCreatePostWithOutgoingHook( CallbackURLs: []string{ts.URL}, } - hook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + hook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) // create a post to trigger the webhook post = &model.Post{ @@ -375,8 +385,8 @@ func testCreatePostWithOutgoingHook( FileIds: fileIds, } - post, resp = th.SystemAdminClient.CreatePost(post) - CheckNoError(t, resp) + post, _, err = th.SystemAdminClient.CreatePost(post) + require.NoError(t, err) wait <- true @@ -391,8 +401,8 @@ func testCreatePostWithOutgoingHook( if commentPostType { time.Sleep(time.Millisecond * 100) - postList, resp := th.SystemAdminClient.GetPostThread(post.Id, "", false) - CheckNoError(t, resp) + postList, _, err := th.SystemAdminClient.GetPostThread(post.Id, "", false) + require.NoError(t, err) require.Equal(t, post.Id, postList.Order[0], "wrong order") _, ok := postList.Posts[post.Id] @@ -433,30 +443,32 @@ func TestCreatePostWithOutgoingHook_no_content_type(t *testing.T) { func TestCreatePostPublic(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post := &model.Post{ChannelId: th.BasicChannel.Id, Message: "#hashtag a" + model.NewId() + "a"} user := model.User{Email: th.GenerateTestEmail(), Nickname: "Joram Wilander", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemUserRoleId} - ruser, resp := Client.CreateUser(&user) - CheckNoError(t, resp) + ruser, _, err := client.CreateUser(&user) + require.NoError(t, err) - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) - _, resp = Client.CreatePost(post) + _, resp, err := client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateUserRoles(ruser.Id, model.SystemUserRoleId+" "+model.SystemPostAllPublicRoleId, false) th.App.Srv().InvalidateAllCaches() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.ChannelId = th.BasicPrivateChannel.Id - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateUserRoles(ruser.Id, model.SystemUserRoleId, false) @@ -464,21 +476,22 @@ func TestCreatePostPublic(t *testing.T) { th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, model.TeamUserRoleId+" "+model.TeamPostAllPublicRoleId) th.App.Srv().InvalidateAllCaches() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) post.ChannelId = th.BasicPrivateChannel.Id - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) post.ChannelId = th.BasicChannel.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) } func TestCreatePostAll(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post := &model.Post{ChannelId: th.BasicChannel.Id, Message: "#hashtag a" + model.NewId() + "a"} @@ -486,57 +499,59 @@ func TestCreatePostAll(t *testing.T) { directChannel, _ := th.App.GetOrCreateDirectChannel(th.Context, th.BasicUser.Id, th.BasicUser2.Id) - ruser, resp := Client.CreateUser(&user) - CheckNoError(t, resp) + ruser, _, err := client.CreateUser(&user) + require.NoError(t, err) - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) - _, resp = Client.CreatePost(post) + _, resp, err := client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateUserRoles(ruser.Id, model.SystemUserRoleId+" "+model.SystemPostAllRoleId, false) th.App.Srv().InvalidateAllCaches() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.ChannelId = th.BasicPrivateChannel.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.ChannelId = directChannel.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) th.App.UpdateUserRoles(ruser.Id, model.SystemUserRoleId, false) th.App.JoinUserToTeam(th.Context, th.BasicTeam, ruser, "") th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, model.TeamUserRoleId+" "+model.TeamPostAllRoleId) th.App.Srv().InvalidateAllCaches() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) post.ChannelId = th.BasicPrivateChannel.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.ChannelId = th.BasicChannel.Id - _, resp = Client.CreatePost(post) - CheckNoError(t, resp) + _, _, err = client.CreatePost(post) + require.NoError(t, err) post.ChannelId = directChannel.Id - _, resp = Client.CreatePost(post) + _, resp, err = client.CreatePost(post) + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestCreatePostSendOutOfChannelMentions(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) WebSocketClient.Listen() inChannelUser := th.CreateUser() @@ -544,8 +559,8 @@ func TestCreatePostSendOutOfChannelMentions(t *testing.T) { th.App.AddUserToChannel(inChannelUser, th.BasicChannel, false) post1 := &model.Post{ChannelId: th.BasicChannel.Id, Message: "@" + inChannelUser.Username} - _, resp := Client.CreatePost(post1) - CheckNoError(t, resp) + _, resp, err := client.CreatePost(post1) + require.NoError(t, err) CheckCreatedStatus(t, resp) timeout := time.After(300 * time.Millisecond) @@ -563,8 +578,8 @@ func TestCreatePostSendOutOfChannelMentions(t *testing.T) { th.LinkUserToTeam(outOfChannelUser, th.BasicTeam) post2 := &model.Post{ChannelId: th.BasicChannel.Id, Message: "@" + outOfChannelUser.Username} - _, resp = Client.CreatePost(post2) - CheckNoError(t, resp) + _, resp, err = client.CreatePost(post2) + require.NoError(t, err) CheckCreatedStatus(t, resp) timeout = time.After(300 * time.Millisecond) @@ -599,11 +614,11 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { session, _ := th.App.GetSession(th.Client.AuthToken) cli := th.CreateClient() - _, loginResp := cli.Login(th.BasicUser2.Username, th.BasicUser2.Password) - require.Nil(t, loginResp.Error) + _, _, err := cli.Login(th.BasicUser2.Username, th.BasicUser2.Password) + require.NoError(t, err) wsClient, err := th.CreateWebSocketClientWithClient(cli) - require.Nil(t, err) + require.NoError(t, err) defer wsClient.Close() wsClient.Listen() @@ -640,9 +655,9 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { assert.Equal(t, http.StatusCreated, resp.Code) waitForEvent(false) - _, err = th.App.GetStatus(th.BasicUser.Id) - require.NotNil(t, err) - assert.Equal(t, "app.status.get.missing.app_error", err.Id) + _, appErr := th.App.GetStatus(th.BasicUser.Id) + require.NotNil(t, appErr) + assert.Equal(t, "app.status.get.missing.app_error", appErr.Id) req = httptest.NewRequest("POST", "/api/v4/posts", strings.NewReader(post.ToJson())) req.Header.Set(model.HeaderAuth, "Bearer "+session.Token) @@ -651,25 +666,25 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { assert.Equal(t, http.StatusCreated, resp.Code) waitForEvent(true) - st, err := th.App.GetStatus(th.BasicUser.Id) - require.Nil(t, err) + st, appErr := th.App.GetStatus(th.BasicUser.Id) + require.Nil(t, appErr) assert.Equal(t, "online", st.Status) } func TestUpdatePost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel th.App.Srv().SetLicense(model.NewTestLicense()) fileIds := make([]string, 3) - data, err := testutils.ReadTestFile("test.png") - require.NoError(t, err) + data, err2 := testutils.ReadTestFile("test.png") + require.NoError(t, err2) for i := 0; i < len(fileIds); i++ { - fileResp, resp := Client.UploadFile(data, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(data, channel.Id, "test.png") + require.NoError(t, err) fileIds[i] = fileResp.FileInfos[0].Id } @@ -690,19 +705,19 @@ func TestUpdatePost(t *testing.T) { rpost.Message = msg rpost.UserId = "" - rupost, resp := Client.UpdatePost(rpost.Id, &model.Post{ + rupost, _, err := client.UpdatePost(rpost.Id, &model.Post{ Id: rpost.Id, Message: rpost.Message, FileIds: fileIds[0:2], // one fewer file id }) - CheckNoError(t, resp) + require.NoError(t, err) assert.Equal(t, rupost.Message, msg, "failed to updates") assert.NotEqual(t, 0, rupost.EditAt, "EditAt not updated for post") assert.Equal(t, model.StringArray(fileIds), rupost.FileIds, "FileIds should have not have been updated") - actual, resp := Client.GetPost(rpost.Id, "") - CheckNoError(t, resp) + actual, _, err := client.GetPost(rpost.Id, "") + require.NoError(t, err) assert.Equal(t, actual.Message, msg, "failed to updates") assert.NotEqual(t, 0, actual.EditAt, "EditAt not updated for post") @@ -713,15 +728,15 @@ func TestUpdatePost(t *testing.T) { msg1 := "#hashtag a" + model.NewId() + " update post again" rpost.Message = msg1 rpost.AddProp(model.PropsAddChannelMember, "no good") - rrupost, resp := Client.UpdatePost(rpost.Id, rpost) - CheckNoError(t, resp) + rrupost, _, err := client.UpdatePost(rpost.Id, rpost) + require.NoError(t, err) assert.Equal(t, msg1, rrupost.Message, "failed to update message") assert.Equal(t, "#hashtag", rrupost.Hashtags, "failed to update hashtags") assert.Nil(t, rrupost.GetProp(model.PropsAddChannelMember), "failed to sanitize Props['add_channel_member'], should be nil") - actual, resp := Client.GetPost(rpost.Id, "") - CheckNoError(t, resp) + actual, _, err := client.GetPost(rpost.Id, "") + require.NoError(t, err) assert.Equal(t, msg1, actual.Message, "failed to update message") assert.Equal(t, "#hashtag", actual.Hashtags, "failed to update hashtags") @@ -729,20 +744,22 @@ func TestUpdatePost(t *testing.T) { }) t.Run("join/leave post", func(t *testing.T) { - rpost2, err := th.App.CreatePost(th.Context, &model.Post{ + var rpost2 *model.Post + rpost2, appErr = th.App.CreatePost(th.Context, &model.Post{ ChannelId: channel.Id, Message: "zz" + model.NewId() + "a", Type: model.PostTypeJoinLeave, UserId: th.BasicUser.Id, }, channel, false, true) - require.Nil(t, err) + require.Nil(t, appErr) up2 := &model.Post{ Id: rpost2.Id, ChannelId: channel.Id, Message: "zz" + model.NewId() + " update post 2", } - _, resp := Client.UpdatePost(rpost2.Id, up2) + _, resp, err := client.UpdatePost(rpost2.Id, up2) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -760,12 +777,12 @@ func TestUpdatePost(t *testing.T) { Message: "zz" + model.NewId() + " update post 3", FileIds: fileIds[0:2], } - rrupost3, resp := Client.UpdatePost(rpost3.Id, up3) - CheckNoError(t, resp) + rrupost3, _, err := client.UpdatePost(rpost3.Id, up3) + require.NoError(t, err) assert.Empty(t, rrupost3.FileIds) - actual, resp := Client.GetPost(rpost.Id, "") - CheckNoError(t, resp) + actual, _, err := client.GetPost(rpost.Id, "") + require.NoError(t, err) assert.Equal(t, model.StringArray(fileIds), actual.FileIds) }) @@ -780,37 +797,40 @@ func TestUpdatePost(t *testing.T) { Text: "Hello World", }, }) - rrupost3, resp := Client.UpdatePost(rpost3.Id, up4) - CheckNoError(t, resp) + rrupost3, _, err := client.UpdatePost(rpost3.Id, up4) + require.NoError(t, err) assert.NotEqual(t, rpost3.EditAt, rrupost3.EditAt) assert.NotEqual(t, rpost3.Attachments(), rrupost3.Attachments()) }) t.Run("logged out", func(t *testing.T) { - Client.Logout() - _, resp := Client.UpdatePost(rpost.Id, rpost) + client.Logout() + _, resp, err := client.UpdatePost(rpost.Id, rpost) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("different user", func(t *testing.T) { th.LoginBasic2() - _, resp := Client.UpdatePost(rpost.Id, rpost) + _, resp, err := client.UpdatePost(rpost.Id, rpost) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() }) t.Run("different user, but team admin", func(t *testing.T) { th.LoginTeamAdmin() - _, resp := Client.UpdatePost(rpost.Id, rpost) + _, resp, err := client.UpdatePost(rpost.Id, rpost) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() }) t.Run("different user, but system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.UpdatePost(rpost.Id, rpost) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.UpdatePost(rpost.Id, rpost) + require.NoError(t, err) }) } @@ -831,28 +851,28 @@ func TestUpdateOthersPostInDirectMessageChannel(t *testing.T) { CreateAt: 0, } - post, resp := th.Client.CreatePost(post) - CheckNoError(t, resp) + post, _, err := th.Client.CreatePost(post) + require.NoError(t, err) post.Message = "changed" - _, resp = th.SystemAdminClient.UpdatePost(post.Id, post) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.UpdatePost(post.Id, post) + require.NoError(t, err) } func TestPatchPost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client channel := th.BasicChannel th.App.Srv().SetLicense(model.NewTestLicense()) fileIDs := make([]string, 3) - data, err := testutils.ReadTestFile("test.png") - require.NoError(t, err) + data, err2 := testutils.ReadTestFile("test.png") + require.NoError(t, err2) for i := 0; i < len(fileIDs); i++ { - fileResp, resp := Client.UploadFile(data, channel.Id, "test.png") - CheckNoError(t, resp) + fileResp, _, err := client.UploadFile(data, channel.Id, "test.png") + require.NoError(t, err) fileIDs[i] = fileResp.FileInfos[0].Id } sort.Strings(fileIDs) @@ -865,7 +885,8 @@ func TestPatchPost(t *testing.T) { FileIds: fileIDs[0:2], HasReactions: true, } - post, _ = Client.CreatePost(post) + post, _, err := client.CreatePost(post) + require.NoError(t, err) var rpost *model.Post t.Run("new message, props, files, HasReactions bit", func(t *testing.T) { @@ -878,9 +899,8 @@ func TestPatchPost(t *testing.T) { patch.FileIds = &patchFileIds patch.HasReactions = model.NewBool(false) - var resp *model.Response - rpost, resp = Client.PatchPost(post.Id, patch) - CheckNoError(t, resp) + rpost, _, err = client.PatchPost(post.Id, patch) + require.NoError(t, err) assert.False(t, rpost.IsPinned, "IsPinned did not update properly") assert.Equal(t, "#otherhashtag other message", rpost.Message, "Message did not update properly") @@ -899,59 +919,65 @@ func TestPatchPost(t *testing.T) { } patch2.Props = &model.StringInterface{"attachments": attachments} - rpost2, resp := Client.PatchPost(post.Id, patch2) - CheckNoError(t, resp) + rpost2, _, err := client.PatchPost(post.Id, patch2) + require.NoError(t, err) assert.NotEmpty(t, rpost2.GetProp("attachments")) assert.NotEqual(t, rpost.EditAt, rpost2.EditAt) }) t.Run("invalid requests", func(t *testing.T) { - r, err := Client.DoApiPut("/posts/"+post.Id+"/patch", "garbage") + r, err := client.DoApiPut("/posts/"+post.Id+"/patch", "garbage") require.EqualError(t, err, ": Invalid or missing post in request body., ") require.Equal(t, http.StatusBadRequest, r.StatusCode, "wrong status code") patch := &model.PostPatch{} - _, resp := Client.PatchPost("junk", patch) + _, resp, err := client.PatchPost("junk", patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("unknown post", func(t *testing.T) { patch := &model.PostPatch{} - _, resp := Client.PatchPost(GenerateTestId(), patch) + _, resp, err := client.PatchPost(GenerateTestId(), patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("logged out", func(t *testing.T) { - Client.Logout() + client.Logout() patch := &model.PostPatch{} - _, resp := Client.PatchPost(post.Id, patch) + _, resp, err := client.PatchPost(post.Id, patch) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("different user", func(t *testing.T) { th.LoginBasic2() patch := &model.PostPatch{} - _, resp := Client.PatchPost(post.Id, patch) + _, resp, err := client.PatchPost(post.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("different user, but team admin", func(t *testing.T) { th.LoginTeamAdmin() patch := &model.PostPatch{} - _, resp := Client.PatchPost(post.Id, patch) + _, resp, err := client.PatchPost(post.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("different user, but system admin", func(t *testing.T) { patch := &model.PostPatch{} - _, resp := th.SystemAdminClient.PatchPost(post.Id, patch) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.PatchPost(post.Id, patch) + require.NoError(t, err) }) t.Run("edit others posts permission can function independently of edit own post", func(t *testing.T) { th.LoginBasic2() patch := &model.PostPatch{} - _, resp := Client.PatchPost(post.Id, patch) + _, resp, err := client.PatchPost(post.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Add permission to edit others' @@ -959,30 +985,30 @@ func TestPatchPost(t *testing.T) { th.RemovePermissionFromRole(model.PermissionEditPost.Id, model.ChannelUserRoleId) th.AddPermissionToRole(model.PermissionEditOthersPosts.Id, model.ChannelUserRoleId) - _, resp = Client.PatchPost(post.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchPost(post.Id, patch) + require.NoError(t, err) }) } func TestPinPost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post := th.BasicPost - pass, resp := Client.PinPost(post.Id) - CheckNoError(t, resp) + _, err := client.PinPost(post.Id) + require.NoError(t, err) - require.True(t, pass, "should have passed") - rpost, err := th.App.GetSinglePost(post.Id) - require.Nil(t, err) + rpost, appErr := th.App.GetSinglePost(post.Id) + require.Nil(t, appErr) require.True(t, rpost.IsPinned, "failed to pin post") - pass, resp = Client.PinPost("junk") + resp, err := client.PinPost("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, pass, "should have failed") - _, resp = Client.PinPost(GenerateTestId()) + resp, err = client.PinPost(GenerateTestId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) t.Run("unable-to-pin-post-in-read-only-town-square", func(t *testing.T) { @@ -993,60 +1019,63 @@ func TestPinPost(t *testing.T) { defer th.App.Srv().RemoveLicense() defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.ExperimentalTownSquareIsReadOnly = townSquareIsReadOnly }) - channel, err := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) - assert.Nil(t, err) + channel, appErr := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) + assert.Nil(t, appErr) adminPost := th.CreatePostWithClient(th.SystemAdminClient, channel) - _, resp = Client.PinPost(adminPost.Id) + resp, err = client.PinPost(adminPost.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) - Client.Logout() - _, resp = Client.PinPost(post.Id) + client.Logout() + resp, err = client.PinPost(post.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.PinPost(post.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.PinPost(post.Id) + require.NoError(t, err) } func TestUnpinPost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client pinnedPost := th.CreatePinnedPost() - pass, resp := Client.UnpinPost(pinnedPost.Id) - CheckNoError(t, resp) - require.True(t, pass, "should have passed") + _, err := client.UnpinPost(pinnedPost.Id) + require.NoError(t, err) - rpost, err := th.App.GetSinglePost(pinnedPost.Id) - require.Nil(t, err) + rpost, appErr := th.App.GetSinglePost(pinnedPost.Id) + require.Nil(t, appErr) require.False(t, rpost.IsPinned) - pass, resp = Client.UnpinPost("junk") + resp, err := client.UnpinPost("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, pass, "should have failed") - _, resp = Client.UnpinPost(GenerateTestId()) + resp, err = client.UnpinPost(GenerateTestId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.UnpinPost(pinnedPost.Id) + client.Logout() + resp, err = client.UnpinPost(pinnedPost.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.UnpinPost(pinnedPost.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UnpinPost(pinnedPost.Id) + require.NoError(t, err) } func TestGetPostsForChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post1 := th.CreatePost() post2 := th.CreatePost() post3 := &model.Post{ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id} - post3, _ = Client.CreatePost(post3) + post3, _, _ = client.CreatePost(post3) time.Sleep(300 * time.Millisecond) since := model.GetMillis() @@ -1055,18 +1084,18 @@ func TestGetPostsForChannel(t *testing.T) { post4 := th.CreatePost() th.TestForAllClients(t, func(t *testing.T, c *model.Client4) { - posts, resp := c.GetPostsForChannel(th.BasicChannel.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, resp, err := c.GetPostsForChannel(th.BasicChannel.Id, 0, 60, "", false) + require.NoError(t, err) require.Equal(t, post4.Id, posts.Order[0], "wrong order") require.Equal(t, post3.Id, posts.Order[1], "wrong order") require.Equal(t, post2.Id, posts.Order[2], "wrong order") require.Equal(t, post1.Id, posts.Order[3], "wrong order") - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, resp.Etag, false) + posts, resp, _ = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, resp.Etag, false) CheckEtag(t, posts, resp) - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "wrong number returned") _, ok := posts.Posts[post3.Id] @@ -1074,20 +1103,20 @@ func TestGetPostsForChannel(t *testing.T) { _, ok = posts.Posts[post1.Id] require.True(t, ok, "missing root post") - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 1, 1, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 1, 1, "", false) + require.NoError(t, err) require.Equal(t, post3.Id, posts.Order[0], "wrong order") - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 10000, 10000, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 10000, 10000, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should be no posts") }) post5 := th.CreatePost() th.TestForAllClients(t, func(t *testing.T, c *model.Client4) { - posts, resp := c.GetPostsSince(th.BasicChannel.Id, since, false) - CheckNoError(t, resp) + posts, _, err := c.GetPostsSince(th.BasicChannel.Id, since, false) + require.NoError(t, err) require.Len(t, posts.Posts, 2, "should return 2 posts") // "since" query to return empty NextPostId and PrevPostId @@ -1108,23 +1137,27 @@ func TestGetPostsForChannel(t *testing.T) { require.True(t, f, "missing post") } - _, resp = c.GetPostsForChannel("", 0, 60, "", false) + _, resp, err := c.GetPostsForChannel("", 0, 60, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = c.GetPostsForChannel("junk", 0, 60, "", false) + _, resp, err = c.GetPostsForChannel("junk", 0, 60, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) - _, resp := Client.GetPostsForChannel(model.NewId(), 0, 60, "", false) + _, resp, err := client.GetPostsForChannel(model.NewId(), 0, 60, "", false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetPostsForChannel(model.NewId(), 0, 60, "", false) + client.Logout() + _, resp, err = client.GetPostsForChannel(model.NewId(), 0, 60, "", false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) // more tests for next_post_id, prev_post_id, and order // There are 12 posts composed of first 2 system messages and 10 created posts - Client.Login(th.BasicUser.Email, th.BasicUser.Password) + client.Login(th.BasicUser.Email, th.BasicUser.Password) th.CreatePost() // post6 post7 := th.CreatePost() post8 := th.CreatePost() @@ -1134,12 +1167,13 @@ func TestGetPostsForChannel(t *testing.T) { var posts *model.PostList th.TestForAllClients(t, func(t *testing.T, c *model.Client4) { // get the system post IDs posted before the created posts above - posts, resp = c.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) + posts, _, err = c.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) + require.NoError(t, err) systemPostId1 := posts.Order[1] // similar to '/posts' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 0, 60, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 12, "expected 12 posts") require.Equal(t, post10.Id, posts.Order[0], "posts not in order") require.Equal(t, systemPostId1, posts.Order[11], "posts not in order") @@ -1147,8 +1181,8 @@ func TestGetPostsForChannel(t *testing.T) { require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?per_page=3' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post10.Id, posts.Order[0], "posts not in order") require.Equal(t, post8.Id, posts.Order[2], "should return 3 posts and match order") @@ -1156,8 +1190,8 @@ func TestGetPostsForChannel(t *testing.T) { require.Equal(t, post7.Id, posts.PrevPostId, "should return post7.Id as PrevPostId") // similar to '/posts?per_page=3&page=1' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 1, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 1, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post7.Id, posts.Order[0], "posts not in order") require.Equal(t, post5.Id, posts.Order[2], "posts not in order") @@ -1165,8 +1199,8 @@ func TestGetPostsForChannel(t *testing.T) { require.Equal(t, post4.Id, posts.PrevPostId, "should return post4.Id as PrevPostId") // similar to '/posts?per_page=3&page=2' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 2, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 2, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post4.Id, posts.Order[0], "posts not in order") require.Equal(t, post2.Id, posts.Order[2], "should return 3 posts and match order") @@ -1174,8 +1208,8 @@ func TestGetPostsForChannel(t *testing.T) { require.Equal(t, post1.Id, posts.PrevPostId, "should return post1.Id as PrevPostId") // similar to '/posts?per_page=3&page=3' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 3, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 3, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post1.Id, posts.Order[0], "posts not in order") require.Equal(t, systemPostId1, posts.Order[2], "should return 3 posts and match order") @@ -1183,8 +1217,8 @@ func TestGetPostsForChannel(t *testing.T) { require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?per_page=3&page=4' - posts, resp = c.GetPostsForChannel(th.BasicChannel.Id, 4, 3, "", false) - CheckNoError(t, resp) + posts, _, err = c.GetPostsForChannel(th.BasicChannel.Id, 4, 3, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, "", posts.NextPostId, "should return an empty NextPostId") require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") @@ -1194,13 +1228,13 @@ func TestGetPostsForChannel(t *testing.T) { func TestGetFlaggedPostsForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser team1 := th.BasicTeam channel1 := th.BasicChannel post1 := th.CreatePost() channel2 := th.CreatePublicChannel() - post2 := th.CreatePostWithClient(Client, channel2) + post2 := th.CreatePostWithClient(client, channel2) preference := model.Preference{ UserId: user.Id, @@ -1208,121 +1242,122 @@ func TestGetFlaggedPostsForUser(t *testing.T) { Name: post1.Id, Value: "true", } - _, resp := Client.UpdatePreferences(user.Id, &model.Preferences{preference}) - CheckNoError(t, resp) + _, err := client.UpdatePreferences(user.Id, &model.Preferences{preference}) + require.NoError(t, err) preference.Name = post2.Id - _, resp = Client.UpdatePreferences(user.Id, &model.Preferences{preference}) - CheckNoError(t, resp) + _, err = client.UpdatePreferences(user.Id, &model.Preferences{preference}) + require.NoError(t, err) opl := model.NewPostList() opl.AddPost(post1) opl.AddOrder(post1.Id) - rpl, resp := Client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err := client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) + require.NoError(t, err) require.Len(t, rpl.Posts, 1, "should have returned 1 post") require.Equal(t, opl.Posts, rpl.Posts, "posts should have matched") - rpl, resp = Client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 1) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 1) + require.NoError(t, err) require.Len(t, rpl.Posts, 1, "should have returned 1 post") - rpl, resp = Client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 1, 1) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 1, 1) + require.NoError(t, err) require.Empty(t, rpl.Posts) - rpl, resp = Client.GetFlaggedPostsForUserInChannel(user.Id, GenerateTestId(), 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInChannel(user.Id, GenerateTestId(), 0, 10) + require.NoError(t, err) require.Empty(t, rpl.Posts) - rpl, resp = Client.GetFlaggedPostsForUserInChannel(user.Id, "junk", 0, 10) - CheckBadRequestStatus(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInChannel(user.Id, "junk", 0, 10) + require.Error(t, err) require.Nil(t, rpl) opl.AddPost(post2) opl.AddOrder(post2.Id) - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) + require.NoError(t, err) require.Len(t, rpl.Posts, 2, "should have returned 2 posts") require.Equal(t, opl.Posts, rpl.Posts, "posts should have matched") - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 1) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 1) + require.NoError(t, err) require.Len(t, rpl.Posts, 1, "should have returned 1 post") - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 1, 1) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 1, 1) + require.NoError(t, err) require.Len(t, rpl.Posts, 1, "should have returned 1 post") - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 1000, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 1000, 10) + require.NoError(t, err) require.Empty(t, rpl.Posts) - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, GenerateTestId(), 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, GenerateTestId(), 0, 10) + require.NoError(t, err) require.Empty(t, rpl.Posts) - rpl, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, "junk", 0, 10) - CheckBadRequestStatus(t, resp) + rpl, _, err = client.GetFlaggedPostsForUserInTeam(user.Id, "junk", 0, 10) + require.Error(t, err) require.Nil(t, rpl) channel3 := th.CreatePrivateChannel() - post4 := th.CreatePostWithClient(Client, channel3) + post4 := th.CreatePostWithClient(client, channel3) preference.Name = post4.Id - Client.UpdatePreferences(user.Id, &model.Preferences{preference}) + client.UpdatePreferences(user.Id, &model.Preferences{preference}) opl.AddPost(post4) opl.AddOrder(post4.Id) - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 0, 10) + require.NoError(t, err) require.Len(t, rpl.Posts, 3, "should have returned 3 posts") require.Equal(t, opl.Posts, rpl.Posts, "posts should have matched") - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 2) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 0, 2) + require.NoError(t, err) require.Len(t, rpl.Posts, 2, "should have returned 2 posts") - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 2, 2) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 2, 2) + require.NoError(t, err) require.Len(t, rpl.Posts, 1, "should have returned 1 post") - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 1000, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 1000, 10) + require.NoError(t, err) require.Empty(t, rpl.Posts) channel4 := th.CreateChannelWithClient(th.SystemAdminClient, model.ChannelTypePrivate) post5 := th.CreatePostWithClient(th.SystemAdminClient, channel4) preference.Name = post5.Id - _, resp = Client.UpdatePreferences(user.Id, &model.Preferences{preference}) + resp, err := client.UpdatePreferences(user.Id, &model.Preferences{preference}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 0, 10) + require.NoError(t, err) require.Len(t, rpl.Posts, 3, "should have returned 3 posts") require.Equal(t, opl.Posts, rpl.Posts, "posts should have matched") th.AddUserToChannel(user, channel4) - _, resp = Client.UpdatePreferences(user.Id, &model.Preferences{preference}) - CheckNoError(t, resp) + _, err = client.UpdatePreferences(user.Id, &model.Preferences{preference}) + require.NoError(t, err) - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 0, 10) + require.NoError(t, err) opl.AddPost(post5) opl.AddOrder(post5.Id) require.Len(t, rpl.Posts, 4, "should have returned 4 posts") require.Equal(t, opl.Posts, rpl.Posts, "posts should have matched") - err := th.App.RemoveUserFromChannel(th.Context, user.Id, "", channel4) - assert.Nil(t, err, "unable to remove user from channel") + appErr := th.App.RemoveUserFromChannel(th.Context, user.Id, "", channel4) + assert.Nil(t, appErr, "unable to remove user from channel") - rpl, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 10) - CheckNoError(t, resp) + rpl, _, err = client.GetFlaggedPostsForUser(user.Id, 0, 10) + require.NoError(t, err) opl2 := model.NewPostList() opl2.AddPost(post1) @@ -1335,31 +1370,36 @@ func TestGetFlaggedPostsForUser(t *testing.T) { require.Len(t, rpl.Posts, 3, "should have returned 3 posts") require.Equal(t, opl2.Posts, rpl.Posts, "posts should have matched") - _, resp = Client.GetFlaggedPostsForUser("junk", 0, 10) + _, resp, err = client.GetFlaggedPostsForUser("junk", 0, 10) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFlaggedPostsForUser(GenerateTestId(), 0, 10) + _, resp, err = client.GetFlaggedPostsForUser(GenerateTestId(), 0, 10) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) + _, resp, err = client.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) + _, resp, err = client.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = Client.GetFlaggedPostsForUser(user.Id, 0, 10) + _, resp, err = client.GetFlaggedPostsForUser(user.Id, 0, 10) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetFlaggedPostsForUserInChannel(user.Id, channel1.Id, 0, 10) + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetFlaggedPostsForUserInTeam(user.Id, team1.Id, 0, 10) + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetFlaggedPostsForUser(user.Id, 0, 10) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetFlaggedPostsForUser(user.Id, 0, 10) + require.NoError(t, err) mockStore := mocks.Store{} mockPostStore := mocks.PostStore{} @@ -1378,14 +1418,15 @@ func TestGetFlaggedPostsForUser(t *testing.T) { mockStore.On("Close").Return(nil) th.App.Srv().Store = &mockStore - _, resp = th.SystemAdminClient.GetFlaggedPostsForUser(user.Id, 0, 10) + _, resp, err = th.SystemAdminClient.GetFlaggedPostsForUser(user.Id, 0, 10) + require.Error(t, err) CheckInternalErrorStatus(t, resp) } func TestGetPostsBefore(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post1 := th.CreatePost() post2 := th.CreatePost() @@ -1393,8 +1434,8 @@ func TestGetPostsBefore(t *testing.T) { post4 := th.CreatePost() post5 := th.CreatePost() - posts, resp := Client.GetPostsBefore(th.BasicChannel.Id, post3.Id, 0, 100, "", false) - CheckNoError(t, resp) + posts, _, err := client.GetPostsBefore(th.BasicChannel.Id, post3.Id, 0, 100, "", false) + require.NoError(t, err) found := make([]bool, 2) for _, p := range posts.Posts { @@ -1415,18 +1456,19 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, post3.Id, posts.NextPostId, "should match NextPostId") require.Equal(t, "", posts.PrevPostId, "should match empty PrevPostId") - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post4.Id, 1, 1, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post4.Id, 1, 1, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 1, "too many posts returned") require.Equal(t, post2.Id, posts.Order[0], "should match returned post") require.Equal(t, post3.Id, posts.NextPostId, "should match NextPostId") require.Equal(t, post1.Id, posts.PrevPostId, "should match PrevPostId") - _, resp = Client.GetPostsBefore(th.BasicChannel.Id, "junk", 1, 1, "", false) + _, resp, err := client.GetPostsBefore(th.BasicChannel.Id, "junk", 1, 1, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post5.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post5.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 3, "should match length of posts returned") require.Equal(t, post4.Id, posts.Order[0], "should match returned post") require.Equal(t, post2.Id, posts.Order[2], "should match returned post") @@ -1434,13 +1476,13 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, post1.Id, posts.PrevPostId, "should match PrevPostId") // get the system post IDs posted before the created posts above - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) + require.NoError(t, err) systemPostId2 := posts.Order[0] systemPostId1 := posts.Order[1] - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post5.Id, 1, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post5.Id, 1, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 3, "should match length of posts returned") require.Equal(t, post1.Id, posts.Order[0], "should match returned post") require.Equal(t, systemPostId2, posts.Order[1], "should match returned post") @@ -1457,8 +1499,8 @@ func TestGetPostsBefore(t *testing.T) { th.CreatePost() // post10 // similar to '/posts?before=post9' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 0, 60, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 10, "expected 10 posts") require.Equal(t, post8.Id, posts.Order[0], "posts not in order") require.Equal(t, systemPostId1, posts.Order[9], "posts not in order") @@ -1466,8 +1508,8 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?before=post9&per_page=3' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post8.Id, posts.Order[0], "posts not in order") require.Equal(t, post6.Id, posts.Order[2], "should return 3 posts and match order") @@ -1475,8 +1517,8 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, post5.Id, posts.PrevPostId, "should return post5.Id as PrevPostId") // similar to '/posts?before=post9&per_page=3&page=1' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 1, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 1, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post5.Id, posts.Order[0], "posts not in order") require.Equal(t, post3.Id, posts.Order[2], "posts not in order") @@ -1484,8 +1526,8 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, post2.Id, posts.PrevPostId, "should return post2.Id as PrevPostId") // similar to '/posts?before=post9&per_page=3&page=2' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 2, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post9.Id, 2, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post2.Id, posts.Order[0], "posts not in order") require.Equal(t, systemPostId2, posts.Order[2], "posts not in order") @@ -1493,8 +1535,8 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, systemPostId1, posts.PrevPostId, "should return systemPostId1 as PrevPostId") // similar to '/posts?before=post1&per_page=3' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 2, "expected 2 posts") require.Equal(t, systemPostId2, posts.Order[0], "posts not in order") require.Equal(t, systemPostId1, posts.Order[1], "posts not in order") @@ -1502,23 +1544,23 @@ func TestGetPostsBefore(t *testing.T) { require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?before=systemPostId1' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, systemPostId1, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, systemPostId1, 0, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, systemPostId1, posts.NextPostId, "should return systemPostId1 as NextPostId") require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?before=systemPostId1&per_page=60&page=1' - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, systemPostId1, 1, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, systemPostId1, 1, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 posts") require.Equal(t, "", posts.NextPostId, "should return an empty NextPostId") require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?before=non-existent-post' nonExistentPostId := model.NewId() - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, nonExistentPostId, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, nonExistentPostId, 0, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, nonExistentPostId, posts.NextPostId, "should return nonExistentPostId as NextPostId") require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") @@ -1527,7 +1569,7 @@ func TestGetPostsBefore(t *testing.T) { func TestGetPostsAfter(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post1 := th.CreatePost() post2 := th.CreatePost() @@ -1535,8 +1577,8 @@ func TestGetPostsAfter(t *testing.T) { post4 := th.CreatePost() post5 := th.CreatePost() - posts, resp := Client.GetPostsAfter(th.BasicChannel.Id, post3.Id, 0, 100, "", false) - CheckNoError(t, resp) + posts, _, err := client.GetPostsAfter(th.BasicChannel.Id, post3.Id, 0, 100, "", false) + require.NoError(t, err) found := make([]bool, 2) for _, p := range posts.Posts { @@ -1555,26 +1597,27 @@ func TestGetPostsAfter(t *testing.T) { require.Equal(t, "", posts.NextPostId, "should match empty NextPostId") require.Equal(t, post3.Id, posts.PrevPostId, "should match PrevPostId") - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 1, 1, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 1, 1, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 1, "too many posts returned") require.Equal(t, post4.Id, posts.Order[0], "should match returned post") require.Equal(t, post5.Id, posts.NextPostId, "should match NextPostId") require.Equal(t, post3.Id, posts.PrevPostId, "should match PrevPostId") - _, resp = Client.GetPostsAfter(th.BasicChannel.Id, "junk", 1, 1, "", false) + _, resp, err := client.GetPostsAfter(th.BasicChannel.Id, "junk", 1, 1, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post1.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post1.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 3, "should match length of posts returned") require.Equal(t, post4.Id, posts.Order[0], "should match returned post") require.Equal(t, post2.Id, posts.Order[2], "should match returned post") require.Equal(t, post5.Id, posts.NextPostId, "should match NextPostId") require.Equal(t, post1.Id, posts.PrevPostId, "should match PrevPostId") - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post1.Id, 1, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post1.Id, 1, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Posts, 1, "should match length of posts returned") require.Equal(t, post5.Id, posts.Order[0], "should match returned post") require.Equal(t, "", posts.NextPostId, "should match NextPostId") @@ -1589,8 +1632,8 @@ func TestGetPostsAfter(t *testing.T) { post10 := th.CreatePost() // similar to '/posts?after=post2' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 0, 60, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 8, "expected 8 posts") require.Equal(t, post10.Id, posts.Order[0], "should match order") require.Equal(t, post3.Id, posts.Order[7], "should match order") @@ -1598,8 +1641,8 @@ func TestGetPostsAfter(t *testing.T) { require.Equal(t, post2.Id, posts.PrevPostId, "should return post2.Id as PrevPostId") // similar to '/posts?after=post2&per_page=3' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 0, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 0, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post5.Id, posts.Order[0], "should match order") require.Equal(t, post3.Id, posts.Order[2], "should return 3 posts and match order") @@ -1607,8 +1650,8 @@ func TestGetPostsAfter(t *testing.T) { require.Equal(t, post2.Id, posts.PrevPostId, "should return post2.Id as PrevPostId") // similar to '/posts?after=post2&per_page=3&page=1' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 1, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 1, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "expected 3 posts") require.Equal(t, post8.Id, posts.Order[0], "should match order") require.Equal(t, post6.Id, posts.Order[2], "should match order") @@ -1616,8 +1659,8 @@ func TestGetPostsAfter(t *testing.T) { require.Equal(t, post5.Id, posts.PrevPostId, "should return post5.Id as PrevPostId") // similar to '/posts?after=post2&per_page=3&page=2' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 2, 3, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post2.Id, 2, 3, "", false) + require.NoError(t, err) require.Len(t, posts.Order, 2, "expected 2 posts") require.Equal(t, post10.Id, posts.Order[0], "should match order") require.Equal(t, post9.Id, posts.Order[1], "should match order") @@ -1625,23 +1668,23 @@ func TestGetPostsAfter(t *testing.T) { require.Equal(t, post8.Id, posts.PrevPostId, "should return post8.Id as PrevPostId") // similar to '/posts?after=post10' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post10.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post10.Id, 0, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, "", posts.NextPostId, "should return an empty NextPostId") require.Equal(t, post10.Id, posts.PrevPostId, "should return post10.Id as PrevPostId") // similar to '/posts?after=post10&page=1' - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, post10.Id, 1, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, post10.Id, 1, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, "", posts.NextPostId, "should return an empty NextPostId") require.Equal(t, "", posts.PrevPostId, "should return an empty PrevPostId") // similar to '/posts?after=non-existent-post' nonExistentPostId := model.NewId() - posts, resp = Client.GetPostsAfter(th.BasicChannel.Id, nonExistentPostId, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAfter(th.BasicChannel.Id, nonExistentPostId, 0, 60, "", false) + require.NoError(t, err) require.Empty(t, posts.Order, "should return 0 post") require.Equal(t, "", posts.NextPostId, "should return an empty NextPostId") require.Equal(t, nonExistentPostId, posts.PrevPostId, "should return nonExistentPostId as PrevPostId") @@ -1650,7 +1693,7 @@ func TestGetPostsAfter(t *testing.T) { func TestGetPostsForChannelAroundLastUnread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client userId := th.BasicUser.Id channelId := th.BasicChannel.Id @@ -1661,16 +1704,16 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { post4 := th.CreatePost() post5 := th.CreatePost() replyPost := &model.Post{ChannelId: channelId, Message: model.NewId(), RootId: post4.Id, ParentId: post4.Id} - post6, resp := Client.CreatePost(replyPost) - CheckNoError(t, resp) - post7, resp := Client.CreatePost(replyPost) - CheckNoError(t, resp) - post8, resp := Client.CreatePost(replyPost) - CheckNoError(t, resp) - post9, resp := Client.CreatePost(replyPost) - CheckNoError(t, resp) - post10, resp := Client.CreatePost(replyPost) - CheckNoError(t, resp) + post6, _, err := client.CreatePost(replyPost) + require.NoError(t, err) + post7, _, err := client.CreatePost(replyPost) + require.NoError(t, err) + post8, _, err := client.CreatePost(replyPost) + require.NoError(t, err) + post9, _, err := client.CreatePost(replyPost) + require.NoError(t, err) + post10, _, err := client.CreatePost(replyPost) + require.NoError(t, err) postIdNames := map[string]string{ post1.Id: "post1", @@ -1723,15 +1766,15 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { } // Setting limit_after to zero should fail with a 400 BadRequest. - posts, resp := Client.GetPostsAroundLastUnread(userId, channelId, 20, 0, false) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.invalid_url_param.app_error", resp.Error.Id) + posts, resp, err := client.GetPostsAroundLastUnread(userId, channelId, 20, 0, false) + require.Error(t, err) + CheckErrorID(t, err, "api.context.invalid_url_param.app_error") require.Equal(t, http.StatusBadRequest, resp.StatusCode) require.Nil(t, posts) // All returned posts are all read by the user, since it's created by the user itself. - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 20, 20, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 20, 20, false) + require.NoError(t, err) require.Len(t, posts.Order, 12, "Should return 12 posts only since there's no unread post") // Set channel member's last viewed to 0. @@ -1743,14 +1786,14 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 20, 20, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 20, 20, false) + require.NoError(t, err) require.Len(t, posts.Order, 12, "Should return 12 posts only since there's no unread post") // get the first system post generated before the created posts above - posts, resp = Client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsBefore(th.BasicChannel.Id, post1.Id, 0, 2, "", false) + require.NoError(t, err) systemPost0 := posts.Posts[posts.Order[0]] postIdNames[systemPost0.Id] = "system post 0" systemPost1 := posts.Posts[posts.Order[1]] @@ -1764,8 +1807,8 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) + require.NoError(t, err) assertPostList(t, &model.PostList{ Order: []string{post3.Id, post2.Id, post1.Id, systemPost0.Id, systemPost1.Id}, @@ -1788,8 +1831,8 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) + require.NoError(t, err) assertPostList(t, &model.PostList{ Order: []string{post8.Id, post7.Id, post6.Id, post5.Id, post4.Id, post3.Id}, @@ -1815,8 +1858,8 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) + require.NoError(t, err) assertPostList(t, &model.PostList{ Order: []string{post10.Id, post9.Id, post8.Id, post7.Id}, @@ -1840,8 +1883,8 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 3, 3, false) + require.NoError(t, err) assertPostList(t, &model.PostList{ Order: []string{post10.Id, post9.Id, post8.Id}, @@ -1860,13 +1903,13 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { // Set channel member's last viewed to just before a new reply to a previous thread, not // otherwise in the requested window. post11 := th.CreatePost() - post12, resp := Client.CreatePost(&model.Post{ + post12, _, err := client.CreatePost(&model.Post{ ChannelId: channelId, Message: model.NewId(), RootId: post4.Id, ParentId: post4.Id, }) - CheckNoError(t, resp) + require.NoError(t, err) post13 := th.CreatePost() postIdNames[post11.Id] = "post11" @@ -1880,8 +1923,8 @@ func TestGetPostsForChannelAroundLastUnread(t *testing.T) { require.NoError(t, err) th.App.Srv().Store.Post().InvalidateLastPostTimeCache(channelId) - posts, resp = Client.GetPostsAroundLastUnread(userId, channelId, 1, 2, false) - CheckNoError(t, resp) + posts, _, err = client.GetPostsAroundLastUnread(userId, channelId, 1, 2, false) + require.NoError(t, err) assertPostList(t, &model.PostList{ Order: []string{post13.Id, post12.Id, post11.Id}, @@ -1906,95 +1949,105 @@ func TestGetPost(t *testing.T) { defer th.TearDown() // TODO: migrate this entirely to the subtest's client // once the other methods are migrated too. - Client := th.Client + client := th.Client var privatePost *model.Post th.TestForAllClients(t, func(t *testing.T, c *model.Client4) { t.Helper() - post, resp := c.GetPost(th.BasicPost.Id, "") - CheckNoError(t, resp) + post, resp, err := c.GetPost(th.BasicPost.Id, "") + require.NoError(t, err) require.Equal(t, th.BasicPost.Id, post.Id, "post ids don't match") - post, resp = c.GetPost(th.BasicPost.Id, resp.Etag) + post, resp, _ = c.GetPost(th.BasicPost.Id, resp.Etag) CheckEtag(t, post, resp) - _, resp = c.GetPost("", "") + _, resp, err = c.GetPost("", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = c.GetPost("junk", "") + _, resp, err = c.GetPost("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = c.GetPost(model.NewId(), "") + _, resp, err = c.GetPost(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) // Channel is public, should be able to read post - _, resp = c.GetPost(th.BasicPost.Id, "") - CheckNoError(t, resp) + _, _, err = c.GetPost(th.BasicPost.Id, "") + require.NoError(t, err) - privatePost = th.CreatePostWithClient(Client, th.BasicPrivateChannel) + privatePost = th.CreatePostWithClient(client, th.BasicPrivateChannel) - _, resp = c.GetPost(privatePost.Id, "") - CheckNoError(t, resp) + _, _, err = c.GetPost(privatePost.Id, "") + require.NoError(t, err) }) - Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) + client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) // Channel is private, should not be able to read post - _, resp := Client.GetPost(privatePost.Id, "") + _, resp, err := client.GetPost(privatePost.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) // But local client should. - _, resp = th.LocalClient.GetPost(privatePost.Id, "") - CheckNoError(t, resp) + _, _, err = th.LocalClient.GetPost(privatePost.Id, "") + require.NoError(t, err) - Client.Logout() + client.Logout() // Normal client should get unauthorized, but local client should get 404. - _, resp = Client.GetPost(model.NewId(), "") + _, resp, err = client.GetPost(model.NewId(), "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.LocalClient.GetPost(model.NewId(), "") + _, resp, err = th.LocalClient.GetPost(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) } func TestDeletePost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - _, resp := Client.DeletePost("") + resp, err := client.DeletePost("") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.DeletePost("junk") + resp, err = client.DeletePost("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.DeletePost(th.BasicPost.Id) + resp, err = client.DeletePost(th.BasicPost.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Login(th.TeamAdminUser.Email, th.TeamAdminUser.Password) - _, resp = Client.DeletePost(th.BasicPost.Id) - CheckNoError(t, resp) + client.Login(th.TeamAdminUser.Email, th.TeamAdminUser.Password) + _, err = client.DeletePost(th.BasicPost.Id) + require.NoError(t, err) post := th.CreatePost() user := th.CreateUser() - Client.Logout() - Client.Login(user.Email, user.Password) + client.Logout() + client.Login(user.Email, user.Password) - _, resp = Client.DeletePost(post.Id) + resp, err = client.DeletePost(post.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.DeletePost(model.NewId()) + client.Logout() + resp, err = client.DeletePost(model.NewId()) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - status, resp := th.SystemAdminClient.DeletePost(post.Id) - require.True(t, status, "post should return status OK") - CheckNoError(t, resp) + _, err = th.SystemAdminClient.DeletePost(post.Id) + require.NoError(t, err) } func TestDeletePostMessage(t *testing.T) { @@ -2016,16 +2069,15 @@ func TestDeletePostMessage(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { wsClient, err := th.CreateWebSocketClientWithClient(tc.client) - require.Nil(t, err) + require.NoError(t, err) defer wsClient.Close() wsClient.Listen() post := th.CreatePost() - status, resp := th.SystemAdminClient.DeletePost(post.Id) - require.True(t, status, "post should return status OK") - CheckNoError(t, resp) + _, err = th.SystemAdminClient.DeletePost(post.Id) + require.NoError(t, err) timeout := time.After(5 * time.Second) @@ -2050,16 +2102,16 @@ func TestDeletePostMessage(t *testing.T) { func TestGetPostThread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client post := &model.Post{ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a", RootId: th.BasicPost.Id} - post, _ = Client.CreatePost(post) + post, _, _ = client.CreatePost(post) - list, resp := Client.GetPostThread(th.BasicPost.Id, "", false) - CheckNoError(t, resp) + list, resp, err := client.GetPostThread(th.BasicPost.Id, "", false) + require.NoError(t, err) var list2 *model.PostList - list2, resp = Client.GetPostThread(th.BasicPost.Id, resp.Etag, false) + list2, resp, _ = client.GetPostThread(th.BasicPost.Id, resp.Etag, false) CheckEtag(t, list2, resp) require.Equal(t, th.BasicPost.Id, list.Order[0], "wrong order") @@ -2069,35 +2121,39 @@ func TestGetPostThread(t *testing.T) { _, ok = list.Posts[post.Id] require.True(t, ok, "should have had post") - _, resp = Client.GetPostThread("junk", "", false) + _, resp, err = client.GetPostThread("junk", "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPostThread(model.NewId(), "", false) + _, resp, err = client.GetPostThread(model.NewId(), "", false) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) + client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) // Channel is public, should be able to read post - _, resp = Client.GetPostThread(th.BasicPost.Id, "", false) - CheckNoError(t, resp) + _, _, err = client.GetPostThread(th.BasicPost.Id, "", false) + require.NoError(t, err) - privatePost := th.CreatePostWithClient(Client, th.BasicPrivateChannel) + privatePost := th.CreatePostWithClient(client, th.BasicPrivateChannel) - _, resp = Client.GetPostThread(privatePost.Id, "", false) - CheckNoError(t, resp) + _, _, err = client.GetPostThread(privatePost.Id, "", false) + require.NoError(t, err) - Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) + client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) // Channel is private, should not be able to read post - _, resp = Client.GetPostThread(privatePost.Id, "", false) + _, resp, err = client.GetPostThread(privatePost.Id, "", false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetPostThread(model.NewId(), "", false) + client.Logout() + _, resp, err = client.GetPostThread(model.NewId(), "", false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetPostThread(th.BasicPost.Id, "", false) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetPostThread(th.BasicPost.Id, "", false) + require.NoError(t, err) } func TestSearchPosts(t *testing.T) { @@ -2114,7 +2170,7 @@ func TestSearchPosts(t *testing.T) { }) th.LoginBasic() - Client := th.Client + client := th.Client message := "search for post1" _ = th.CreateMessagePost(message) @@ -2140,8 +2196,8 @@ func TestSearchPosts(t *testing.T) { IsOrSearch: &isOrSearch, TimeZoneOffset: &timezoneOffset, } - posts, resp := Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + posts, _, err := client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, posts.Order, 3, "wrong search") terms = "search" @@ -2154,8 +2210,8 @@ func TestSearchPosts(t *testing.T) { Page: &page, PerPage: &perPage, } - posts2, resp := Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + posts2, _, err := client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) // We don't support paging for DB search yet, modify this when we do. require.Len(t, posts2.Order, 3, "Wrong number of posts") assert.Equal(t, posts.Order[0], posts2.Order[0]) @@ -2169,22 +2225,22 @@ func TestSearchPosts(t *testing.T) { Page: &page, PerPage: &perPage, } - posts2, resp = Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + posts2, _, err = client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) // We don't support paging for DB search yet, modify this when we do. require.Empty(t, posts2.Order, "Wrong number of posts") - posts, resp = Client.SearchPosts(th.BasicTeam.Id, "search", false) - CheckNoError(t, resp) + posts, _, err = client.SearchPosts(th.BasicTeam.Id, "search", false) + require.NoError(t, err) require.Len(t, posts.Order, 3, "wrong search") - posts, resp = Client.SearchPosts(th.BasicTeam.Id, "post2", false) - CheckNoError(t, resp) + posts, _, err = client.SearchPosts(th.BasicTeam.Id, "post2", false) + require.NoError(t, err) require.Len(t, posts.Order, 1, "wrong number of posts") require.Equal(t, post2.Id, posts.Order[0], "wrong search") - posts, resp = Client.SearchPosts(th.BasicTeam.Id, "#hashtag", false) - CheckNoError(t, resp) + posts, _, err = client.SearchPosts(th.BasicTeam.Id, "#hashtag", false) + require.NoError(t, err) require.Len(t, posts.Order, 1, "wrong number of posts") require.Equal(t, post3.Id, posts.Order[0], "wrong search") @@ -2196,36 +2252,40 @@ func TestSearchPosts(t *testing.T) { TimeZoneOffset: &timezoneOffset, IncludeDeletedChannels: &includeDeletedChannels, } - posts, resp = Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + posts, _, err = client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, posts.Order, 2, "wrong search") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.ExperimentalViewArchivedChannels = false }) - posts, resp = Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) - CheckNoError(t, resp) + posts, _, err = client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + require.NoError(t, err) require.Len(t, posts.Order, 1, "wrong search") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "*", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "*", false) require.Empty(t, posts.Order, "searching for just * shouldn't return any results") - posts, resp = Client.SearchPosts(th.BasicTeam.Id, "post1 post2", true) - CheckNoError(t, resp) + posts, _, err = client.SearchPosts(th.BasicTeam.Id, "post1 post2", true) + require.NoError(t, err) require.Len(t, posts.Order, 2, "wrong search results") - _, resp = Client.SearchPosts("junk", "#sgtitlereview", false) + _, resp, err := client.SearchPosts("junk", "#sgtitlereview", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.SearchPosts(model.NewId(), "#sgtitlereview", false) + _, resp, err = client.SearchPosts(model.NewId(), "#sgtitlereview", false) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.SearchPosts(th.BasicTeam.Id, "", false) + _, resp, err = client.SearchPosts(th.BasicTeam.Id, "", false) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() - _, resp = Client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + client.Logout() + _, resp, err = client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2233,7 +2293,7 @@ func TestSearchHashtagPosts(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() th.LoginBasic() - Client := th.Client + client := th.Client message := "#sgtitlereview with space" assert.NotNil(t, th.CreateMessagePost(message)) @@ -2244,12 +2304,13 @@ func TestSearchHashtagPosts(t *testing.T) { message = "no hashtag" assert.NotNil(t, th.CreateMessagePost(message)) - posts, resp := Client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) - CheckNoError(t, resp) + posts, _, err := client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + require.NoError(t, err) require.Len(t, posts.Order, 2, "wrong search results") - Client.Logout() - _, resp = Client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + client.Logout() + _, resp, err := client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2257,7 +2318,7 @@ func TestSearchPostsInChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() th.LoginBasic() - Client := th.Client + client := th.Client channel := th.CreatePublicChannel() @@ -2265,52 +2326,52 @@ func TestSearchPostsInChannel(t *testing.T) { _ = th.CreateMessagePost(message) message = "sgtitlereview\n with return" - _ = th.CreateMessagePostWithClient(Client, th.BasicChannel2, message) + _ = th.CreateMessagePostWithClient(client, th.BasicChannel2, message) message = "other message with no return" - _ = th.CreateMessagePostWithClient(Client, th.BasicChannel2, message) + _ = th.CreateMessagePostWithClient(client, th.BasicChannel2, message) message = "other message with no return" - _ = th.CreateMessagePostWithClient(Client, channel, message) + _ = th.CreateMessagePostWithClient(client, channel, message) - posts, _ := Client.SearchPosts(th.BasicTeam.Id, "channel:", false) + posts, _, _ := client.SearchPosts(th.BasicTeam.Id, "channel:", false) require.Empty(t, posts.Order, "wrong number of posts for search 'channel:'") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "in:", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "in:", false) require.Empty(t, posts.Order, "wrong number of posts for search 'in:'") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "channel:"+th.BasicChannel.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "channel:"+th.BasicChannel.Name, false) require.Lenf(t, posts.Order, 2, "wrong number of posts returned for search 'channel:%v'", th.BasicChannel.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "in:"+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "in:"+th.BasicChannel2.Name, false) require.Lenf(t, posts.Order, 2, "wrong number of posts returned for search 'in:%v'", th.BasicChannel2.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "channel:"+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "channel:"+th.BasicChannel2.Name, false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'channel:%v'", th.BasicChannel2.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "ChAnNeL:"+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "ChAnNeL:"+th.BasicChannel2.Name, false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'ChAnNeL:%v'", th.BasicChannel2.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "sgtitlereview", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "sgtitlereview", false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'sgtitlereview'") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "sgtitlereview channel:"+th.BasicChannel.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "sgtitlereview channel:"+th.BasicChannel.Name, false) require.Lenf(t, posts.Order, 1, "wrong number of posts for search 'sgtitlereview channel:%v'", th.BasicChannel.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "sgtitlereview in: "+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "sgtitlereview in: "+th.BasicChannel2.Name, false) require.Lenf(t, posts.Order, 1, "wrong number of posts for search 'sgtitlereview in: %v'", th.BasicChannel2.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "sgtitlereview channel: "+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "sgtitlereview channel: "+th.BasicChannel2.Name, false) require.Lenf(t, posts.Order, 1, "wrong number of posts for search 'sgtitlereview channel: %v'", th.BasicChannel2.Name) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "channel: "+th.BasicChannel2.Name+" channel: "+channel.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "channel: "+th.BasicChannel2.Name+" channel: "+channel.Name, false) require.Lenf(t, posts.Order, 3, "wrong number of posts for 'channel: %v channel: %v'", th.BasicChannel2.Name, channel.Name) } func TestSearchPostsFromUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.LoginTeamAdmin() user := th.CreateUser() @@ -2321,45 +2382,45 @@ func TestSearchPostsFromUser(t *testing.T) { message := "sgtitlereview with space" _ = th.CreateMessagePost(message) - Client.Logout() + client.Logout() th.LoginBasic2() message = "sgtitlereview\n with return" - _ = th.CreateMessagePostWithClient(Client, th.BasicChannel2, message) + _ = th.CreateMessagePostWithClient(client, th.BasicChannel2, message) - posts, _ := Client.SearchPosts(th.BasicTeam.Id, "from: "+th.TeamAdminUser.Username, false) + posts, _, _ := client.SearchPosts(th.BasicTeam.Id, "from: "+th.TeamAdminUser.Username, false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'from: %v'", th.TeamAdminUser.Username) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username, false) require.Lenf(t, posts.Order, 1, "wrong number of posts for search 'from: %v", th.BasicUser2.Username) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" sgtitlereview", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" sgtitlereview", false) require.Lenf(t, posts.Order, 1, "wrong number of posts for search 'from: %v'", th.BasicUser2.Username) message = "hullo" _ = th.CreateMessagePost(message) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" in:"+th.BasicChannel.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" in:"+th.BasicChannel.Name, false) require.Len(t, posts.Order, 1, "wrong number of posts for search 'from: %v in:", th.BasicUser2.Username, th.BasicChannel.Name) - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) // wait for the join/leave messages to be created for user3 since they're done asynchronously time.Sleep(100 * time.Millisecond) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username, false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'from: %v'", th.BasicUser2.Username) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username, false) require.Lenf(t, posts.Order, 2, "wrong number of posts for search 'from: %v from: %v'", th.BasicUser2.Username, user.Username) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username+" in:"+th.BasicChannel2.Name, false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username+" in:"+th.BasicChannel2.Name, false) require.Len(t, posts.Order, 1, "wrong number of posts") message = "coconut" - _ = th.CreateMessagePostWithClient(Client, th.BasicChannel2, message) + _ = th.CreateMessagePostWithClient(client, th.BasicChannel2, message) - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username+" in:"+th.BasicChannel2.Name+" coconut", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "from: "+th.BasicUser2.Username+" from: "+user.Username+" in:"+th.BasicChannel2.Name+" coconut", false) require.Len(t, posts.Order, 1, "wrong number of posts") } @@ -2367,7 +2428,7 @@ func TestSearchPostsWithDateFlags(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() th.LoginBasic() - Client := th.Client + client := th.Client message := "sgtitlereview\n with return" createDate := time.Date(2018, 8, 1, 5, 0, 0, 0, time.UTC) @@ -2381,22 +2442,22 @@ func TestSearchPostsWithDateFlags(t *testing.T) { createDate = time.Date(2018, 8, 3, 5, 0, 0, 0, time.UTC) _ = th.CreateMessagePostNoClient(th.BasicChannel, message, utils.MillisFromTime(createDate)) - posts, _ := Client.SearchPosts(th.BasicTeam.Id, "return", false) + posts, _, _ := client.SearchPosts(th.BasicTeam.Id, "return", false) require.Len(t, posts.Order, 3, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "on:", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "on:", false) require.Empty(t, posts.Order, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "after:", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "after:", false) require.Empty(t, posts.Order, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "before:", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "before:", false) require.Empty(t, posts.Order, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "on:2018-08-01", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "on:2018-08-01", false) require.Len(t, posts.Order, 1, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "after:2018-08-01", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "after:2018-08-01", false) resultCount := 0 for _, post := range posts.Posts { if post.UserId == th.BasicUser.Id { @@ -2405,34 +2466,34 @@ func TestSearchPostsWithDateFlags(t *testing.T) { } require.Equal(t, 2, resultCount, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "before:2018-08-02", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "before:2018-08-02", false) require.Len(t, posts.Order, 1, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "before:2018-08-03 after:2018-08-02", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "before:2018-08-03 after:2018-08-02", false) require.Empty(t, posts.Order, "wrong number of posts") - posts, _ = Client.SearchPosts(th.BasicTeam.Id, "before:2018-08-03 after:2018-08-01", false) + posts, _, _ = client.SearchPosts(th.BasicTeam.Id, "before:2018-08-03 after:2018-08-01", false) require.Len(t, posts.Order, 1, "wrong number of posts") } func TestGetFileInfosForPost(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client fileIds := make([]string, 3) data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) for i := 0; i < 3; i++ { - fileResp, _ := Client.UploadFile(data, th.BasicChannel.Id, "test.png") + fileResp, _, _ := client.UploadFile(data, th.BasicChannel.Id, "test.png") fileIds[i] = fileResp.FileInfos[0].Id } post := &model.Post{ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a", FileIds: fileIds} - post, _ = Client.CreatePost(post) + post, _, _ = client.CreatePost(post) - infos, resp := Client.GetFileInfosForPost(post.Id, "") - CheckNoError(t, resp) + infos, resp, err := client.GetFileInfosForPost(post.Id, "") + require.NoError(t, err) require.Len(t, infos, 3, "missing file infos") @@ -2445,26 +2506,29 @@ func TestGetFileInfosForPost(t *testing.T) { require.True(t, found, "missing file info") - infos, resp = Client.GetFileInfosForPost(post.Id, resp.Etag) + infos, resp, _ = client.GetFileInfosForPost(post.Id, resp.Etag) CheckEtag(t, infos, resp) - infos, resp = Client.GetFileInfosForPost(th.BasicPost.Id, "") - CheckNoError(t, resp) + infos, _, err = client.GetFileInfosForPost(th.BasicPost.Id, "") + require.NoError(t, err) require.Empty(t, infos, "should have no file infos") - _, resp = Client.GetFileInfosForPost("junk", "") + _, resp, err = client.GetFileInfosForPost("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetFileInfosForPost(model.NewId(), "") + _, resp, err = client.GetFileInfosForPost(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetFileInfosForPost(model.NewId(), "") + client.Logout() + _, resp, err = client.GetFileInfosForPost(model.NewId(), "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetFileInfosForPost(th.BasicPost.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetFileInfosForPost(th.BasicPost.Id, "") + require.NoError(t, err) } func TestSetChannelUnread(t *testing.T) { @@ -2491,38 +2555,39 @@ func TestSetChannelUnread(t *testing.T) { unread, err := th.App.GetChannelUnread(c1.Id, u1.Id) require.Nil(t, err) require.Equal(t, int64(4), unread.MsgCount) - unread, err = th.App.GetChannelUnread(c1.Id, u2.Id) - require.Nil(t, err) + unread, appErr := th.App.GetChannelUnread(c1.Id, u2.Id) + require.Nil(t, appErr) require.Equal(t, int64(4), unread.MsgCount) - _, err = th.App.ViewChannel(c1toc2, u2.Id, s2.Id, false) - require.Nil(t, err) - unread, err = th.App.GetChannelUnread(c1.Id, u2.Id) - require.Nil(t, err) + _, appErr = th.App.ViewChannel(c1toc2, u2.Id, s2.Id, false) + require.Nil(t, appErr) + unread, appErr = th.App.GetChannelUnread(c1.Id, u2.Id) + require.Nil(t, appErr) require.Equal(t, int64(0), unread.MsgCount) t.Run("Unread last one", func(t *testing.T) { - r := th.Client.SetPostUnread(u1.Id, p2.Id, true) - checkHTTPStatus(t, r, 200, false) - unread, err := th.App.GetChannelUnread(c1.Id, u1.Id) - require.Nil(t, err) + r, err := th.Client.SetPostUnread(u1.Id, p2.Id, true) + require.NoError(t, err) + CheckOKStatus(t, r) + unread, appErr := th.App.GetChannelUnread(c1.Id, u1.Id) + require.Nil(t, appErr) assert.Equal(t, int64(2), unread.MsgCount) }) t.Run("Unread on a private channel", func(t *testing.T) { - r := th.Client.SetPostUnread(u1.Id, pp2.Id, true) + r, _ := th.Client.SetPostUnread(u1.Id, pp2.Id, true) assert.Equal(t, 200, r.StatusCode) - unread, err := th.App.GetChannelUnread(th.BasicPrivateChannel.Id, u1.Id) - require.Nil(t, err) + unread, appErr := th.App.GetChannelUnread(th.BasicPrivateChannel.Id, u1.Id) + require.Nil(t, appErr) assert.Equal(t, int64(1), unread.MsgCount) - r = th.Client.SetPostUnread(u1.Id, pp1.Id, true) + r, _ = th.Client.SetPostUnread(u1.Id, pp1.Id, true) assert.Equal(t, 200, r.StatusCode) - unread, err = th.App.GetChannelUnread(th.BasicPrivateChannel.Id, u1.Id) - require.Nil(t, err) + unread, appErr = th.App.GetChannelUnread(th.BasicPrivateChannel.Id, u1.Id) + require.Nil(t, appErr) assert.Equal(t, int64(2), unread.MsgCount) }) t.Run("Can't unread an imaginary post", func(t *testing.T) { - r := th.Client.SetPostUnread(u1.Id, "invalid4ofngungryquinj976y", true) + r, _ := th.Client.SetPostUnread(u1.Id, "invalid4ofngungryquinj976y", true) assert.Equal(t, http.StatusForbidden, r.StatusCode) }) @@ -2532,19 +2597,20 @@ func TestSetChannelUnread(t *testing.T) { c3.Login(u3.Email, u3.Password) t.Run("Can't unread channels you don't belong to", func(t *testing.T) { - r := c3.SetPostUnread(u3.Id, pp1.Id, true) + r, _ := c3.SetPostUnread(u3.Id, pp1.Id, true) assert.Equal(t, http.StatusForbidden, r.StatusCode) }) t.Run("Can't unread users you don't have permission to edit", func(t *testing.T) { - r := c3.SetPostUnread(u1.Id, pp1.Id, true) + r, _ := c3.SetPostUnread(u1.Id, pp1.Id, true) assert.Equal(t, http.StatusForbidden, r.StatusCode) }) t.Run("Can't unread if user is not logged in", func(t *testing.T) { th.Client.Logout() - response := th.Client.SetPostUnread(u1.Id, p2.Id, true) - checkHTTPStatus(t, response, http.StatusUnauthorized, true) + response, err := th.Client.SetPostUnread(u1.Id, p2.Id, true) + require.Error(t, err) + CheckUnauthorizedStatus(t, response) }) } @@ -2582,8 +2648,8 @@ func TestSetPostUnreadWithoutCollapsedThreads(t *testing.T) { require.Nil(t, appErr) t.Run("Mark reply post as unread", func(t *testing.T) { - resp := th.Client.SetPostUnread(th.BasicUser.Id, replyPost1.Id, false) - CheckNoError(t, resp) + _, err := th.Client.SetPostUnread(th.BasicUser.Id, replyPost1.Id, false) + require.NoError(t, err) channelUnread, appErr := th.App.GetChannelUnread(th.BasicChannel.Id, th.BasicUser.Id) require.Nil(t, appErr) @@ -2595,17 +2661,17 @@ func TestSetPostUnreadWithoutCollapsedThreads(t *testing.T) { // MentionCountRoot should be zero so that supported clients don't show the channel as unread require.Equal(t, channelUnread.MsgCountRoot, int64(0)) - threadMembership, err := th.App.GetThreadMembershipForUser(th.BasicUser.Id, rootPost1.Id) - require.Nil(t, err) - thread, err := th.App.GetThreadForUser(th.BasicTeam.Id, threadMembership, false) - require.Nil(t, err) + threadMembership, appErr := th.App.GetThreadMembershipForUser(th.BasicUser.Id, rootPost1.Id) + require.Nil(t, appErr) + thread, appErr := th.App.GetThreadForUser(th.BasicTeam.Id, threadMembership, false) + require.Nil(t, appErr) require.Equal(t, int64(2), thread.UnreadMentions) require.Equal(t, int64(3), thread.UnreadReplies) }) t.Run("Mark root post as unread", func(t *testing.T) { - resp := th.Client.SetPostUnread(th.BasicUser.Id, rootPost1.Id, false) - CheckNoError(t, resp) + _, err := th.Client.SetPostUnread(th.BasicUser.Id, rootPost1.Id, false) + require.NoError(t, err) channelUnread, appErr := th.App.GetChannelUnread(th.BasicChannel.Id, th.BasicUser.Id) require.Nil(t, appErr) diff --git a/api4/preference_test.go b/api4/preference_test.go index 5f91b54c3f..c0c2e57da8 100644 --- a/api4/preference_test.go +++ b/api4/preference_test.go @@ -17,7 +17,7 @@ import ( func TestGetPreferences(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client // recreate basic user (cached has no default preferences) th.BasicUser = th.CreateUser() @@ -44,10 +44,10 @@ func TestGetPreferences(t *testing.T) { }, } - Client.UpdatePreferences(user1.Id, &preferences1) + client.UpdatePreferences(user1.Id, &preferences1) - prefs, resp := Client.GetPreferences(user1.Id) - CheckNoError(t, resp) + prefs, _, err := client.GetPreferences(user1.Id) + require.NoError(t, err) // 5 because we have 2 initial preferences tutorial_step and recommended_next_steps added when creating a new user require.Equal(t, len(prefs), 5, "received the wrong number of preferences") @@ -60,23 +60,25 @@ func TestGetPreferences(t *testing.T) { th.BasicUser2 = th.CreateUser() th.LoginBasic2() - prefs, resp = Client.GetPreferences(th.BasicUser2.Id) - CheckNoError(t, resp) + prefs, _, err = client.GetPreferences(th.BasicUser2.Id) + require.NoError(t, err) require.Greater(t, len(prefs), 0, "received the wrong number of preferences") - _, resp = Client.GetPreferences(th.BasicUser.Id) + _, resp, err := client.GetPreferences(th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetPreferences(th.BasicUser2.Id) + client.Logout() + _, resp, err = client.GetPreferences(th.BasicUser2.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestGetPreferencesByCategory(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.LoginBasic() user1 := th.BasicUser @@ -100,38 +102,43 @@ func TestGetPreferencesByCategory(t *testing.T) { }, } - Client.UpdatePreferences(user1.Id, &preferences1) + client.UpdatePreferences(user1.Id, &preferences1) - prefs, resp := Client.GetPreferencesByCategory(user1.Id, category) - CheckNoError(t, resp) + prefs, _, err := client.GetPreferencesByCategory(user1.Id, category) + require.NoError(t, err) require.Equal(t, len(prefs), 2, "received the wrong number of preferences") - _, resp = Client.GetPreferencesByCategory(user1.Id, "junk") + _, resp, err := client.GetPreferencesByCategory(user1.Id, "junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) th.LoginBasic2() - _, resp = Client.GetPreferencesByCategory(th.BasicUser2.Id, category) + _, resp, err = client.GetPreferencesByCategory(th.BasicUser2.Id, category) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetPreferencesByCategory(user1.Id, category) + _, resp, err = client.GetPreferencesByCategory(user1.Id, category) + require.Error(t, err) CheckForbiddenStatus(t, resp) - prefs, resp = Client.GetPreferencesByCategory(th.BasicUser2.Id, "junk") + prefs, resp, err = client.GetPreferencesByCategory(th.BasicUser2.Id, "junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) require.Equal(t, len(prefs), 0, "received the wrong number of preferences") - Client.Logout() - _, resp = Client.GetPreferencesByCategory(th.BasicUser2.Id, category) + client.Logout() + _, resp, err = client.GetPreferencesByCategory(th.BasicUser2.Id, category) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestGetPreferenceByCategoryAndName(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.LoginBasic() user := th.BasicUser @@ -153,32 +160,36 @@ func TestGetPreferenceByCategoryAndName(t *testing.T) { }, } - Client.UpdatePreferences(user.Id, &preferences) + client.UpdatePreferences(user.Id, &preferences) - pref, resp := Client.GetPreferenceByCategoryAndName(user.Id, model.PreferenceCategoryDirectChannelShow, name) - CheckNoError(t, resp) + pref, _, err := client.GetPreferenceByCategoryAndName(user.Id, model.PreferenceCategoryDirectChannelShow, name) + require.NoError(t, err) require.Equal(t, preferences[0].UserId, pref.UserId, "UserId preference not saved") require.Equal(t, preferences[0].Category, pref.Category, "Category preference not saved") require.Equal(t, preferences[0].Name, pref.Name, "Name preference not saved") preferences[0].Value = model.NewId() - Client.UpdatePreferences(user.Id, &preferences) + client.UpdatePreferences(user.Id, &preferences) - _, resp = Client.GetPreferenceByCategoryAndName(user.Id, "junk", preferences[0].Name) + _, resp, err := client.GetPreferenceByCategoryAndName(user.Id, "junk", preferences[0].Name) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, "junk") + _, resp, err = client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetPreferenceByCategoryAndName(th.BasicUser2.Id, preferences[0].Category, "junk") + _, resp, err = client.GetPreferenceByCategoryAndName(th.BasicUser2.Id, preferences[0].Category, "junk") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, preferences[0].Name) - CheckNoError(t, resp) + _, _, err = client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, preferences[0].Name) + require.NoError(t, err) - Client.Logout() - _, resp = Client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, preferences[0].Name) + client.Logout() + _, resp, err = client.GetPreferenceByCategoryAndName(user.Id, preferences[0].Category, preferences[0].Name) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -186,7 +197,7 @@ func TestGetPreferenceByCategoryAndName(t *testing.T) { func TestUpdatePreferences(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.LoginBasic() user1 := th.BasicUser @@ -210,8 +221,8 @@ func TestUpdatePreferences(t *testing.T) { }, } - _, resp := Client.UpdatePreferences(user1.Id, &preferences1) - CheckNoError(t, resp) + _, err := client.UpdatePreferences(user1.Id, &preferences1) + require.NoError(t, err) preferences := model.Preferences{ { @@ -221,7 +232,8 @@ func TestUpdatePreferences(t *testing.T) { }, } - _, resp = Client.UpdatePreferences(user1.Id, &preferences) + resp, err := client.UpdatePreferences(user1.Id, &preferences) + require.Error(t, err) CheckForbiddenStatus(t, resp) preferences = model.Preferences{ @@ -231,14 +243,17 @@ func TestUpdatePreferences(t *testing.T) { }, } - _, resp = Client.UpdatePreferences(user1.Id, &preferences) + resp, err = client.UpdatePreferences(user1.Id, &preferences) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.UpdatePreferences(th.BasicUser2.Id, &preferences) + resp, err = client.UpdatePreferences(th.BasicUser2.Id, &preferences) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.UpdatePreferences(user1.Id, &preferences1) + client.Logout() + resp, err = client.UpdatePreferences(user1.Id, &preferences1) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -247,7 +262,7 @@ func TestUpdatePreferencesWebsocket(t *testing.T) { defer th.TearDown() WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) WebSocketClient.Listen() time.Sleep(300 * time.Millisecond) @@ -268,8 +283,8 @@ func TestUpdatePreferencesWebsocket(t *testing.T) { }, } - _, resp := th.Client.UpdatePreferences(userId, preferences) - CheckNoError(t, resp) + _, err = th.Client.UpdatePreferences(userId, preferences) + require.NoError(t, err) timeout := time.After(300 * time.Millisecond) @@ -308,22 +323,22 @@ func TestUpdateSidebarPreferences(t *testing.T) { team1 := th.CreateTeam() th.LinkUserToTeam(user, team1) - _, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + _, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) channel := th.CreateChannelWithClientAndTeam(th.Client, model.ChannelTypeOpen, team1.Id) th.AddUserToChannel(user, channel) // Confirm that the sidebar is populated correctly to begin with - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) // Favorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -331,18 +346,18 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel was added to the Favorites - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.NotContains(t, categories.Categories[1].Channels, channel.Id) // And unfavorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -350,11 +365,11 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "false", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should've been removed from the Favorites - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) @@ -376,7 +391,7 @@ func TestUpdateSidebarPreferences(t *testing.T) { dmChannel := th.CreateDmChannel(user2) // Favorite the channel - _, resp := th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err := th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -384,25 +399,25 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel was added to the Favorites on all teams - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.NotContains(t, categories.Categories[2].Channels, dmChannel.Id) - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.NotContains(t, categories.Categories[2].Channels, dmChannel.Id) // And unfavorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -410,18 +425,18 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "false", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should've been removed from the Favorites on all teams - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.Contains(t, categories.Categories[2].Channels, dmChannel.Id) - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) @@ -442,32 +457,32 @@ func TestUpdateSidebarPreferences(t *testing.T) { th.LinkUserToTeam(user, team1) th.LinkUserToTeam(user2, team1) - _, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) - _, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + _, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) + _, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) channel := th.CreateChannelWithClientAndTeam(th.Client, model.ChannelTypeOpen, team1.Id) th.AddUserToChannel(user, channel) th.AddUserToChannel(user2, channel) // Confirm that the sidebar is populated correctly to begin with - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) // Favorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -475,18 +490,18 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel was not added to Favorites for the second user - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.Contains(t, categories.Categories[1].Channels, channel.Id) // Favorite the channel for the second user - _, resp = client2.UpdatePreferences(user2.Id, &model.Preferences{ + _, err = client2.UpdatePreferences(user2.Id, &model.Preferences{ { UserId: user2.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -494,18 +509,18 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel is now in the Favorites for the second user - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.NotContains(t, categories.Categories[1].Channels, channel.Id) // And unfavorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -513,11 +528,11 @@ func TestUpdateSidebarPreferences(t *testing.T) { Value: "false", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should still be in the second user's favorites - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) @@ -528,11 +543,11 @@ func TestUpdateSidebarPreferences(t *testing.T) { func TestDeletePreferences(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.LoginBasic() - prefs, _ := Client.GetPreferences(th.BasicUser.Id) + prefs, _, _ := client.GetPreferences(th.BasicUser.Id) originalCount := len(prefs) // save 10 preferences @@ -546,27 +561,30 @@ func TestDeletePreferences(t *testing.T) { preferences = append(preferences, preference) } - Client.UpdatePreferences(th.BasicUser.Id, &preferences) + client.UpdatePreferences(th.BasicUser.Id, &preferences) // delete 10 preferences th.LoginBasic2() - _, resp := Client.DeletePreferences(th.BasicUser2.Id, &preferences) + resp, err := client.DeletePreferences(th.BasicUser2.Id, &preferences) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() - _, resp = Client.DeletePreferences(th.BasicUser.Id, &preferences) - CheckNoError(t, resp) + _, err = client.DeletePreferences(th.BasicUser.Id, &preferences) + require.NoError(t, err) - _, resp = Client.DeletePreferences(th.BasicUser2.Id, &preferences) + resp, err = client.DeletePreferences(th.BasicUser2.Id, &preferences) + require.Error(t, err) CheckForbiddenStatus(t, resp) - prefs, _ = Client.GetPreferences(th.BasicUser.Id) + prefs, _, _ = client.GetPreferences(th.BasicUser.Id) require.Len(t, prefs, originalCount, "should've deleted preferences") - Client.Logout() - _, resp = Client.DeletePreferences(th.BasicUser.Id, &preferences) + client.Logout() + resp, err = client.DeletePreferences(th.BasicUser.Id, &preferences) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -587,18 +605,18 @@ func TestDeletePreferencesWebsocket(t *testing.T) { Name: model.NewId(), }, } - _, resp := th.Client.UpdatePreferences(userId, preferences) - CheckNoError(t, resp) + _, err := th.Client.UpdatePreferences(userId, preferences) + require.NoError(t, err) WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) WebSocketClient.Listen() wsResp := <-WebSocketClient.ResponseChannel require.Equal(t, model.StatusOk, wsResp.Status, "should have responded OK to authentication challenge") - _, resp = th.Client.DeletePreferences(userId, preferences) - CheckNoError(t, resp) + _, err = th.Client.DeletePreferences(userId, preferences) + require.NoError(t, err) timeout := time.After(30000 * time.Millisecond) @@ -637,22 +655,22 @@ func TestDeleteSidebarPreferences(t *testing.T) { team1 := th.CreateTeam() th.LinkUserToTeam(user, team1) - _, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + _, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) channel := th.CreateChannelWithClientAndTeam(th.Client, model.ChannelTypeOpen, team1.Id) th.AddUserToChannel(user, channel) // Confirm that the sidebar is populated correctly to begin with - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) // Favorite the channel - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -660,29 +678,28 @@ func TestDeleteSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) - + require.NoError(t, err) // Confirm that the channel was added to the Favorites - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.NotContains(t, categories.Categories[1].Channels, channel.Id) // And unfavorite the channel by deleting the preference - _, resp = th.Client.DeletePreferences(user.Id, &model.Preferences{ + _, err = th.Client.DeletePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, Name: channel.Id, }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should've been removed from the Favorites - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) @@ -704,7 +721,7 @@ func TestDeleteSidebarPreferences(t *testing.T) { dmChannel := th.CreateDmChannel(user2) // Favorite the channel - _, resp := th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err := th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -712,43 +729,43 @@ func TestDeleteSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel was added to the Favorites on all teams - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.NotContains(t, categories.Categories[2].Channels, dmChannel.Id) - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.NotContains(t, categories.Categories[2].Channels, dmChannel.Id) // And unfavorite the channel by deleting the preference - _, resp = th.Client.DeletePreferences(user.Id, &model.Preferences{ + _, err = th.Client.DeletePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, Name: dmChannel.Id, }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should've been removed from the Favorites on all teams - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.Contains(t, categories.Categories[2].Channels, dmChannel.Id) - categories, resp = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") - require.Nil(t, resp.Error) + categories, _, err = th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team2.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, dmChannel.Id) require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) @@ -769,32 +786,32 @@ func TestDeleteSidebarPreferences(t *testing.T) { th.LinkUserToTeam(user, team1) th.LinkUserToTeam(user2, team1) - _, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) - _, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + _, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) + _, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) channel := th.CreateChannelWithClientAndTeam(th.Client, model.ChannelTypeOpen, team1.Id) th.AddUserToChannel(user, channel) th.AddUserToChannel(user2, channel) // Confirm that the sidebar is populated correctly to begin with - categories, resp := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err := th.Client.GetSidebarCategoriesForTeamForUser(user.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) require.NotContains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) require.Contains(t, categories.Categories[1].Channels, channel.Id) // Favorite the channel for both users - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -802,9 +819,9 @@ func TestDeleteSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) - _, resp = client2.UpdatePreferences(user2.Id, &model.Preferences{ + _, err = client2.UpdatePreferences(user2.Id, &model.Preferences{ { UserId: user2.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -812,18 +829,18 @@ func TestDeleteSidebarPreferences(t *testing.T) { Value: "true", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // Confirm that the channel is in the Favorites for the second user - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.NotContains(t, categories.Categories[1].Channels, channel.Id) // And unfavorite the channel for the first user by deleting the preference - _, resp = th.Client.UpdatePreferences(user.Id, &model.Preferences{ + _, err = th.Client.UpdatePreferences(user.Id, &model.Preferences{ { UserId: user.Id, Category: model.PreferenceCategoryFavoriteChannel, @@ -831,11 +848,11 @@ func TestDeleteSidebarPreferences(t *testing.T) { Value: "false", }, }) - require.Nil(t, resp.Error) + require.NoError(t, err) // The channel should still be in the second user's favorites - categories, resp = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") - require.Nil(t, resp.Error) + categories, _, err = client2.GetSidebarCategoriesForTeamForUser(user2.Id, team1.Id, "") + require.NoError(t, err) require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Contains(t, categories.Categories[0].Channels, channel.Id) require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) diff --git a/api4/reaction_test.go b/api4/reaction_test.go index c74a20d81d..b4c4c1ef55 100644 --- a/api4/reaction_test.go +++ b/api4/reaction_test.go @@ -16,7 +16,7 @@ import ( func TestSaveReaction(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client userId := th.BasicUser.Id postId := th.BasicPost.Id @@ -33,61 +33,63 @@ func TestSaveReaction(t *testing.T) { } t.Run("successful-reaction", func(t *testing.T) { - rr, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) + rr, _, err := client.SaveReaction(reaction) + require.NoError(t, err) require.Equal(t, reaction.UserId, rr.UserId, "UserId did not match") require.Equal(t, reaction.PostId, rr.PostId, "PostId did not match") require.Equal(t, reaction.EmojiName, rr.EmojiName, "EmojiName did not match") require.NotEqual(t, 0, rr.CreateAt, "CreateAt should exist") - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "didn't save reaction correctly") }) t.Run("duplicated-reaction", func(t *testing.T) { - _, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + _, _, err := client.SaveReaction(reaction) + require.NoError(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have not save duplicated reaction") }) t.Run("save-second-reaction", func(t *testing.T) { reaction.EmojiName = "sad" - rr, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) + rr, _, err := client.SaveReaction(reaction) + require.NoError(t, err) require.Equal(t, rr.EmojiName, reaction.EmojiName, "EmojiName did not match") - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err, "error saving multiple reactions") + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr, "error saving multiple reactions") require.Equal(t, len(reactions), 2, "should have save multiple reactions") }) t.Run("saving-special-case", func(t *testing.T) { reaction.EmojiName = "+1" - rr, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) + rr, _, err := client.SaveReaction(reaction) + require.NoError(t, err) require.Equal(t, reaction.EmojiName, rr.EmojiName, "EmojiName did not match") - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 3, len(reactions), "should have save multiple reactions") }) t.Run("react-to-not-existing-post-id", func(t *testing.T) { reaction.PostId = GenerateTestId() - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("react-to-not-valid-post-id", func(t *testing.T) { reaction.PostId = "junk" - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -95,14 +97,16 @@ func TestSaveReaction(t *testing.T) { reaction.PostId = postId reaction.UserId = GenerateTestId() - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("react-as-not-valid-user-id", func(t *testing.T) { reaction.UserId = "junk" - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -110,35 +114,40 @@ func TestSaveReaction(t *testing.T) { reaction.UserId = userId reaction.EmojiName = "" - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("react-as-not-valid-emoji-name", func(t *testing.T) { reaction.EmojiName = strings.Repeat("a", 65) - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("react-as-other-user", func(t *testing.T) { reaction.EmojiName = "smile" otherUser := th.CreateUser() - Client.Logout() - Client.Login(otherUser.Email, otherUser.Password) + client.Logout() + client.Login(otherUser.Email, otherUser.Password) - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("react-being-not-logged-in", func(t *testing.T) { - Client.Logout() - _, resp := Client.SaveReaction(reaction) + client.Logout() + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("react-as-other-user-being-system-admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.SaveReaction(reaction) + _, resp, err := th.SystemAdminClient.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -146,11 +155,12 @@ func TestSaveReaction(t *testing.T) { th.LoginBasic() th.RemovePermissionFromRole(model.PermissionAddReaction.Id, model.ChannelUserRoleId) - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 3, len(reactions), "should have not created a reactions") th.AddPermissionToRole(model.PermissionAddReaction.Id, model.ChannelUserRoleId) }) @@ -158,8 +168,8 @@ func TestSaveReaction(t *testing.T) { t.Run("unable-to-react-in-read-only-town-square", func(t *testing.T) { th.LoginBasic() - channel, err := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) - assert.Nil(t, err) + channel, appErr := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) + assert.Nil(t, appErr) post := th.CreatePostWithClient(th.Client, channel) th.App.Srv().SetLicense(model.NewTestLicense()) @@ -171,11 +181,12 @@ func TestSaveReaction(t *testing.T) { EmojiName: "smile", } - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err := th.App.GetReactionsForPost(post.Id) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(post.Id) + require.Nil(t, appErr) require.Equal(t, 0, len(reactions), "should have not created a reaction") th.App.Srv().RemoveLicense() @@ -194,14 +205,15 @@ func TestSaveReaction(t *testing.T) { EmojiName: "smile", } - err := th.App.DeleteChannel(th.Context, channel, userId) - assert.Nil(t, err) + appErr := th.App.DeleteChannel(th.Context, channel, userId) + assert.Nil(t, appErr) - _, resp := Client.SaveReaction(reaction) + _, resp, err := client.SaveReaction(reaction) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err := th.App.GetReactionsForPost(post.Id) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(post.Id) + require.Nil(t, appErr) require.Equal(t, 0, len(reactions), "should have not created a reaction") }) } @@ -209,7 +221,7 @@ func TestSaveReaction(t *testing.T) { func TestGetReactions(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client userId := th.BasicUser.Id user2Id := th.BasicUser2.Id postId := th.BasicPost.Id @@ -251,8 +263,8 @@ func TestGetReactions(t *testing.T) { } t.Run("get-reactions", func(t *testing.T) { - rr, resp := Client.GetReactions(postId) - CheckNoError(t, resp) + rr, _, err := client.GetReactions(postId) + require.NoError(t, err) assert.Len(t, rr, 5) for _, r := range reactions { @@ -261,34 +273,37 @@ func TestGetReactions(t *testing.T) { }) t.Run("get-reactions-of-invalid-post-id", func(t *testing.T) { - rr, resp := Client.GetReactions("junk") + rr, resp, err := client.GetReactions("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) assert.Empty(t, rr) }) t.Run("get-reactions-of-not-existing-post-id", func(t *testing.T) { - _, resp := Client.GetReactions(GenerateTestId()) + _, resp, err := client.GetReactions(GenerateTestId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("get-reactions-as-anonymous-user", func(t *testing.T) { - Client.Logout() + client.Logout() - _, resp := Client.GetReactions(postId) + _, resp, err := client.GetReactions(postId) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("get-reactions-as-system-admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.GetReactions(postId) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.GetReactions(postId) + require.NoError(t, err) }) } func TestDeleteReaction(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client userId := th.BasicUser.Id user2Id := th.BasicUser2.Id postId := th.BasicPost.Id @@ -325,47 +340,45 @@ func TestDeleteReaction(t *testing.T) { t.Run("delete-reaction", func(t *testing.T) { th.App.SaveReactionForPost(th.Context, r1) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "didn't save reaction correctly") - ok, resp := Client.DeleteReaction(r1) - CheckNoError(t, resp) + _, err := client.DeleteReaction(r1) + require.NoError(t, err) - require.True(t, ok, "should have returned true") - - reactions, err = th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 0, len(reactions), "should have deleted reaction") }) t.Run("delete-reaction-when-post-has-multiple-reactions", func(t *testing.T) { th.App.SaveReactionForPost(th.Context, r1) th.App.SaveReactionForPost(th.Context, r2) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, len(reactions), 2, "didn't save reactions correctly") - _, resp := Client.DeleteReaction(r2) - CheckNoError(t, resp) + _, err := client.DeleteReaction(r2) + require.NoError(t, err) - reactions, err = th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have deleted only 1 reaction") require.Equal(t, *r1, *reactions[0], "should have deleted 1 reaction only") }) t.Run("delete-reaction-when-plus-one-reaction-name", func(t *testing.T) { th.App.SaveReactionForPost(th.Context, r3) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 2, len(reactions), "didn't save reactions correctly") - _, resp := Client.DeleteReaction(r3) - CheckNoError(t, resp) + _, err := client.DeleteReaction(r3) + require.NoError(t, err) - reactions, err = th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have deleted 1 reaction only") require.Equal(t, *r1, *reactions[0], "should have deleted 1 reaction only") }) @@ -373,32 +386,33 @@ func TestDeleteReaction(t *testing.T) { t.Run("delete-reaction-made-by-another-user", func(t *testing.T) { th.LoginBasic2() th.App.SaveReactionForPost(th.Context, r4) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 2, len(reactions), "didn't save reaction correctly") th.LoginBasic() - ok, resp := Client.DeleteReaction(r4) + resp, err := client.DeleteReaction(r4) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should have returned false") - - reactions, err = th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 2, len(reactions), "should have not deleted a reaction") }) t.Run("delete-reaction-from-not-existing-post-id", func(t *testing.T) { r1.PostId = GenerateTestId() - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("delete-reaction-from-not-valid-post-id", func(t *testing.T) { r1.PostId = "junk" - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -406,14 +420,16 @@ func TestDeleteReaction(t *testing.T) { r1.PostId = postId r1.UserId = GenerateTestId() - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("delete-reaction-from-not-valid-user-id", func(t *testing.T) { r1.UserId = "junk" - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -421,34 +437,37 @@ func TestDeleteReaction(t *testing.T) { r1.UserId = userId r1.EmojiName = "" - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) t.Run("delete-reaction-with-not-existing-name", func(t *testing.T) { r1.EmojiName = strings.Repeat("a", 65) - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("delete-reaction-as-anonymous-user", func(t *testing.T) { - Client.Logout() + client.Logout() r1.EmojiName = "smile" - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("delete-reaction-as-system-admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.DeleteReaction(r1) - CheckNoError(t, resp) + _, err := th.SystemAdminClient.DeleteReaction(r1) + require.NoError(t, err) - _, resp = th.SystemAdminClient.DeleteReaction(r4) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.DeleteReaction(r4) + require.NoError(t, err) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 0, len(reactions), "should have deleted both reactions") }) @@ -458,11 +477,12 @@ func TestDeleteReaction(t *testing.T) { th.RemovePermissionFromRole(model.PermissionRemoveReaction.Id, model.ChannelUserRoleId) th.App.SaveReactionForPost(th.Context, r1) - _, resp := Client.DeleteReaction(r1) + resp, err := client.DeleteReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have not deleted a reactions") th.AddPermissionToRole(model.PermissionRemoveReaction.Id, model.ChannelUserRoleId) }) @@ -471,11 +491,12 @@ func TestDeleteReaction(t *testing.T) { th.RemovePermissionFromRole(model.PermissionRemoveOthersReactions.Id, model.SystemAdminRoleId) th.App.SaveReactionForPost(th.Context, r1) - _, resp := th.SystemAdminClient.DeleteReaction(r1) + resp, err := th.SystemAdminClient.DeleteReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have not deleted a reactions") th.AddPermissionToRole(model.PermissionRemoveOthersReactions.Id, model.SystemAdminRoleId) }) @@ -483,8 +504,8 @@ func TestDeleteReaction(t *testing.T) { t.Run("unable-to-delete-reactions-in-read-only-town-square", func(t *testing.T) { th.LoginBasic() - channel, err := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) - assert.Nil(t, err) + channel, appErr := th.App.GetChannelByName("town-square", th.BasicTeam.Id, true) + assert.Nil(t, appErr) post := th.CreatePostWithClient(th.Client, channel) th.App.Srv().SetLicense(model.NewTestLicense()) @@ -495,20 +516,21 @@ func TestDeleteReaction(t *testing.T) { EmojiName: "smile", } - r1, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) + r1, _, err := client.SaveReaction(reaction) + require.NoError(t, err) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have created a reaction") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.ExperimentalTownSquareIsReadOnly = true }) - _, resp = th.SystemAdminClient.DeleteReaction(r1) + resp, err := th.SystemAdminClient.DeleteReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err = th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have not deleted a reaction") th.App.Srv().RemoveLicense() @@ -527,21 +549,22 @@ func TestDeleteReaction(t *testing.T) { EmojiName: "smile", } - r1, resp := Client.SaveReaction(reaction) - CheckNoError(t, resp) + r1, _, err := client.SaveReaction(reaction) + require.NoError(t, err) - reactions, err := th.App.GetReactionsForPost(postId) - require.Nil(t, err) + reactions, appErr := th.App.GetReactionsForPost(postId) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have created a reaction") - err = th.App.DeleteChannel(th.Context, channel, userId) - assert.Nil(t, err) + appErr = th.App.DeleteChannel(th.Context, channel, userId) + assert.Nil(t, appErr) - _, resp = Client.SaveReaction(r1) + _, resp, err := client.SaveReaction(r1) + require.Error(t, err) CheckForbiddenStatus(t, resp) - reactions, err = th.App.GetReactionsForPost(post.Id) - require.Nil(t, err) + reactions, appErr = th.App.GetReactionsForPost(post.Id) + require.Nil(t, appErr) require.Equal(t, 1, len(reactions), "should have not deleted a reaction") }) } @@ -549,7 +572,7 @@ func TestDeleteReaction(t *testing.T) { func TestGetBulkReactions(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client userId := th.BasicUser.Id user2Id := th.BasicUser2.Id post1 := &model.Post{UserId: userId, ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a"} @@ -559,11 +582,11 @@ func TestGetBulkReactions(t *testing.T) { post4 := &model.Post{UserId: user2Id, ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a"} post5 := &model.Post{UserId: user2Id, ChannelId: th.BasicChannel.Id, Message: "zz" + model.NewId() + "a"} - post1, _ = Client.CreatePost(post1) - post2, _ = Client.CreatePost(post2) - post3, _ = Client.CreatePost(post3) - post4, _ = Client.CreatePost(post4) - post5, _ = Client.CreatePost(post5) + post1, _, _ = client.CreatePost(post1) + post2, _, _ = client.CreatePost(post2) + post3, _, _ = client.CreatePost(post3) + post4, _, _ = client.CreatePost(post4) + post5, _, _ = client.CreatePost(post5) expectedPostIdsReactionsMap := make(map[string][]*model.Reaction) expectedPostIdsReactionsMap[post1.Id] = []*model.Reaction{} @@ -605,8 +628,8 @@ func TestGetBulkReactions(t *testing.T) { postIds := []string{post1.Id, post2.Id, post3.Id, post4.Id, post5.Id} t.Run("get-reactions", func(t *testing.T) { - postIdsReactionsMap, resp := Client.GetBulkReactions(postIds) - CheckNoError(t, resp) + postIdsReactionsMap, _, err := client.GetBulkReactions(postIds) + require.NoError(t, err) assert.ElementsMatch(t, expectedPostIdsReactionsMap[post1.Id], postIdsReactionsMap[post1.Id]) assert.ElementsMatch(t, expectedPostIdsReactionsMap[post2.Id], postIdsReactionsMap[post2.Id]) @@ -618,9 +641,10 @@ func TestGetBulkReactions(t *testing.T) { }) t.Run("get-reactions-as-anonymous-user", func(t *testing.T) { - Client.Logout() + client.Logout() - _, resp := Client.GetBulkReactions(postIds) + _, resp, err := client.GetBulkReactions(postIds) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } diff --git a/api4/role_test.go b/api4/role_test.go index 2a85316c02..7fb8930999 100644 --- a/api4/role_test.go +++ b/api4/role_test.go @@ -32,8 +32,8 @@ func TestGetRole(t *testing.T) { defer th.App.Srv().Store.Job().Delete(role.Id) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - received, resp := client.GetRole(role.Id) - CheckNoError(t, resp) + received, _, err := client.GetRole(role.Id) + require.NoError(t, err) assert.Equal(t, received.Id, role.Id) assert.Equal(t, received.Name, role.Name) @@ -44,10 +44,12 @@ func TestGetRole(t *testing.T) { }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.GetRole("1234") + _, resp, err := client.GetRole("1234") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetRole(model.NewId()) + _, resp, err = client.GetRole(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } @@ -69,8 +71,8 @@ func TestGetRoleByName(t *testing.T) { defer th.App.Srv().Store.Job().Delete(role.Id) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - received, resp := client.GetRoleByName(role.Name) - CheckNoError(t, resp) + received, _, err := client.GetRoleByName(role.Name) + require.NoError(t, err) assert.Equal(t, received.Id, role.Id) assert.Equal(t, received.Name, role.Name) @@ -81,10 +83,12 @@ func TestGetRoleByName(t *testing.T) { }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.GetRoleByName(strings.Repeat("abcdefghij", 10)) + _, resp, err := client.GetRoleByName(strings.Repeat("abcdefghij", 10)) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetRoleByName(model.NewId()) + _, resp, err = client.GetRoleByName(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } @@ -129,32 +133,34 @@ func TestGetRolesByNames(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { // Check all three roles can be found. - received, resp := client.GetRolesByNames([]string{role1.Name, role2.Name, role3.Name}) - CheckNoError(t, resp) + received, _, err := client.GetRolesByNames([]string{role1.Name, role2.Name, role3.Name}) + require.NoError(t, err) assert.Contains(t, received, role1) assert.Contains(t, received, role2) assert.Contains(t, received, role3) // Check a list of non-existent roles. - _, resp = client.GetRolesByNames([]string{model.NewId(), model.NewId()}) - CheckNoError(t, resp) + _, _, err = client.GetRolesByNames([]string{model.NewId(), model.NewId()}) + require.NoError(t, err) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { // Empty list should error. - _, resp := client.GetRolesByNames([]string{}) + _, resp, err := client.GetRolesByNames([]string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { // Invalid role name should error. - _, resp := client.GetRolesByNames([]string{model.NewId(), model.NewId(), "!!!!!!"}) + _, resp, err := client.GetRolesByNames([]string{model.NewId(), model.NewId(), "!!!!!!"}) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Empty/whitespace rolenames should be ignored. - _, resp = client.GetRolesByNames([]string{model.NewId(), model.NewId(), "", " "}) - CheckNoError(t, resp) + _, _, err = client.GetRolesByNames([]string{model.NewId(), model.NewId(), "", " "}) + require.NoError(t, err) }) } @@ -171,8 +177,8 @@ func TestPatchRole(t *testing.T) { SchemeManaged: true, } - role, err := th.App.Srv().Store.Role().Save(role) - assert.NoError(t, err) + role, err2 := th.App.Srv().Store.Role().Save(role) + assert.NoError(t, err2) defer th.App.Srv().Store.Job().Delete(role.Id) patch := &model.RolePatch{ @@ -186,7 +192,8 @@ func TestPatchRole(t *testing.T) { assert.NoError(t, err) defer th.App.Srv().Store.Job().Delete(adminRole.Id) - _, resp := client.PatchRole(adminRole.Id, patch) + _, resp, err := client.PatchRole(adminRole.Id, patch) + require.Error(t, err) CheckNotImplementedStatus(t, resp) // Cannot give other roles read / write to system roles or manage roles because only system admin can do these actions @@ -198,27 +205,30 @@ func TestPatchRole(t *testing.T) { Permissions: &[]string{model.PermissionSysconsoleWriteUserManagementSystemRoles.Id}, } - _, resp = client.PatchRole(systemManager.Id, patchWriteSystemRoles) + _, resp, err = client.PatchRole(systemManager.Id, patchWriteSystemRoles) + require.Error(t, err) CheckNotImplementedStatus(t, resp) patchReadSystemRoles := &model.RolePatch{ Permissions: &[]string{model.PermissionSysconsoleReadUserManagementSystemRoles.Id}, } - _, resp = client.PatchRole(systemManager.Id, patchReadSystemRoles) + _, resp, err = client.PatchRole(systemManager.Id, patchReadSystemRoles) + require.Error(t, err) CheckNotImplementedStatus(t, resp) patchManageRoles := &model.RolePatch{ Permissions: &[]string{model.PermissionManageRoles.Id}, } - _, resp = client.PatchRole(systemManager.Id, patchManageRoles) + _, resp, err = client.PatchRole(systemManager.Id, patchManageRoles) + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - received, resp := client.PatchRole(role.Id, patch) - CheckNoError(t, resp) + received, _, err := client.PatchRole(role.Id, patch) + require.NoError(t, err) assert.Equal(t, received.Id, role.Id) assert.Equal(t, received.Name, role.Name) @@ -230,17 +240,20 @@ func TestPatchRole(t *testing.T) { assert.Equal(t, received.SchemeManaged, role.SchemeManaged) // Check a no-op patch succeeds. - _, resp = client.PatchRole(role.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchRole(role.Id, patch) + require.NoError(t, err) - _, resp = client.PatchRole("junk", patch) + _, resp, err := client.PatchRole("junk", patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) - _, resp := th.Client.PatchRole(model.NewId(), patch) + _, resp, err := th.Client.PatchRole(model.NewId(), patch) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = th.Client.PatchRole(role.Id, patch) + _, resp, err = th.Client.PatchRole(role.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) patch = &model.RolePatch{ @@ -248,8 +261,8 @@ func TestPatchRole(t *testing.T) { } th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - received, resp := client.PatchRole(role.Id, patch) - CheckNoError(t, resp) + received, _, err := client.PatchRole(role.Id, patch) + require.NoError(t, err) assert.Equal(t, received.Id, role.Id) assert.Equal(t, received.Name, role.Name) @@ -267,7 +280,8 @@ func TestPatchRole(t *testing.T) { guestRole, err := th.App.Srv().Store.Role().GetByName(context.Background(), "system_guest") require.NoError(t, err) - received, resp = client.PatchRole(guestRole.Id, patch) + received, resp, err = client.PatchRole(guestRole.Id, patch) + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) @@ -277,8 +291,8 @@ func TestPatchRole(t *testing.T) { th.App.Srv().SetLicense(license) guestRole, err := th.App.Srv().Store.Role().GetByName(context.Background(), "system_guest") require.NoError(t, err) - _, resp = client.PatchRole(guestRole.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchRole(guestRole.Id, patch) + require.NoError(t, err) }) }) } diff --git a/api4/saml_test.go b/api4/saml_test.go index 97cbfdb137..7100f82410 100644 --- a/api4/saml_test.go +++ b/api4/saml_test.go @@ -16,9 +16,10 @@ import ( func TestGetSamlMetadata(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - _, resp := Client.GetSamlMetadata() + _, resp, err := client.GetSamlMetadata() + require.Error(t, err) CheckNotImplementedStatus(t, resp) // Rest is tested by enterprise tests @@ -64,10 +65,12 @@ func TestSamlResetId(t *testing.T) { }) require.Nil(t, appErr) - _, resp := th.Client.ResetSamlAuthDataToEmail(false, false, nil) + _, resp, err := th.Client.ResetSamlAuthDataToEmail(false, false, nil) + require.Error(t, err) CheckForbiddenStatus(t, resp) - numAffected, resp := th.SystemAdminClient.ResetSamlAuthDataToEmail(false, false, nil) + numAffected, resp, err := th.SystemAdminClient.ResetSamlAuthDataToEmail(false, false, nil) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, int64(1), numAffected) } diff --git a/api4/scheme_test.go b/api4/scheme_test.go index 481b7a2a87..8f76e9998a 100644 --- a/api4/scheme_test.go +++ b/api4/scheme_test.go @@ -30,8 +30,8 @@ func TestCreateScheme(t *testing.T) { Scope: model.SchemeScopeTeam, } - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) assert.Equal(t, s1.DisplayName, scheme1.DisplayName) assert.Equal(t, s1.Name, scheme1.Name) @@ -48,18 +48,21 @@ func TestCreateScheme(t *testing.T) { assert.NotZero(t, len(s1.DefaultChannelGuestRole)) // Check the default roles have been created. - _, roleRes1 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) - CheckNoError(t, roleRes1) - _, roleRes2 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) - CheckNoError(t, roleRes2) - _, roleRes3 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) - CheckNoError(t, roleRes3) - _, roleRes4 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) - CheckNoError(t, roleRes4) - _, roleRes5 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) - CheckNoError(t, roleRes5) - _, roleRes6 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) - CheckNoError(t, roleRes6) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) + require.NoError(t, err) + + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) + require.NoError(t, err) // Basic Test of a Channel scheme. scheme2 := &model.Scheme{ @@ -69,8 +72,8 @@ func TestCreateScheme(t *testing.T) { Scope: model.SchemeScopeChannel, } - s2, r2 := th.SystemAdminClient.CreateScheme(scheme2) - CheckNoError(t, r2) + s2, _, err := th.SystemAdminClient.CreateScheme(scheme2) + require.NoError(t, err) assert.Equal(t, s2.DisplayName, scheme2.DisplayName) assert.Equal(t, s2.Name, scheme2.Name) @@ -87,12 +90,12 @@ func TestCreateScheme(t *testing.T) { assert.NotZero(t, len(s2.DefaultChannelGuestRole)) // Check the default roles have been created. - _, roleRes7 := th.SystemAdminClient.GetRoleByName(s2.DefaultChannelAdminRole) - CheckNoError(t, roleRes7) - _, roleRes8 := th.SystemAdminClient.GetRoleByName(s2.DefaultChannelUserRole) - CheckNoError(t, roleRes8) - _, roleRes9 := th.SystemAdminClient.GetRoleByName(s2.DefaultChannelGuestRole) - CheckNoError(t, roleRes9) + _, _, err = th.SystemAdminClient.GetRoleByName(s2.DefaultChannelAdminRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s2.DefaultChannelUserRole) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.GetRoleByName(s2.DefaultChannelGuestRole) + require.NoError(t, err) // Try and create a scheme with an invalid scope. scheme3 := &model.Scheme{ @@ -102,7 +105,7 @@ func TestCreateScheme(t *testing.T) { Scope: model.NewId(), } - _, r3 := th.SystemAdminClient.CreateScheme(scheme3) + _, r3, _ := th.SystemAdminClient.CreateScheme(scheme3) CheckBadRequestStatus(t, r3) // Try and create a scheme with an invalid display name. @@ -112,7 +115,7 @@ func TestCreateScheme(t *testing.T) { Description: model.NewId(), Scope: model.NewId(), } - _, r4 := th.SystemAdminClient.CreateScheme(scheme4) + _, r4, _ := th.SystemAdminClient.CreateScheme(scheme4) CheckBadRequestStatus(t, r4) // Try and create a scheme with an invalid name. @@ -122,7 +125,7 @@ func TestCreateScheme(t *testing.T) { Description: model.NewId(), Scope: model.NewId(), } - _, r8 := th.SystemAdminClient.CreateScheme(scheme8) + _, r8, _ := th.SystemAdminClient.CreateScheme(scheme8) CheckBadRequestStatus(t, r8) // Try and create a scheme without the appropriate permissions. @@ -132,7 +135,8 @@ func TestCreateScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeTeam, } - _, r5 := th.Client.CreateScheme(scheme5) + _, r5, err := th.Client.CreateScheme(scheme5) + require.Error(t, err) CheckForbiddenStatus(t, r5) // Try and create a scheme without a license. @@ -143,7 +147,7 @@ func TestCreateScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeTeam, } - _, r6 := th.SystemAdminClient.CreateScheme(scheme6) + _, r6, _ := th.SystemAdminClient.CreateScheme(scheme6) CheckNotImplementedStatus(t, r6) th.App.SetPhase2PermissionsMigrationStatus(false) @@ -157,7 +161,7 @@ func TestCreateScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeTeam, } - _, r7 := th.SystemAdminClient.CreateScheme(scheme7) + _, r7, _ := th.SystemAdminClient.CreateScheme(scheme7) CheckNotImplementedStatus(t, r7) } @@ -177,8 +181,8 @@ func TestGetScheme(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) assert.Equal(t, s1.DisplayName, scheme1.DisplayName) assert.Equal(t, s1.Name, scheme1.Name) @@ -194,32 +198,33 @@ func TestGetScheme(t *testing.T) { assert.NotZero(t, len(s1.DefaultChannelUserRole)) assert.NotZero(t, len(s1.DefaultChannelGuestRole)) - s2, r2 := th.SystemAdminClient.GetScheme(s1.Id) - CheckNoError(t, r2) + s2, _, err := th.SystemAdminClient.GetScheme(s1.Id) + require.NoError(t, err) assert.Equal(t, s1, s2) - _, r3 := th.SystemAdminClient.GetScheme(model.NewId()) + _, r3, _ := th.SystemAdminClient.GetScheme(model.NewId()) CheckNotFoundStatus(t, r3) - _, r4 := th.SystemAdminClient.GetScheme("12345") + _, r4, _ := th.SystemAdminClient.GetScheme("12345") CheckBadRequestStatus(t, r4) th.SystemAdminClient.Logout() - _, r5 := th.SystemAdminClient.GetScheme(s1.Id) + _, r5, _ := th.SystemAdminClient.GetScheme(s1.Id) CheckUnauthorizedStatus(t, r5) th.SystemAdminClient.Login(th.SystemAdminUser.Username, th.SystemAdminUser.Password) th.App.Srv().SetLicense(nil) - _, r6 := th.SystemAdminClient.GetScheme(s1.Id) - CheckNoError(t, r6) + _, _, err = th.SystemAdminClient.GetScheme(s1.Id) + require.NoError(t, err) - _, r7 := th.Client.GetScheme(s1.Id) + _, r7, err := th.Client.GetScheme(s1.Id) + require.Error(t, err) CheckForbiddenStatus(t, r7) th.App.SetPhase2PermissionsMigrationStatus(false) - _, r8 := th.SystemAdminClient.GetScheme(s1.Id) + _, r8, _ := th.SystemAdminClient.GetScheme(s1.Id) CheckNotImplementedStatus(t, r8) } @@ -245,44 +250,45 @@ func TestGetSchemes(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) - _, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) - _, r2 := th.SystemAdminClient.CreateScheme(scheme2) - CheckNoError(t, r2) + _, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) + _, _, err = th.SystemAdminClient.CreateScheme(scheme2) + require.NoError(t, err) - l3, r3 := th.SystemAdminClient.GetSchemes("", 0, 100) - CheckNoError(t, r3) + l3, _, err := th.SystemAdminClient.GetSchemes("", 0, 100) + require.NoError(t, err) assert.NotZero(t, len(l3)) - l4, r4 := th.SystemAdminClient.GetSchemes("team", 0, 100) - CheckNoError(t, r4) + l4, _, err := th.SystemAdminClient.GetSchemes("team", 0, 100) + require.NoError(t, err) for _, s := range l4 { assert.Equal(t, "team", s.Scope) } - l5, r5 := th.SystemAdminClient.GetSchemes("channel", 0, 100) - CheckNoError(t, r5) + l5, _, err := th.SystemAdminClient.GetSchemes("channel", 0, 100) + require.NoError(t, err) for _, s := range l5 { assert.Equal(t, "channel", s.Scope) } - _, r6 := th.SystemAdminClient.GetSchemes("asdf", 0, 100) + _, r6, _ := th.SystemAdminClient.GetSchemes("asdf", 0, 100) CheckBadRequestStatus(t, r6) th.Client.Logout() - _, r7 := th.Client.GetSchemes("", 0, 100) + _, r7, _ := th.Client.GetSchemes("", 0, 100) CheckUnauthorizedStatus(t, r7) th.Client.Login(th.BasicUser.Username, th.BasicUser.Password) - _, r8 := th.Client.GetSchemes("", 0, 100) + _, r8, err := th.Client.GetSchemes("", 0, 100) + require.Error(t, err) CheckForbiddenStatus(t, r8) th.App.SetPhase2PermissionsMigrationStatus(false) - _, r9 := th.SystemAdminClient.GetSchemes("", 0, 100) + _, r9, _ := th.SystemAdminClient.GetSchemes("", 0, 100) CheckNotImplementedStatus(t, r9) } @@ -300,8 +306,8 @@ func TestGetTeamsForScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeTeam, } - scheme1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + scheme1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) team1 := &model.Team{ Name: GenerateTestUsername(), @@ -309,19 +315,19 @@ func TestGetTeamsForScheme(t *testing.T) { Type: model.TeamOpen, } - team1, err := th.App.Srv().Store.Team().Save(team1) + team1, err = th.App.Srv().Store.Team().Save(team1) require.NoError(t, err) - l2, r2 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r2) + l2, _, err := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Zero(t, len(l2)) team1.SchemeId = &scheme1.Id team1, err = th.App.Srv().Store.Team().Update(team1) assert.NoError(t, err) - l3, r3 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r3) + l3, _, err := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Len(t, l3, 1) assert.Equal(t, team1.Id, l3[0].Id) @@ -334,30 +340,31 @@ func TestGetTeamsForScheme(t *testing.T) { team2, err = th.App.Srv().Store.Team().Save(team2) require.NoError(t, err) - l4, r4 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r4) + l4, _, err := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Len(t, l4, 2) assert.Equal(t, team1.Id, l4[0].Id) assert.Equal(t, team2.Id, l4[1].Id) - l5, r5 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 1, 1) - CheckNoError(t, r5) + l5, _, err := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 1, 1) + require.NoError(t, err) assert.Len(t, l5, 1) assert.Equal(t, team2.Id, l5[0].Id) // Check various error cases. - _, ri1 := th.SystemAdminClient.GetTeamsForScheme(model.NewId(), 0, 100) + _, ri1, _ := th.SystemAdminClient.GetTeamsForScheme(model.NewId(), 0, 100) CheckNotFoundStatus(t, ri1) - _, ri2 := th.SystemAdminClient.GetTeamsForScheme("", 0, 100) + _, ri2, _ := th.SystemAdminClient.GetTeamsForScheme("", 0, 100) CheckBadRequestStatus(t, ri2) th.Client.Logout() - _, ri3 := th.Client.GetTeamsForScheme(model.NewId(), 0, 100) + _, ri3, _ := th.Client.GetTeamsForScheme(model.NewId(), 0, 100) CheckUnauthorizedStatus(t, ri3) th.Client.Login(th.BasicUser.Username, th.BasicUser.Password) - _, ri4 := th.Client.GetTeamsForScheme(model.NewId(), 0, 100) + _, ri4, err := th.Client.GetTeamsForScheme(model.NewId(), 0, 100) + require.Error(t, err) CheckForbiddenStatus(t, ri4) scheme2 := &model.Scheme{ @@ -366,15 +373,15 @@ func TestGetTeamsForScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeChannel, } - scheme2, rs2 := th.SystemAdminClient.CreateScheme(scheme2) - CheckNoError(t, rs2) + scheme2, _, err = th.SystemAdminClient.CreateScheme(scheme2) + require.NoError(t, err) - _, ri5 := th.SystemAdminClient.GetTeamsForScheme(scheme2.Id, 0, 100) + _, ri5, _ := th.SystemAdminClient.GetTeamsForScheme(scheme2.Id, 0, 100) CheckBadRequestStatus(t, ri5) th.App.SetPhase2PermissionsMigrationStatus(false) - _, ri6 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) + _, ri6, _ := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) CheckNotImplementedStatus(t, ri6) } @@ -392,8 +399,8 @@ func TestGetChannelsForScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeChannel, } - scheme1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + scheme1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) channel1 := &model.Channel{ TeamId: model.NewId(), @@ -405,16 +412,16 @@ func TestGetChannelsForScheme(t *testing.T) { channel1, errCh := th.App.Srv().Store.Channel().Save(channel1, 1000000) assert.NoError(t, errCh) - l2, r2 := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r2) + l2, _, err := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Zero(t, len(l2)) channel1.SchemeId = &scheme1.Id - channel1, err := th.App.Srv().Store.Channel().Update(channel1) + channel1, err = th.App.Srv().Store.Channel().Update(channel1) assert.NoError(t, err) - l3, r3 := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r3) + l3, _, err := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Len(t, l3, 1) assert.Equal(t, channel1.Id, l3[0].Id) @@ -425,33 +432,34 @@ func TestGetChannelsForScheme(t *testing.T) { Type: model.ChannelTypeOpen, SchemeId: &scheme1.Id, } - channel2, nErr := th.App.Srv().Store.Channel().Save(channel2, 1000000) - assert.NoError(t, nErr) + channel2, err = th.App.Srv().Store.Channel().Save(channel2, 1000000) + assert.NoError(t, err) - l4, r4 := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) - CheckNoError(t, r4) + l4, _, err := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) + require.NoError(t, err) assert.Len(t, l4, 2) assert.Equal(t, channel1.Id, l4[0].Id) assert.Equal(t, channel2.Id, l4[1].Id) - l5, r5 := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 1, 1) - CheckNoError(t, r5) + l5, _, err := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 1, 1) + require.NoError(t, err) assert.Len(t, l5, 1) assert.Equal(t, channel2.Id, l5[0].Id) // Check various error cases. - _, ri1 := th.SystemAdminClient.GetChannelsForScheme(model.NewId(), 0, 100) + _, ri1, _ := th.SystemAdminClient.GetChannelsForScheme(model.NewId(), 0, 100) CheckNotFoundStatus(t, ri1) - _, ri2 := th.SystemAdminClient.GetChannelsForScheme("", 0, 100) + _, ri2, _ := th.SystemAdminClient.GetChannelsForScheme("", 0, 100) CheckBadRequestStatus(t, ri2) th.Client.Logout() - _, ri3 := th.Client.GetChannelsForScheme(model.NewId(), 0, 100) + _, ri3, _ := th.Client.GetChannelsForScheme(model.NewId(), 0, 100) CheckUnauthorizedStatus(t, ri3) th.Client.Login(th.BasicUser.Username, th.BasicUser.Password) - _, ri4 := th.Client.GetChannelsForScheme(model.NewId(), 0, 100) + _, ri4, err := th.Client.GetChannelsForScheme(model.NewId(), 0, 100) + require.Error(t, err) CheckForbiddenStatus(t, ri4) scheme2 := &model.Scheme{ @@ -460,15 +468,15 @@ func TestGetChannelsForScheme(t *testing.T) { Description: model.NewId(), Scope: model.SchemeScopeTeam, } - scheme2, rs2 := th.SystemAdminClient.CreateScheme(scheme2) - CheckNoError(t, rs2) + scheme2, _, err = th.SystemAdminClient.CreateScheme(scheme2) + require.NoError(t, err) - _, ri5 := th.SystemAdminClient.GetChannelsForScheme(scheme2.Id, 0, 100) + _, ri5, _ := th.SystemAdminClient.GetChannelsForScheme(scheme2.Id, 0, 100) CheckBadRequestStatus(t, ri5) th.App.SetPhase2PermissionsMigrationStatus(false) - _, ri6 := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) + _, ri6, _ := th.SystemAdminClient.GetChannelsForScheme(scheme1.Id, 0, 100) CheckNotImplementedStatus(t, ri6) } @@ -488,8 +496,8 @@ func TestPatchScheme(t *testing.T) { Scope: model.SchemeScopeTeam, } - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) assert.Equal(t, s1.DisplayName, scheme1.DisplayName) assert.Equal(t, s1.Name, scheme1.Name) @@ -505,8 +513,8 @@ func TestPatchScheme(t *testing.T) { assert.NotZero(t, len(s1.DefaultChannelUserRole)) assert.NotZero(t, len(s1.DefaultChannelGuestRole)) - s2, r2 := th.SystemAdminClient.GetScheme(s1.Id) - CheckNoError(t, r2) + s2, _, err := th.SystemAdminClient.GetScheme(s1.Id) + require.NoError(t, err) assert.Equal(t, s1, s2) @@ -520,15 +528,15 @@ func TestPatchScheme(t *testing.T) { *schemePatch.Name = model.NewId() *schemePatch.Description = model.NewId() - s3, r3 := th.SystemAdminClient.PatchScheme(s2.Id, schemePatch) - CheckNoError(t, r3) + s3, _, err := th.SystemAdminClient.PatchScheme(s2.Id, schemePatch) + require.NoError(t, err) assert.Equal(t, s3.Id, s2.Id) assert.Equal(t, s3.DisplayName, *schemePatch.DisplayName) assert.Equal(t, s3.Name, *schemePatch.Name) assert.Equal(t, s3.Description, *schemePatch.Description) - s4, r4 := th.SystemAdminClient.GetScheme(s3.Id) - CheckNoError(t, r4) + s4, _, err := th.SystemAdminClient.GetScheme(s3.Id) + require.NoError(t, err) assert.Equal(t, s3, s4) // Test with a partial patch. @@ -536,38 +544,39 @@ func TestPatchScheme(t *testing.T) { *schemePatch.DisplayName = model.NewId() schemePatch.Description = nil - s5, r5 := th.SystemAdminClient.PatchScheme(s4.Id, schemePatch) - CheckNoError(t, r5) + s5, _, err := th.SystemAdminClient.PatchScheme(s4.Id, schemePatch) + require.NoError(t, err) assert.Equal(t, s5.Id, s4.Id) assert.Equal(t, s5.DisplayName, *schemePatch.DisplayName) assert.Equal(t, s5.Name, *schemePatch.Name) assert.Equal(t, s5.Description, s4.Description) - s6, r6 := th.SystemAdminClient.GetScheme(s5.Id) - CheckNoError(t, r6) + s6, _, err := th.SystemAdminClient.GetScheme(s5.Id) + require.NoError(t, err) assert.Equal(t, s5, s6) // Test with invalid patch. *schemePatch.Name = strings.Repeat(model.NewId(), 20) - _, r7 := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) + _, r7, _ := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) CheckBadRequestStatus(t, r7) // Test with unknown ID. *schemePatch.Name = model.NewId() - _, r8 := th.SystemAdminClient.PatchScheme(model.NewId(), schemePatch) + _, r8, _ := th.SystemAdminClient.PatchScheme(model.NewId(), schemePatch) CheckNotFoundStatus(t, r8) // Test with invalid ID. - _, r9 := th.SystemAdminClient.PatchScheme("12345", schemePatch) + _, r9, _ := th.SystemAdminClient.PatchScheme("12345", schemePatch) CheckBadRequestStatus(t, r9) // Test without required permissions. - _, r10 := th.Client.PatchScheme(s6.Id, schemePatch) + _, r10, err := th.Client.PatchScheme(s6.Id, schemePatch) + require.Error(t, err) CheckForbiddenStatus(t, r10) // Test without license. th.App.Srv().SetLicense(nil) - _, r11 := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) + _, r11, _ := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) CheckNotImplementedStatus(t, r11) th.App.SetPhase2PermissionsMigrationStatus(false) @@ -575,7 +584,7 @@ func TestPatchScheme(t *testing.T) { th.LoginSystemAdmin() th.App.Srv().SetLicense(model.NewTestLicense("custom_permissions_schemes")) - _, r12 := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) + _, r12, _ := th.SystemAdminClient.PatchScheme(s6.Id, schemePatch) CheckNotImplementedStatus(t, r12) } @@ -596,22 +605,22 @@ func TestDeleteScheme(t *testing.T) { Scope: model.SchemeScopeTeam, } - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) // Retrieve the roles and check they are not deleted. - role1, roleRes1 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) - CheckNoError(t, roleRes1) - role2, roleRes2 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) - CheckNoError(t, roleRes2) - role3, roleRes3 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) - CheckNoError(t, roleRes3) - role4, roleRes4 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) - CheckNoError(t, roleRes4) - role5, roleRes5 := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) - CheckNoError(t, roleRes5) - role6, roleRes6 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) - CheckNoError(t, roleRes6) + role1, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) + require.NoError(t, err) + role2, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) + require.NoError(t, err) + role3, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) + require.NoError(t, err) + role4, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) + require.NoError(t, err) + role5, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) + require.NoError(t, err) + role6, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) + require.NoError(t, err) assert.Zero(t, role1.DeleteAt) assert.Zero(t, role2.DeleteAt) @@ -631,22 +640,22 @@ func TestDeleteScheme(t *testing.T) { require.NoError(t, err) // Delete the Scheme. - _, r3 := th.SystemAdminClient.DeleteScheme(s1.Id) - CheckNoError(t, r3) + _, err = th.SystemAdminClient.DeleteScheme(s1.Id) + require.NoError(t, err) // Check the roles were deleted. - role1, roleRes1 = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) - CheckNoError(t, roleRes1) - role2, roleRes2 = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) - CheckNoError(t, roleRes2) - role3, roleRes3 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) - CheckNoError(t, roleRes3) - role4, roleRes4 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) - CheckNoError(t, roleRes4) - role5, roleRes5 = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) - CheckNoError(t, roleRes5) - role6, roleRes6 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) - CheckNoError(t, roleRes6) + role1, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamAdminRole) + require.NoError(t, err) + role2, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamUserRole) + require.NoError(t, err) + role3, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) + require.NoError(t, err) + role4, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) + require.NoError(t, err) + role5, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultTeamGuestRole) + require.NoError(t, err) + role6, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) + require.NoError(t, err) assert.NotZero(t, role1.DeleteAt) assert.NotZero(t, role2.DeleteAt) @@ -656,8 +665,8 @@ func TestDeleteScheme(t *testing.T) { assert.NotZero(t, role6.DeleteAt) // Check the team now uses the default scheme - c2, resp := th.SystemAdminClient.GetTeam(team.Id, "") - CheckNoError(t, resp) + c2, _, err := th.SystemAdminClient.GetTeam(team.Id, "") + require.NoError(t, err) assert.Equal(t, "", *c2.SchemeId) }) @@ -674,16 +683,16 @@ func TestDeleteScheme(t *testing.T) { Scope: model.SchemeScopeChannel, } - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) // Retrieve the roles and check they are not deleted. - role3, roleRes3 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) - CheckNoError(t, roleRes3) - role4, roleRes4 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) - CheckNoError(t, roleRes4) - role6, roleRes6 := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) - CheckNoError(t, roleRes6) + role3, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) + require.NoError(t, err) + role4, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) + require.NoError(t, err) + role6, _, err := th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) + require.NoError(t, err) assert.Zero(t, role3.DeleteAt) assert.Zero(t, role4.DeleteAt) @@ -700,24 +709,24 @@ func TestDeleteScheme(t *testing.T) { assert.NoError(t, err) // Delete the Scheme. - _, r3 := th.SystemAdminClient.DeleteScheme(s1.Id) - CheckNoError(t, r3) + _, err = th.SystemAdminClient.DeleteScheme(s1.Id) + require.NoError(t, err) // Check the roles were deleted. - role3, roleRes3 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) - CheckNoError(t, roleRes3) - role4, roleRes4 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) - CheckNoError(t, roleRes4) - role6, roleRes6 = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) - CheckNoError(t, roleRes6) + role3, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelAdminRole) + require.NoError(t, err) + role4, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelUserRole) + require.NoError(t, err) + role6, _, err = th.SystemAdminClient.GetRoleByName(s1.DefaultChannelGuestRole) + require.NoError(t, err) assert.NotZero(t, role3.DeleteAt) assert.NotZero(t, role4.DeleteAt) assert.NotZero(t, role6.DeleteAt) // Check the channel now uses the default scheme - c2, resp := th.SystemAdminClient.GetChannelByName(channel.Name, channel.TeamId, "") - CheckNoError(t, resp) + c2, _, err := th.SystemAdminClient.GetChannelByName(channel.Name, channel.TeamId, "") + require.NoError(t, err) assert.Equal(t, "", *c2.SchemeId) }) @@ -733,31 +742,36 @@ func TestDeleteScheme(t *testing.T) { Scope: model.SchemeScopeChannel, } - s1, r1 := th.SystemAdminClient.CreateScheme(scheme1) - CheckNoError(t, r1) + s1, _, err := th.SystemAdminClient.CreateScheme(scheme1) + require.NoError(t, err) // Test with unknown ID. - _, r2 := th.SystemAdminClient.DeleteScheme(model.NewId()) + r2, err := th.SystemAdminClient.DeleteScheme(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, r2) // Test with invalid ID. - _, r3 := th.SystemAdminClient.DeleteScheme("12345") + r3, err := th.SystemAdminClient.DeleteScheme("12345") + require.Error(t, err) CheckBadRequestStatus(t, r3) // Test without required permissions. - _, r4 := th.Client.DeleteScheme(s1.Id) + r4, err := th.Client.DeleteScheme(s1.Id) + require.Error(t, err) CheckForbiddenStatus(t, r4) // Test without license. th.App.Srv().SetLicense(nil) - _, r5 := th.SystemAdminClient.DeleteScheme(s1.Id) + r5, err := th.SystemAdminClient.DeleteScheme(s1.Id) + require.Error(t, err) CheckNotImplementedStatus(t, r5) th.App.SetPhase2PermissionsMigrationStatus(false) th.App.Srv().SetLicense(model.NewTestLicense("custom_permissions_schemes")) - _, r6 := th.SystemAdminClient.DeleteScheme(s1.Id) + r6, err := th.SystemAdminClient.DeleteScheme(s1.Id) + require.Error(t, err) CheckNotImplementedStatus(t, r6) }) } @@ -770,27 +784,27 @@ func TestUpdateTeamSchemeWithTeamMembers(t *testing.T) { th.App.SetPhase2PermissionsMigrationStatus(true) team := th.CreateTeam() - _, _, err := th.App.AddUserToTeam(th.Context, team.Id, th.BasicUser.Id, th.SystemAdminUser.Id) - require.Nil(t, err) + _, _, appErr := th.App.AddUserToTeam(th.Context, team.Id, th.BasicUser.Id, th.SystemAdminUser.Id) + require.Nil(t, appErr) teamScheme := th.SetupTeamScheme() - teamUserRole, err := th.App.GetRoleByName(context.Background(), teamScheme.DefaultTeamUserRole) - require.Nil(t, err) + teamUserRole, appErr := th.App.GetRoleByName(context.Background(), teamScheme.DefaultTeamUserRole) + require.Nil(t, appErr) teamUserRole.Permissions = []string{} - _, err = th.App.UpdateRole(teamUserRole) - require.Nil(t, err) + _, appErr = th.App.UpdateRole(teamUserRole) + require.Nil(t, appErr) th.LoginBasic() - _, resp := th.Client.CreateChannel(&model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id}) - require.Nil(t, resp.Error) + _, _, err := th.Client.CreateChannel(&model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id}) + require.NoError(t, err) team.SchemeId = &teamScheme.Id - team, err = th.App.UpdateTeamScheme(team) - require.Nil(t, err) + team, appErr = th.App.UpdateTeamScheme(team) + require.Nil(t, appErr) - _, resp = th.Client.CreateChannel(&model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id}) - require.NotNil(t, resp.Error) + _, _, err = th.Client.CreateChannel(&model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.ChannelTypeOpen, TeamId: team.Id}) + require.Error(t, err) }) } diff --git a/api4/shared_channel_test.go b/api4/shared_channel_test.go index a1bd069a8a..63e0f4bf53 100644 --- a/api4/shared_channel_test.go +++ b/api4/shared_channel_test.go @@ -53,8 +53,8 @@ func TestGetAllSharedChannels(t *testing.T) { t.Run("get shared channels paginated", func(t *testing.T) { channelIds := make([]string, 0, 21) for i := 0; i < pages; i++ { - channels, resp := th.Client.GetAllSharedChannels(th.BasicTeam.Id, i, pageSize) - CheckNoError(t, resp) + channels, _, err := th.Client.GetAllSharedChannels(th.BasicTeam.Id, i, pageSize) + require.NoError(t, err) channelIds = append(channelIds, getIds(channels)...) } sort.Strings(channelIds) @@ -64,8 +64,8 @@ func TestGetAllSharedChannels(t *testing.T) { }) t.Run("get shared channels for invalid team", func(t *testing.T) { - channels, resp := th.Client.GetAllSharedChannels(model.NewId(), 0, 100) - CheckNoError(t, resp) + channels, _, err := th.Client.GetAllSharedChannels(model.NewId(), 0, 100) + require.NoError(t, err) assert.Empty(t, channels) }) } @@ -128,13 +128,14 @@ func TestGetRemoteClusterById(t *testing.T) { require.NoError(t, err) t.Run("valid remote, user is member", func(t *testing.T) { - rcInfo, resp := th.Client.GetRemoteClusterInfo(rc.RemoteId) - CheckNoError(t, resp) + rcInfo, _, err := th.Client.GetRemoteClusterInfo(rc.RemoteId) + require.NoError(t, err) assert.Equal(t, rc.Name, rcInfo.Name) }) t.Run("invalid remote", func(t *testing.T) { - _, resp := th.Client.GetRemoteClusterInfo(model.NewId()) + _, resp, err := th.Client.GetRemoteClusterInfo(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -144,17 +145,17 @@ func TestCreateDirectChannelWithRemoteUser(t *testing.T) { t.Run("creates a local DM channel that is shared", func(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client - defer Client.Logout() + client := th.Client + defer client.Logout() localUser := th.BasicUser remoteUser := th.CreateUser() remoteUser.RemoteId = model.NewString(model.NewId()) - remoteUser, err := th.App.UpdateUser(remoteUser, false) - require.Nil(t, err) + remoteUser, appErr := th.App.UpdateUser(remoteUser, false) + require.Nil(t, appErr) - dm, resp := Client.CreateDirectChannel(localUser.Id, remoteUser.Id) - CheckNoError(t, resp) + dm, _, err := client.CreateDirectChannel(localUser.Id, remoteUser.Id) + require.NoError(t, err) channelName := model.GetDMNameFromIds(localUser.Id, remoteUser.Id) require.Equal(t, channelName, dm.Name, "dm name didn't match") @@ -164,8 +165,8 @@ func TestCreateDirectChannelWithRemoteUser(t *testing.T) { t.Run("sends a shared channel invitation to the remote", func(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client - defer Client.Logout() + client := th.Client + defer client.Logout() mockService := app.NewMockSharedChannelService(nil, app.MockOptionSharedChannelServiceWithActive(true)) th.App.Srv().SetSharedChannelSyncService(mockService) @@ -177,15 +178,15 @@ func TestCreateDirectChannelWithRemoteUser(t *testing.T) { Token: model.NewId(), CreatorId: localUser.Id, } - rc, err := th.App.AddRemoteCluster(rc) - require.Nil(t, err) + rc, appErr := th.App.AddRemoteCluster(rc) + require.Nil(t, appErr) remoteUser.RemoteId = model.NewString(rc.RemoteId) - remoteUser, err = th.App.UpdateUser(remoteUser, false) - require.Nil(t, err) + remoteUser, appErr = th.App.UpdateUser(remoteUser, false) + require.Nil(t, appErr) - dm, resp := Client.CreateDirectChannel(localUser.Id, remoteUser.Id) - CheckNoError(t, resp) + dm, _, err := client.CreateDirectChannel(localUser.Id, remoteUser.Id) + require.NoError(t, err) channelName := model.GetDMNameFromIds(localUser.Id, remoteUser.Id) require.Equal(t, channelName, dm.Name, "dm name didn't match") @@ -197,8 +198,8 @@ func TestCreateDirectChannelWithRemoteUser(t *testing.T) { t.Run("does not send a shared channel invitation to the remote when creator is remote", func(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client - defer Client.Logout() + client := th.Client + defer client.Logout() mockService := app.NewMockSharedChannelService(nil, app.MockOptionSharedChannelServiceWithActive(true)) th.App.Srv().SetSharedChannelSyncService(mockService) @@ -210,15 +211,15 @@ func TestCreateDirectChannelWithRemoteUser(t *testing.T) { Token: model.NewId(), CreatorId: localUser.Id, } - rc, err := th.App.AddRemoteCluster(rc) - require.Nil(t, err) + rc, appErr := th.App.AddRemoteCluster(rc) + require.Nil(t, appErr) remoteUser.RemoteId = model.NewString(rc.RemoteId) - remoteUser, err = th.App.UpdateUser(remoteUser, false) - require.Nil(t, err) + remoteUser, appErr = th.App.UpdateUser(remoteUser, false) + require.Nil(t, appErr) - dm, resp := Client.CreateDirectChannel(remoteUser.Id, localUser.Id) - CheckNoError(t, resp) + dm, _, err := client.CreateDirectChannel(remoteUser.Id, localUser.Id) + require.NoError(t, err) channelName := model.GetDMNameFromIds(localUser.Id, remoteUser.Id) require.Equal(t, channelName, dm.Name, "dm name didn't match") diff --git a/api4/status_test.go b/api4/status_test.go index b9362441d2..61241a5718 100644 --- a/api4/status_test.go +++ b/api4/status_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/mattermost/mattermost-server/v6/model" ) @@ -15,39 +16,39 @@ import ( func TestGetUserStatus(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client t.Run("offline status", func(t *testing.T) { - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "offline", userStatus.Status) }) t.Run("online status", func(t *testing.T) { th.App.SetStatusOnline(th.BasicUser.Id, true) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "online", userStatus.Status) }) t.Run("away status", func(t *testing.T) { th.App.SetStatusAwayIfNeeded(th.BasicUser.Id, true) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "away", userStatus.Status) }) t.Run("dnd status", func(t *testing.T) { th.App.SetStatusDoNotDisturb(th.BasicUser.Id) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "dnd", userStatus.Status) }) t.Run("dnd status timed", func(t *testing.T) { th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(10*time.Minute).Unix()) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "dnd", userStatus.Status) }) @@ -55,43 +56,44 @@ func TestGetUserStatus(t *testing.T) { task := model.CreateRecurringTaskFromNextIntervalTime("Unset DND Statuses From Test", th.App.UpdateDNDStatusOfUsers, 1*time.Second) defer task.Cancel() th.App.SetStatusOnline(th.BasicUser.Id, true) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "online", userStatus.Status) th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(2*time.Second).Unix()) - userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err = client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "dnd", userStatus.Status) time.Sleep(3 * time.Second) - userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err = client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "online", userStatus.Status) }) t.Run("back to offline status", func(t *testing.T) { th.App.SetStatusOffline(th.BasicUser.Id, true) - userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, "offline", userStatus.Status) }) t.Run("get other user status", func(t *testing.T) { //Get user2 status logged as user1 - userStatus, resp := Client.GetUserStatus(th.BasicUser2.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser2.Id, "") + require.NoError(t, err) assert.Equal(t, "offline", userStatus.Status) }) t.Run("get status from logged out user", func(t *testing.T) { - Client.Logout() - _, resp := Client.GetUserStatus(th.BasicUser2.Id, "") + client.Logout() + _, resp, err := client.GetUserStatus(th.BasicUser2.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("get status from other user", func(t *testing.T) { th.LoginBasic2() - userStatus, resp := Client.GetUserStatus(th.BasicUser2.Id, "") - CheckNoError(t, resp) + userStatus, _, err := client.GetUserStatus(th.BasicUser2.Id, "") + require.NoError(t, err) assert.Equal(t, "offline", userStatus.Status) }) } @@ -99,28 +101,31 @@ func TestGetUserStatus(t *testing.T) { func TestGetUsersStatusesByIds(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client usersIds := []string{th.BasicUser.Id, th.BasicUser2.Id} t.Run("empty userIds list", func(t *testing.T) { - _, resp := Client.GetUsersStatusesByIds([]string{}) + _, resp, err := client.GetUsersStatusesByIds([]string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("completely invalid userIds list", func(t *testing.T) { - _, resp := Client.GetUsersStatusesByIds([]string{"invalid_user_id", "invalid_user_id"}) + _, resp, err := client.GetUsersStatusesByIds([]string{"invalid_user_id", "invalid_user_id"}) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("partly invalid userIds list", func(t *testing.T) { - _, resp := Client.GetUsersStatusesByIds([]string{th.BasicUser.Id, "invalid_user_id"}) + _, resp, err := client.GetUsersStatusesByIds([]string{th.BasicUser.Id, "invalid_user_id"}) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("offline status", func(t *testing.T) { - usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds) - CheckNoError(t, resp) + usersStatuses, _, err := client.GetUsersStatusesByIds(usersIds) + require.NoError(t, err) for _, userStatus := range usersStatuses { assert.Equal(t, "offline", userStatus.Status) } @@ -129,8 +134,8 @@ func TestGetUsersStatusesByIds(t *testing.T) { t.Run("online status", func(t *testing.T) { th.App.SetStatusOnline(th.BasicUser.Id, true) th.App.SetStatusOnline(th.BasicUser2.Id, true) - usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds) - CheckNoError(t, resp) + usersStatuses, _, err := client.GetUsersStatusesByIds(usersIds) + require.NoError(t, err) for _, userStatus := range usersStatuses { assert.Equal(t, "online", userStatus.Status) } @@ -139,8 +144,8 @@ func TestGetUsersStatusesByIds(t *testing.T) { t.Run("away status", func(t *testing.T) { th.App.SetStatusAwayIfNeeded(th.BasicUser.Id, true) th.App.SetStatusAwayIfNeeded(th.BasicUser2.Id, true) - usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds) - CheckNoError(t, resp) + usersStatuses, _, err := client.GetUsersStatusesByIds(usersIds) + require.NoError(t, err) for _, userStatus := range usersStatuses { assert.Equal(t, "away", userStatus.Status) } @@ -149,8 +154,8 @@ func TestGetUsersStatusesByIds(t *testing.T) { t.Run("dnd status", func(t *testing.T) { th.App.SetStatusDoNotDisturb(th.BasicUser.Id) th.App.SetStatusDoNotDisturb(th.BasicUser2.Id) - usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds) - CheckNoError(t, resp) + usersStatuses, _, err := client.GetUsersStatusesByIds(usersIds) + require.NoError(t, err) for _, userStatus := range usersStatuses { assert.Equal(t, "dnd", userStatus.Status) } @@ -159,17 +164,18 @@ func TestGetUsersStatusesByIds(t *testing.T) { t.Run("dnd status", func(t *testing.T) { th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(10*time.Minute).Unix()) th.App.SetStatusDoNotDisturbTimed(th.BasicUser2.Id, time.Now().Add(15*time.Minute).Unix()) - usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds) - CheckNoError(t, resp) + usersStatuses, _, err := client.GetUsersStatusesByIds(usersIds) + require.NoError(t, err) for _, userStatus := range usersStatuses { assert.Equal(t, "dnd", userStatus.Status) } }) t.Run("get statuses from logged out user", func(t *testing.T) { - Client.Logout() + client.Logout() - _, resp := Client.GetUsersStatusesByIds(usersIds) + _, resp, err := client.GetUsersStatusesByIds(usersIds) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -177,59 +183,62 @@ func TestGetUsersStatusesByIds(t *testing.T) { func TestUpdateUserStatus(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client t.Run("set online status", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser.Id} - updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) - CheckNoError(t, resp) + updateUserStatus, _, err := client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + require.NoError(t, err) assert.Equal(t, "online", updateUserStatus.Status) }) t.Run("set away status", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "away", UserId: th.BasicUser.Id} - updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) - CheckNoError(t, resp) + updateUserStatus, _, err := client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + require.NoError(t, err) assert.Equal(t, "away", updateUserStatus.Status) }) t.Run("set dnd status timed", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "dnd", UserId: th.BasicUser.Id, DNDEndTime: time.Now().Add(10 * time.Minute).Unix()} - updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) - CheckNoError(t, resp) + updateUserStatus, _, err := client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + require.NoError(t, err) assert.Equal(t, "dnd", updateUserStatus.Status) }) t.Run("set offline status", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "offline", UserId: th.BasicUser.Id} - updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) - CheckNoError(t, resp) + updateUserStatus, _, err := client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + require.NoError(t, err) assert.Equal(t, "offline", updateUserStatus.Status) }) t.Run("set status for other user as regular user", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id} - _, resp := Client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) + _, resp, err := client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("set status for other user as admin user", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id} - updateUserStatus, _ := th.SystemAdminClient.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) + updateUserStatus, _, _ := th.SystemAdminClient.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) assert.Equal(t, "online", updateUserStatus.Status) }) t.Run("not matching status user id and the user id passed in the function", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id} - _, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + _, resp, err := client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("get statuses from logged out user", func(t *testing.T) { toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id} - Client.Logout() + client.Logout() - _, resp := Client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) + _, resp, err := client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } diff --git a/api4/system_test.go b/api4/system_test.go index 3db5f3187e..00aa126b09 100644 --- a/api4/system_test.go +++ b/api4/system_test.go @@ -28,8 +28,8 @@ func TestGetPing(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { t.Run("healthy", func(t *testing.T) { - status, resp := client.GetPing() - CheckNoError(t, resp) + status, _, err := client.GetPing() + require.NoError(t, err) assert.Equal(t, model.StatusOk, status) }) @@ -40,7 +40,8 @@ func TestGetPing(t *testing.T) { }() th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.GoroutineHealthThreshold = 10 }) - status, resp := client.GetPing() + status, resp, err := client.GetPing() + require.Error(t, err) CheckInternalErrorStatus(t, resp) assert.Equal(t, model.StatusUnhealthy, status) }) @@ -48,9 +49,8 @@ func TestGetPing(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { t.Run("healthy", func(t *testing.T) { - status, resp := client.GetPingWithServerStatus() - - CheckNoError(t, resp) + status, _, err := client.GetPingWithServerStatus() + require.NoError(t, err) assert.Equal(t, model.StatusOk, status) }) @@ -62,7 +62,8 @@ func TestGetPing(t *testing.T) { th.App.Config().FileSettings.DriverName = oldDriver }() - status, resp := client.GetPingWithServerStatus() + status, resp, err := client.GetPingWithServerStatus() + require.Error(t, err) CheckInternalErrorStatus(t, resp) assert.Equal(t, model.StatusUnhealthy, status) }) @@ -70,8 +71,8 @@ func TestGetPing(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { th.App.ReloadConfig() - resp, appErr := client.DoApiGet(client.GetSystemRoute()+"/ping", "") - require.Nil(t, appErr) + resp, err := client.DoApiGet(client.GetSystemRoute()+"/ping", "") + require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode) respBytes, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) @@ -83,8 +84,8 @@ func TestGetPing(t *testing.T) { defer os.Unsetenv("MM_FEATUREFLAGS_TESTFEATURE") th.App.ReloadConfig() - resp, appErr = client.DoApiGet(client.GetSystemRoute()+"/ping", "") - require.Nil(t, appErr) + resp, err = client.DoApiGet(client.GetSystemRoute()+"/ping", "") + require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode) respBytes, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) @@ -96,35 +97,37 @@ func TestGetPing(t *testing.T) { func TestGetAudits(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client - audits, resp := th.SystemAdminClient.GetAudits(0, 100, "") - CheckNoError(t, resp) + audits, _, err := th.SystemAdminClient.GetAudits(0, 100, "") + require.NoError(t, err) require.NotEmpty(t, audits, "should not be empty") - audits, resp = th.SystemAdminClient.GetAudits(0, 1, "") - CheckNoError(t, resp) + audits, _, err = th.SystemAdminClient.GetAudits(0, 1, "") + require.NoError(t, err) require.Len(t, audits, 1, "should only be 1") - audits, resp = th.SystemAdminClient.GetAudits(1, 1, "") - CheckNoError(t, resp) + audits, _, err = th.SystemAdminClient.GetAudits(1, 1, "") + require.NoError(t, err) require.Len(t, audits, 1, "should only be 1") - _, resp = th.SystemAdminClient.GetAudits(-1, -1, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetAudits(-1, -1, "") + require.NoError(t, err) - _, resp = Client.GetAudits(0, 100, "") + _, resp, err := client.GetAudits(0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetAudits(0, 100, "") + client.Logout() + _, resp, err = client.GetAudits(0, 100, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestEmailTest(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client dir, err := ioutil.TempDir("", "") require.NoError(t, err) @@ -155,13 +158,14 @@ func TestEmailTest(t *testing.T) { } t.Run("as system user", func(t *testing.T) { - _, resp := Client.TestEmail(&config) + resp, err := client.TestEmail(&config) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.TestEmail(&config) - CheckErrorMessage(t, resp, "api.admin.test_email.missing_server") + resp, err := th.SystemAdminClient.TestEmail(&config) + CheckErrorID(t, err, "api.admin.test_email.missing_server") CheckBadRequestStatus(t, resp) inbucket_host := os.Getenv("CI_INBUCKET_HOST") @@ -176,14 +180,16 @@ func TestEmailTest(t *testing.T) { *config.EmailSettings.SMTPServer = inbucket_host *config.EmailSettings.SMTPPort = inbucket_port - _, resp = th.SystemAdminClient.TestEmail(&config) + resp, err = th.SystemAdminClient.TestEmail(&config) + require.NoError(t, err) CheckOKStatus(t, resp) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.TestEmail(&config) + resp, err := th.SystemAdminClient.TestEmail(&config) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -196,22 +202,23 @@ func TestGenerateSupportPacket(t *testing.T) { l := model.NewTestLicense() th.App.Srv().SetLicense(l) - file, resp := th.SystemAdminClient.GenerateSupportPacket() - require.Nil(t, resp.Error) + file, _, err := th.SystemAdminClient.GenerateSupportPacket() + require.NoError(t, err) require.NotZero(t, len(file)) }) t.Run("As a Regular User", func(t *testing.T) { - _, resp := th.Client.GenerateSupportPacket() + _, resp, err := th.Client.GenerateSupportPacket() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("Server with no License", func(t *testing.T) { - ok, resp := th.SystemAdminClient.RemoveLicenseFile() - CheckNoError(t, resp) - require.True(t, ok) + _, err := th.SystemAdminClient.RemoveLicenseFile() + require.NoError(t, err) - _, resp = th.SystemAdminClient.GenerateSupportPacket() + _, resp, err := th.SystemAdminClient.GenerateSupportPacket() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -219,7 +226,7 @@ func TestGenerateSupportPacket(t *testing.T) { func TestSiteURLTest(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.HasSuffix(r.URL.Path, "/valid/api/v4/system/ping") { @@ -234,25 +241,30 @@ func TestSiteURLTest(t *testing.T) { invalidSiteURL := ts.URL + "/invalid" t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.TestSiteURL("") + resp, err := th.SystemAdminClient.TestSiteURL("") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.TestSiteURL(invalidSiteURL) + resp, err = th.SystemAdminClient.TestSiteURL(invalidSiteURL) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.TestSiteURL(validSiteURL) + resp, err = th.SystemAdminClient.TestSiteURL(validSiteURL) + require.NoError(t, err) CheckOKStatus(t, resp) }) t.Run("as system user", func(t *testing.T) { - _, resp := Client.TestSiteURL(validSiteURL) + resp, err := client.TestSiteURL(validSiteURL) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := Client.TestSiteURL(validSiteURL) + resp, err := client.TestSiteURL(validSiteURL) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -260,22 +272,24 @@ func TestSiteURLTest(t *testing.T) { func TestDatabaseRecycle(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client t.Run("as system user", func(t *testing.T) { - _, resp := Client.DatabaseRecycle() + resp, err := client.DatabaseRecycle() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.DatabaseRecycle() - CheckNoError(t, resp) + _, err := th.SystemAdminClient.DatabaseRecycle() + require.NoError(t, err) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.DatabaseRecycle() + resp, err := th.SystemAdminClient.DatabaseRecycle() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -283,26 +297,25 @@ func TestDatabaseRecycle(t *testing.T) { func TestInvalidateCaches(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client t.Run("as system user", func(t *testing.T) { - ok, resp := Client.InvalidateCaches() + resp, err := client.InvalidateCaches() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not clean the cache due to no permission.") }) t.Run("as system admin", func(t *testing.T) { - ok, resp := th.SystemAdminClient.InvalidateCaches() - CheckNoError(t, resp) - require.True(t, ok, "should clean the cache") + _, err := th.SystemAdminClient.InvalidateCaches() + require.NoError(t, err) }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - ok, resp := th.SystemAdminClient.InvalidateCaches() + resp, err := th.SystemAdminClient.InvalidateCaches() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not clean the cache due to no permission.") }) } @@ -315,41 +328,44 @@ func TestGetLogs(t *testing.T) { } th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - logs, resp := c.GetLogs(0, 10) - CheckNoError(t, resp) + logs, _, err := c.GetLogs(0, 10) + require.NoError(t, err) require.Len(t, logs, 10) for i := 10; i < 20; i++ { assert.Containsf(t, logs[i-10], fmt.Sprintf(`"msg":"%d"`, i), "Log line doesn't contain correct message") } - logs, resp = c.GetLogs(1, 10) - CheckNoError(t, resp) + logs, _, err = c.GetLogs(1, 10) + require.NoError(t, err) require.Len(t, logs, 10) - logs, resp = c.GetLogs(-1, -1) - CheckNoError(t, resp) + logs, _, err = c.GetLogs(-1, -1) + require.NoError(t, err) require.NotEmpty(t, logs, "should not be empty") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.Client.GetLogs(0, 10) + _, resp, err := th.Client.GetLogs(0, 10) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) - _, resp := th.Client.GetLogs(0, 10) + _, resp, err := th.Client.GetLogs(0, 10) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetLogs(0, 10) + _, resp, err = th.Client.GetLogs(0, 10) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestPostLog(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client enableDev := *th.App.Config().ServiceSettings.EnableDeveloper defer func() { @@ -361,28 +377,29 @@ func TestPostLog(t *testing.T) { message["level"] = "ERROR" message["message"] = "this is a test" - _, resp := Client.PostLog(message) - CheckNoError(t, resp) + _, _, err := client.PostLog(message) + require.NoError(t, err) *th.App.Config().ServiceSettings.EnableDeveloper = false - _, resp = Client.PostLog(message) - CheckNoError(t, resp) + _, _, err = client.PostLog(message) + require.NoError(t, err) *th.App.Config().ServiceSettings.EnableDeveloper = true - Client.Logout() + client.Logout() - _, resp = Client.PostLog(message) - CheckNoError(t, resp) + _, _, err = client.PostLog(message) + require.NoError(t, err) *th.App.Config().ServiceSettings.EnableDeveloper = false - _, resp = Client.PostLog(message) + _, resp, err := client.PostLog(message) + require.Error(t, err) CheckForbiddenStatus(t, resp) - logMessage, resp := th.SystemAdminClient.PostLog(message) - CheckNoError(t, resp) + logMessage, _, err := th.SystemAdminClient.PostLog(message) + require.NoError(t, err) require.NotEmpty(t, logMessage, "should return the log message") } @@ -390,13 +407,14 @@ func TestPostLog(t *testing.T) { func TestGetAnalyticsOld(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - rows, resp := Client.GetAnalyticsOld("", "") + rows, resp, err := client.GetAnalyticsOld("", "") + require.Error(t, err) CheckForbiddenStatus(t, resp) require.Nil(t, rows, "should be nil") - rows, resp = th.SystemAdminClient.GetAnalyticsOld("", "") - CheckNoError(t, resp) + rows, _, err = th.SystemAdminClient.GetAnalyticsOld("", "") + require.NoError(t, err) found := false found2 := false @@ -412,17 +430,17 @@ func TestGetAnalyticsOld(t *testing.T) { assert.True(t, found, "should return unique user count") assert.True(t, found2, "should return inactive user count") - _, resp = th.SystemAdminClient.GetAnalyticsOld("post_counts_day", "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetAnalyticsOld("post_counts_day", "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetAnalyticsOld("user_counts_with_posts_day", "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetAnalyticsOld("user_counts_with_posts_day", "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetAnalyticsOld("extra_counts", "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetAnalyticsOld("extra_counts", "") + require.NoError(t, err) - rows, resp = th.SystemAdminClient.GetAnalyticsOld("", th.BasicTeam.Id) - CheckNoError(t, resp) + rows, _, err = th.SystemAdminClient.GetAnalyticsOld("", th.BasicTeam.Id) + require.NoError(t, err) for _, row := range rows { if row.Name == "inactive_user_count" { @@ -430,35 +448,36 @@ func TestGetAnalyticsOld(t *testing.T) { } } - rows2, resp2 := th.SystemAdminClient.GetAnalyticsOld("standard", "") - CheckNoError(t, resp2) + rows2, _, err := th.SystemAdminClient.GetAnalyticsOld("standard", "") + require.NoError(t, err) assert.Equal(t, "total_websocket_connections", rows2[5].Name) assert.Equal(t, float64(0), rows2[5].Value) WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) time.Sleep(100 * time.Millisecond) - rows2, resp2 = th.SystemAdminClient.GetAnalyticsOld("standard", "") - CheckNoError(t, resp2) + rows2, _, err = th.SystemAdminClient.GetAnalyticsOld("standard", "") + require.NoError(t, err) assert.Equal(t, "total_websocket_connections", rows2[5].Name) assert.Equal(t, float64(1), rows2[5].Value) WebSocketClient.Close() - rows2, resp2 = th.SystemAdminClient.GetAnalyticsOld("standard", "") - CheckNoError(t, resp2) + rows2, _, err = th.SystemAdminClient.GetAnalyticsOld("standard", "") + require.NoError(t, err) assert.Equal(t, "total_websocket_connections", rows2[5].Name) assert.Equal(t, float64(0), rows2[5].Value) - Client.Logout() - _, resp = Client.GetAnalyticsOld("", th.BasicTeam.Id) + client.Logout() + _, resp, err = client.GetAnalyticsOld("", th.BasicTeam.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestS3TestConnection(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client s3Host := os.Getenv("CI_MINIO_HOST") if s3Host == "" { @@ -485,49 +504,53 @@ func TestS3TestConnection(t *testing.T) { } t.Run("as system user", func(t *testing.T) { - _, resp := Client.TestS3Connection(&config) + resp, err := client.TestS3Connection(&config) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("as system admin", func(t *testing.T) { - _, resp := th.SystemAdminClient.TestS3Connection(&config) + resp, err := th.SystemAdminClient.TestS3Connection(&config) CheckBadRequestStatus(t, resp) - require.Equal(t, resp.Error.Message, "S3 Bucket is required", "should return error - missing s3 bucket") + CheckErrorMessage(t, err, "S3 Bucket is required") // If this fails, check the test configuration to ensure minio is setup with the // `mattermost-test` bucket defined by model.MINIO_BUCKET. *config.FileSettings.AmazonS3Bucket = model.MinioBucket config.FileSettings.AmazonS3PathPrefix = model.NewString("") *config.FileSettings.AmazonS3Region = "us-east-1" - _, resp = th.SystemAdminClient.TestS3Connection(&config) + resp, err = th.SystemAdminClient.TestS3Connection(&config) + require.NoError(t, err) CheckOKStatus(t, resp) config.FileSettings.AmazonS3Region = model.NewString("") - _, resp = th.SystemAdminClient.TestS3Connection(&config) + resp, err = th.SystemAdminClient.TestS3Connection(&config) + require.NoError(t, err) CheckOKStatus(t, resp) config.FileSettings.AmazonS3Bucket = model.NewString("Wrong_bucket") - _, resp = th.SystemAdminClient.TestS3Connection(&config) + resp, err = th.SystemAdminClient.TestS3Connection(&config) CheckInternalErrorStatus(t, resp) - assert.Equal(t, "api.file.test_connection_s3_bucket_does_not_exist.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.file.test_connection_s3_bucket_does_not_exist.app_error") *config.FileSettings.AmazonS3Bucket = "shouldnotcreatenewbucket" - _, resp = th.SystemAdminClient.TestS3Connection(&config) + resp, err = th.SystemAdminClient.TestS3Connection(&config) CheckInternalErrorStatus(t, resp) - assert.Equal(t, "api.file.test_connection_s3_bucket_does_not_exist.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.file.test_connection_s3_bucket_does_not_exist.app_error") }) t.Run("with incorrect credentials", func(t *testing.T) { configCopy := config *configCopy.FileSettings.AmazonS3AccessKeyId = "invalidaccesskey" - _, resp := th.SystemAdminClient.TestS3Connection(&configCopy) + resp, err := th.SystemAdminClient.TestS3Connection(&configCopy) CheckInternalErrorStatus(t, resp) - assert.Equal(t, "api.file.test_connection_s3_auth.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.file.test_connection_s3_auth.app_error") }) t.Run("as restricted system admin", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true }) - _, resp := th.SystemAdminClient.TestS3Connection(&config) + resp, err := th.SystemAdminClient.TestS3Connection(&config) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -535,12 +558,12 @@ func TestS3TestConnection(t *testing.T) { func TestSupportedTimezones(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client supportedTimezonesFromConfig := th.App.Timezones().GetSupported() - supportedTimezones, resp := Client.GetSupportedTimezone() + supportedTimezones, _, err := client.GetSupportedTimezone() - CheckNoError(t, resp) + require.NoError(t, err) assert.Equal(t, supportedTimezonesFromConfig, supportedTimezones) } @@ -558,7 +581,7 @@ func TestRedirectLocation(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client enableLinkPreviews := *th.App.Config().ServiceSettings.EnableLinkPreviews defer func() { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = enableLinkPreviews }) @@ -567,36 +590,38 @@ func TestRedirectLocation(t *testing.T) { *th.App.Config().ServiceSettings.EnableLinkPreviews = true *th.App.Config().ServiceSettings.AllowedUntrustedInternalConnections = "127.0.0.1" - _, resp := th.SystemAdminClient.GetRedirectLocation("https://mattermost.com/", "") - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.GetRedirectLocation("https://mattermost.com/", "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetRedirectLocation("", "") + _, resp, err := th.SystemAdminClient.GetRedirectLocation("", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - actual, resp := th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") - CheckNoError(t, resp) + actual, _, err := th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") + require.NoError(t, err) assert.Equal(t, expected, actual) // Check cached value - actual, resp = th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") - CheckNoError(t, resp) + actual, _, err = th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") + require.NoError(t, err) assert.Equal(t, expected, actual) *th.App.Config().ServiceSettings.EnableLinkPreviews = false - actual, resp = th.SystemAdminClient.GetRedirectLocation("https://mattermost.com/", "") - CheckNoError(t, resp) + actual, _, err = th.SystemAdminClient.GetRedirectLocation("https://mattermost.com/", "") + require.NoError(t, err) assert.Equal(t, actual, "") - actual, resp = th.SystemAdminClient.GetRedirectLocation("", "") - CheckNoError(t, resp) + actual, _, err = th.SystemAdminClient.GetRedirectLocation("", "") + require.NoError(t, err) assert.Equal(t, actual, "") - actual, resp = th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") - CheckNoError(t, resp) + actual, _, err = th.SystemAdminClient.GetRedirectLocation(mockBitlyLink, "") + require.NoError(t, err) assert.Equal(t, actual, "") - Client.Logout() - _, resp = Client.GetRedirectLocation("", "") + client.Logout() + _, resp, err = client.GetRedirectLocation("", "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -607,16 +632,15 @@ func TestSetServerBusy(t *testing.T) { const secs = 30 t.Run("as system user", func(t *testing.T) { - ok, resp := th.Client.SetServerBusy(secs) + resp, err := th.Client.SetServerBusy(secs) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not set server busy due to no permission") require.False(t, th.App.Srv().Busy.IsBusy(), "server should not be marked busy") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - ok, resp := c.SetServerBusy(secs) - CheckNoError(t, resp) - require.True(t, ok, "should set server busy successfully") + _, err := c.SetServerBusy(secs) + require.NoError(t, err) require.True(t, th.App.Srv().Busy.IsBusy(), "server should be marked busy") }, "as system admin") } @@ -628,9 +652,9 @@ func TestSetServerBusyInvalidParam(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { params := []int{-1, 0, MaxServerBusySeconds + 1} for _, p := range params { - ok, resp := c.SetServerBusy(p) + resp, err := c.SetServerBusy(p) + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok, "should not set server busy due to invalid param ", p) require.False(t, th.App.Srv().Busy.IsBusy(), "server should not be marked busy due to invalid param ", p) } }, "as system admin, invalid param") @@ -642,17 +666,16 @@ func TestClearServerBusy(t *testing.T) { th.App.Srv().Busy.Set(time.Second * 30) t.Run("as system user", func(t *testing.T) { - ok, resp := th.Client.ClearServerBusy() + resp, err := th.Client.ClearServerBusy() + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should not clear server busy flag due to no permission.") require.True(t, th.App.Srv().Busy.IsBusy(), "server should be marked busy") }) th.App.Srv().Busy.Set(time.Second * 30) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - ok, resp := c.ClearServerBusy() - CheckNoError(t, resp) - require.True(t, ok, "should clear server busy flag successfully") + _, err := c.ClearServerBusy() + require.NoError(t, err) require.False(t, th.App.Srv().Busy.IsBusy(), "server should not be marked busy") }, "as system admin") } @@ -664,14 +687,15 @@ func TestGetServerBusy(t *testing.T) { th.App.Srv().Busy.Set(time.Second * 30) t.Run("as system user", func(t *testing.T) { - _, resp := th.Client.GetServerBusy() + _, resp, err := th.Client.GetServerBusy() + require.Error(t, err) CheckForbiddenStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - sbs, resp := c.GetServerBusy() + sbs, _, err := c.GetServerBusy() expires := time.Unix(sbs.Expires, 0) - CheckNoError(t, resp) + require.NoError(t, err) require.Greater(t, expires.Unix(), time.Now().Unix()) }, "as system admin") } @@ -684,25 +708,29 @@ func TestServerBusy503(t *testing.T) { t.Run("search users while busy", func(t *testing.T) { us := &model.UserSearch{Term: "test"} - _, resp := th.SystemAdminClient.SearchUsers(us) + _, resp, err := th.SystemAdminClient.SearchUsers(us) + require.Error(t, err) CheckServiceUnavailableStatus(t, resp) }) t.Run("search teams while busy", func(t *testing.T) { ts := &model.TeamSearch{} - _, resp := th.SystemAdminClient.SearchTeams(ts) + _, resp, err := th.SystemAdminClient.SearchTeams(ts) + require.Error(t, err) CheckServiceUnavailableStatus(t, resp) }) t.Run("search channels while busy", func(t *testing.T) { cs := &model.ChannelSearch{} - _, resp := th.SystemAdminClient.SearchChannels("foo", cs) + _, resp, err := th.SystemAdminClient.SearchChannels("foo", cs) + require.Error(t, err) CheckServiceUnavailableStatus(t, resp) }) t.Run("search archived channels while busy", func(t *testing.T) { cs := &model.ChannelSearch{} - _, resp := th.SystemAdminClient.SearchArchivedChannels("foo", cs) + _, resp, err := th.SystemAdminClient.SearchArchivedChannels("foo", cs) + require.Error(t, err) CheckServiceUnavailableStatus(t, resp) }) @@ -710,8 +738,8 @@ func TestServerBusy503(t *testing.T) { t.Run("search users while not busy", func(t *testing.T) { us := &model.UserSearch{Term: "test"} - _, resp := th.SystemAdminClient.SearchUsers(us) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.SearchUsers(us) + require.NoError(t, err) }) } diff --git a/api4/team_test.go b/api4/team_test.go index 1aaf9e84b7..181358145e 100644 --- a/api4/team_test.go +++ b/api4/team_test.go @@ -28,8 +28,8 @@ func TestCreateTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { team := &model.Team{Name: GenerateTestUsername(), DisplayName: "Some Team", Type: model.TeamOpen} - rteam, resp := client.CreateTeam(team) - CheckNoError(t, resp) + rteam, resp, err := client.CreateTeam(team) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, rteam.Name, team.Name, "names did not match") @@ -38,28 +38,29 @@ func TestCreateTeam(t *testing.T) { require.Equal(t, rteam.Type, team.Type, "types did not match") - _, resp = client.CreateTeam(rteam) + _, resp, err = client.CreateTeam(rteam) + require.Error(t, err) CheckBadRequestStatus(t, resp) rteam.Id = "" - _, resp = client.CreateTeam(rteam) - CheckErrorMessage(t, resp, "app.team.save.existing.app_error") + _, resp, err = client.CreateTeam(rteam) + CheckErrorID(t, err, "app.team.save.existing.app_error") CheckBadRequestStatus(t, resp) rteam.Name = "" - _, resp = client.CreateTeam(rteam) - CheckErrorMessage(t, resp, "model.team.is_valid.characters.app_error") + _, resp, err = client.CreateTeam(rteam) + CheckErrorID(t, err, "model.team.is_valid.characters.app_error") CheckBadRequestStatus(t, resp) r, err := client.DoApiPost("/teams", "garbage") - require.NotNil(t, err, "should have errored") + require.Error(t, err, "should have errored") require.Equalf(t, r.StatusCode, http.StatusBadRequest, "wrong status code, actual: %s, expected: %s", strconv.Itoa(r.StatusCode), strconv.Itoa(http.StatusBadRequest)) // Test GroupConstrained flag groupConstrainedTeam := &model.Team{Name: GenerateTestUsername(), DisplayName: "Some Team", Type: model.TeamOpen, GroupConstrained: model.NewBool(true)} - rteam, resp = client.CreateTeam(groupConstrainedTeam) - CheckNoError(t, resp) + rteam, resp, err = client.CreateTeam(groupConstrainedTeam) + require.NoError(t, err) CheckCreatedStatus(t, resp) assert.Equal(t, *rteam.GroupConstrained, *groupConstrainedTeam.GroupConstrained, "GroupConstrained flags do not match") @@ -68,7 +69,8 @@ func TestCreateTeam(t *testing.T) { th.Client.Logout() team := &model.Team{Name: GenerateTestUsername(), DisplayName: "Some Team", Type: model.TeamOpen} - _, resp := th.Client.CreateTeam(team) + _, resp, err := th.Client.CreateTeam(team) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() @@ -82,7 +84,8 @@ func TestCreateTeam(t *testing.T) { th.RemovePermissionFromRole(model.PermissionCreateTeam.Id, model.SystemUserRoleId) th.AddPermissionToRole(model.PermissionCreateTeam.Id, model.SystemAdminRoleId) - _, resp = th.Client.CreateTeam(team) + _, resp, err = th.Client.CreateTeam(team) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -101,8 +104,8 @@ func TestCreateTeamSanitization(t *testing.T) { AllowedDomains: "simulator.amazonses.com,localhost", } - rteam, resp := th.Client.CreateTeam(team) - CheckNoError(t, resp) + rteam, _, err := th.Client.CreateTeam(team) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") }) @@ -116,8 +119,8 @@ func TestCreateTeamSanitization(t *testing.T) { AllowedDomains: "simulator.amazonses.com,localhost", } - rteam, resp := client.CreateTeam(team) - CheckNoError(t, resp) + rteam, _, err := client.CreateTeam(team) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") }, "system admin") @@ -126,49 +129,55 @@ func TestCreateTeamSanitization(t *testing.T) { func TestGetTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rteam, resp := client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeam(team.Id, "") + require.NoError(t, err) require.Equal(t, rteam.Id, team.Id, "wrong team") - _, resp = client.GetTeam("junk", "") + _, resp, err := client.GetTeam("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetTeam("", "") + _, resp, err = client.GetTeam("", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = client.GetTeam(model.NewId(), "") + _, resp, err = client.GetTeam(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) th.LoginTeamAdmin() team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: false} - rteam2, _ := Client.CreateTeam(team2) + rteam2, _, _ := client.CreateTeam(team2) team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamInvite, AllowOpenInvite: true} - rteam3, _ := Client.CreateTeam(team3) + rteam3, _, _ := client.CreateTeam(team3) th.LoginBasic() // AllowInviteOpen is false and team is open, and user is not on team - _, resp := Client.GetTeam(rteam2.Id, "") + _, resp, err := client.GetTeam(rteam2.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) // AllowInviteOpen is true and team is invite, and user is not on team - _, resp = Client.GetTeam(rteam3.Id, "") + _, resp, err = client.GetTeam(rteam3.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeam(team.Id, "") + client.Logout() + _, resp, err = client.GetTeam(team.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.GetTeam(rteam2.Id, "") - CheckNoError(t, resp) + _, _, err = client.GetTeam(rteam2.Id, "") + require.NoError(t, err) }) } @@ -176,14 +185,14 @@ func TestGetTeamSanitization(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) t.Run("team user", func(t *testing.T) { th.LinkUserToTeam(th.BasicUser2, team) @@ -191,8 +200,8 @@ func TestGetTeamSanitization(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteam, resp := client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeam(team.Id, "") + require.NoError(t, err) require.Empty(t, rteam.Email, "should have sanitized email") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") @@ -205,24 +214,24 @@ func TestGetTeamSanitization(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteam, resp := client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeam(team.Id, "") + require.NoError(t, err) require.Empty(t, rteam.Email, "should have sanitized email") require.Empty(t, rteam.InviteId, "should have sanitized inviteid") }) t.Run("team admin", func(t *testing.T) { - rteam, resp := th.Client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := th.Client.GetTeam(team.Id, "") + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rteam, resp := client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeam(team.Id, "") + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") @@ -232,30 +241,35 @@ func TestGetTeamSanitization(t *testing.T) { func TestGetTeamUnread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - teamUnread, resp := Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) - CheckNoError(t, resp) + teamUnread, _, err := client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) + require.NoError(t, err) require.Equal(t, teamUnread.TeamId, th.BasicTeam.Id, "wrong team id returned for regular user call") - _, resp = Client.GetTeamUnread("junk", th.BasicUser.Id) + _, resp, err := client.GetTeamUnread("junk", th.BasicUser.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamUnread(th.BasicTeam.Id, "junk") + _, resp, err = client.GetTeamUnread(th.BasicTeam.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamUnread(model.NewId(), th.BasicUser.Id) + _, resp, err = client.GetTeamUnread(model.NewId(), th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetTeamUnread(th.BasicTeam.Id, model.NewId()) + _, resp, err = client.GetTeamUnread(th.BasicTeam.Id, model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) + client.Logout() + _, resp, err = client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - teamUnread, resp = th.SystemAdminClient.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) - CheckNoError(t, resp) + teamUnread, _, err = th.SystemAdminClient.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) + require.NoError(t, err) require.Equal(t, teamUnread.TeamId, th.BasicTeam.Id, "wrong team id returned") } @@ -265,26 +279,25 @@ func TestUpdateTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { team := &model.Team{DisplayName: "Name", Description: "Some description", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - var resp *model.Response - team, resp = th.Client.CreateTeam(team) - CheckNoError(t, resp) + team, _, err := th.Client.CreateTeam(team) + require.NoError(t, err) team.Description = "updated description" - uteam, resp := client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err := client.UpdateTeam(team) + require.NoError(t, err) require.Equal(t, uteam.Description, "updated description", "Update failed") team.DisplayName = "Updated Name" - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.Equal(t, uteam.DisplayName, "Updated Name", "Update failed") // Test GroupConstrained flag team.GroupConstrained = model.NewBool(true) - rteam, resp := client.UpdateTeam(team) - CheckNoError(t, resp) + rteam, resp, err := client.UpdateTeam(team) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, *rteam.GroupConstrained, *team.GroupConstrained, "GroupConstrained flags do not match") @@ -292,68 +305,70 @@ func TestUpdateTeam(t *testing.T) { team.GroupConstrained = nil team.AllowOpenInvite = true - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.True(t, uteam.AllowOpenInvite, "Update failed") team.InviteId = "inviteid1" - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.NotEqual(t, uteam.InviteId, "inviteid1", "InviteID should not be updated") team.AllowedDomains = "domain" - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.Equal(t, uteam.AllowedDomains, "domain", "Update failed") team.Name = "Updated name" - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.NotEqual(t, uteam.Name, "Updated name", "Should not update name") team.Email = "test@domain.com" - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.NotEqual(t, uteam.Email, "test@domain.com", "Should not update email") team.Type = model.TeamInvite - uteam, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err = client.UpdateTeam(team) + require.NoError(t, err) require.NotEqual(t, uteam.Type, model.TeamInvite, "Should not update type") originalTeamId := team.Id team.Id = model.NewId() - r, _ := client.DoApiPut(client.GetTeamRoute(originalTeamId), team.ToJson()) + r, err := th.Client.DoApiPut(client.GetTeamRoute(originalTeamId), team.ToJson()) + assert.Error(t, err) assert.Equal(t, http.StatusBadRequest, r.StatusCode) require.Equal(t, uteam.Id, originalTeamId, "wrong team id") team.Id = "fake" - _, resp = client.UpdateTeam(team) + _, resp, err = client.UpdateTeam(team) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.Client.Logout() // for non-local clients - _, resp = th.Client.UpdateTeam(team) + _, resp, err = th.Client.UpdateTeam(team) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { team := &model.Team{DisplayName: "New", Description: "Some description", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - var resp *model.Response - team, resp = client.CreateTeam(team) - CheckNoError(t, resp) + team, _, err := client.CreateTeam(team) + require.NoError(t, err) team.Name = "new-name" - _, resp = client.UpdateTeam(team) - CheckNoError(t, resp) + _, _, err = client.UpdateTeam(team) + require.NoError(t, err) }) } @@ -361,28 +376,28 @@ func TestUpdateTeamSanitization(t *testing.T) { th := Setup(t) defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) // Non-admin users cannot update the team t.Run("team admin", func(t *testing.T) { - rteam, resp := th.Client.UpdateTeam(team) - CheckNoError(t, resp) + rteam, _, err := th.Client.UpdateTeam(team) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email for admin") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") }) t.Run("system admin", func(t *testing.T) { - rteam, resp := th.SystemAdminClient.UpdateTeam(team) - CheckNoError(t, resp) + rteam, _, err := th.SystemAdminClient.UpdateTeam(team) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email for admin") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") @@ -394,7 +409,7 @@ func TestPatchTeam(t *testing.T) { defer th.TearDown() team := &model.Team{DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team, _ = th.Client.CreateTeam(team) + team, _, _ = th.Client.CreateTeam(team) patch := &model.TeamPatch{} patch.DisplayName = model.NewString("Other name") @@ -402,21 +417,24 @@ func TestPatchTeam(t *testing.T) { patch.CompanyName = model.NewString("Other company name") patch.AllowOpenInvite = model.NewBool(true) - _, resp := th.Client.PatchTeam(GenerateTestId(), patch) + _, resp, err := th.Client.PatchTeam(GenerateTestId(), patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.PatchTeam(team.Id, patch) + _, resp, err = th.Client.PatchTeam(team.Id, patch) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic2() - _, resp = th.Client.PatchTeam(team.Id, patch) + _, resp, err = th.Client.PatchTeam(team.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rteam, resp := client.PatchTeam(team.Id, patch) - CheckNoError(t, resp) + rteam, _, err2 := client.PatchTeam(team.Id, patch) + require.NoError(t, err2) require.Equal(t, rteam.DisplayName, "Other name", "DisplayName did not update properly") require.Equal(t, rteam.Description, "Other description", "Description did not update properly") @@ -426,14 +444,14 @@ func TestPatchTeam(t *testing.T) { t.Run("Changing AllowOpenInvite to false regenerates InviteID", func(t *testing.T) { team2 := &model.Team{DisplayName: "Name2", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: true, InviteId: model.NewId(), Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team2, _ = client.CreateTeam(team2) + team2, _, _ = client.CreateTeam(team2) patch2 := &model.TeamPatch{ AllowOpenInvite: model.NewBool(false), } - rteam2, resp2 := client.PatchTeam(team2.Id, patch2) - CheckNoError(t, resp2) + rteam2, _, err3 := client.PatchTeam(team2.Id, patch2) + require.NoError(t, err3) require.Equal(t, team2.Id, rteam2.Id) require.False(t, rteam2.AllowOpenInvite) require.NotEqual(t, team2.InviteId, rteam2.InviteId) @@ -441,14 +459,14 @@ func TestPatchTeam(t *testing.T) { t.Run("Changing AllowOpenInvite to true doesn't regenerate InviteID", func(t *testing.T) { team2 := &model.Team{DisplayName: "Name3", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: model.NewId(), Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team2, _ = client.CreateTeam(team2) + team2, _, _ = client.CreateTeam(team2) patch2 := &model.TeamPatch{ AllowOpenInvite: model.NewBool(true), } - rteam2, resp2 := client.PatchTeam(team2.Id, patch2) - CheckNoError(t, resp2) + rteam2, _, err3 := client.PatchTeam(team2.Id, patch2) + require.NoError(t, err3) require.Equal(t, team2.Id, rteam2.Id) require.True(t, rteam2.AllowOpenInvite) require.Equal(t, team2.InviteId, rteam2.InviteId) @@ -456,30 +474,31 @@ func TestPatchTeam(t *testing.T) { // Test GroupConstrained flag patch.GroupConstrained = model.NewBool(true) - rteam, resp = client.PatchTeam(team.Id, patch) - CheckNoError(t, resp) + rteam, resp, err2 := client.PatchTeam(team.Id, patch) + require.NoError(t, err2) CheckOKStatus(t, resp) require.Equal(t, *rteam.GroupConstrained, *patch.GroupConstrained, "GroupConstrained flags do not match") patch.GroupConstrained = nil - _, resp = client.PatchTeam("junk", patch) + _, resp, err = client.PatchTeam("junk", patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) - r, err := client.DoApiPut("/teams/"+team.Id+"/patch", "garbage") - require.NotNil(t, err, "should have errored") + r, err2 := client.DoApiPut("/teams/"+team.Id+"/patch", "garbage") + require.Error(t, err2, "should have errored") require.Equalf(t, r.StatusCode, http.StatusBadRequest, "wrong status code, actual: %s, expected: %s", strconv.Itoa(r.StatusCode), strconv.Itoa(http.StatusBadRequest)) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.PatchTeam(th.BasicTeam.Id, patch) - CheckNoError(t, resp) + _, _, err = client.PatchTeam(th.BasicTeam.Id, patch) + require.NoError(t, err) }) } func TestRestoreTeam(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client createTeam := func(t *testing.T, deleted bool, teamType string) *model.Team { t.Helper() @@ -493,10 +512,11 @@ func TestRestoreTeam(t *testing.T) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: teamType, } - team, _ = Client.CreateTeam(team) + team, _, _ = client.CreateTeam(team) require.NotNil(t, team) if deleted { - _, resp := th.SystemAdminClient.SoftDeleteTeam(team.Id) + resp, err := th.SystemAdminClient.SoftDeleteTeam(team.Id) + require.NoError(t, err) CheckOKStatus(t, resp) } return team @@ -504,13 +524,15 @@ func TestRestoreTeam(t *testing.T) { teamPublic := createTeam(t, true, model.TeamOpen) t.Run("invalid team", func(t *testing.T) { - _, resp := Client.RestoreTeam(model.NewId()) + _, resp, err := client.RestoreTeam(model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { team := createTeam(t, true, model.TeamOpen) - team, resp := client.RestoreTeam(team.Id) + team, resp, err := client.RestoreTeam(team.Id) + require.NoError(t, err) CheckOKStatus(t, resp) require.Zero(t, team.DeleteAt) require.Equal(t, model.TeamOpen, team.Type) @@ -518,7 +540,8 @@ func TestRestoreTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { team := createTeam(t, true, model.TeamInvite) - team, resp := client.RestoreTeam(team.Id) + team, resp, err := client.RestoreTeam(team.Id) + require.NoError(t, err) CheckOKStatus(t, resp) require.Zero(t, team.DeleteAt) require.Equal(t, model.TeamInvite, team.Type) @@ -526,26 +549,30 @@ func TestRestoreTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { team := createTeam(t, false, model.TeamOpen) - team, resp := client.RestoreTeam(team.Id) + team, resp, err := client.RestoreTeam(team.Id) + require.NoError(t, err) CheckOKStatus(t, resp) require.Zero(t, team.DeleteAt) require.Equal(t, model.TeamOpen, team.Type) }, "restore active public team") t.Run("not logged in", func(t *testing.T) { - Client.Logout() - _, resp := Client.RestoreTeam(teamPublic.Id) + client.Logout() + _, resp, err := client.RestoreTeam(teamPublic.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("no permission to manage team", func(t *testing.T) { th.LoginBasic2() - _, resp := Client.RestoreTeam(teamPublic.Id) + _, resp, err := client.RestoreTeam(teamPublic.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.RestoreTeam(teamPublic.Id) + _, resp, err := client.RestoreTeam(teamPublic.Id) + require.NoError(t, err) CheckOKStatus(t, resp) }) } @@ -554,28 +581,28 @@ func TestPatchTeamSanitization(t *testing.T) { th := Setup(t) defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) // Non-admin users cannot update the team t.Run("team admin", func(t *testing.T) { - rteam, resp := th.Client.PatchTeam(team.Id, &model.TeamPatch{}) - CheckNoError(t, resp) + rteam, _, err := th.Client.PatchTeam(team.Id, &model.TeamPatch{}) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email for admin") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") }) t.Run("system admin", func(t *testing.T) { - rteam, resp := th.SystemAdminClient.PatchTeam(team.Id, &model.TeamPatch{}) - CheckNoError(t, resp) + rteam, _, err := th.SystemAdminClient.PatchTeam(team.Id, &model.TeamPatch{}) + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email for admin") require.NotEmpty(t, rteam.InviteId, "should not have sanitized inviteid") @@ -585,7 +612,7 @@ func TestPatchTeamSanitization(t *testing.T) { func TestUpdateTeamPrivacy(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client createTeam := func(teamType string, allowOpenInvite bool) *model.Team { team := &model.Team{ @@ -598,7 +625,7 @@ func TestUpdateTeamPrivacy(t *testing.T) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: teamType, } - team, _ = Client.CreateTeam(team) + team, _, _ = client.CreateTeam(team) return team } @@ -628,12 +655,12 @@ func TestUpdateTeamPrivacy(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - team, resp := client.UpdateTeamPrivacy(test.team.Id, test.privacy) + team, resp, err := client.UpdateTeamPrivacy(test.team.Id, test.privacy) if test.errChecker != nil { test.errChecker(t, resp) return } - CheckNoError(t, resp) + require.NoError(t, err) CheckOKStatus(t, resp) require.Equal(t, test.wantType, team.Type) require.Equal(t, test.wantOpenInvite, team.AllowOpenInvite) @@ -647,24 +674,28 @@ func TestUpdateTeamPrivacy(t *testing.T) { } t.Run("non-existent team", func(t *testing.T) { - _, resp := Client.UpdateTeamPrivacy(model.NewId(), model.TeamInvite) + _, resp, err := client.UpdateTeamPrivacy(model.NewId(), model.TeamInvite) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.UpdateTeamPrivacy(model.NewId(), model.TeamInvite) + _, resp, err := client.UpdateTeamPrivacy(model.NewId(), model.TeamInvite) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "non-existent team for admins") t.Run("not logged in", func(t *testing.T) { - Client.Logout() - _, resp := Client.UpdateTeamPrivacy(teamPublic.Id, model.TeamInvite) + client.Logout() + _, resp, err := client.UpdateTeamPrivacy(teamPublic.Id, model.TeamInvite) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("no permission to manage team", func(t *testing.T) { th.LoginBasic2() - _, resp := Client.UpdateTeamPrivacy(teamPublic.Id, model.TeamInvite) + _, resp, err := client.UpdateTeamPrivacy(teamPublic.Id, model.TeamInvite) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -672,7 +703,7 @@ func TestUpdateTeamPrivacy(t *testing.T) { func TestTeamUnicodeNames(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client t.Run("create team unicode", func(t *testing.T) { team := &model.Team{ @@ -681,8 +712,8 @@ func TestTeamUnicodeNames(t *testing.T) { Description: "A \ufffatest\ufffb channel.", CompanyName: "\ufeffAcme Inc\ufffc", Type: model.TeamOpen} - rteam, resp := Client.CreateTeam(team) - CheckNoError(t, resp) + rteam, resp, err := client.CreateTeam(team) + require.NoError(t, err) CheckCreatedStatus(t, resp) require.Equal(t, "Some Team", rteam.DisplayName, "bad unicode should be filtered from display name") @@ -698,13 +729,13 @@ func TestTeamUnicodeNames(t *testing.T) { Name: model.NewRandomTeamName(), Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team, _ = Client.CreateTeam(team) + team, _, _ = client.CreateTeam(team) team.DisplayName = "\u206eThe Team\u206f" team.Description = "A \u17a3great\u17d3 team." team.CompanyName = "\u206aAcme Inc" - uteam, resp := Client.UpdateTeam(team) - CheckNoError(t, resp) + uteam, _, err := client.UpdateTeam(team) + require.NoError(t, err) require.Equal(t, "The Team", uteam.DisplayName, "bad unicode should be filtered from display name") require.Equal(t, "A great team.", uteam.Description, "bad unicode should be filtered from description") @@ -719,7 +750,7 @@ func TestTeamUnicodeNames(t *testing.T) { Name: model.NewRandomTeamName(), Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team, _ = Client.CreateTeam(team) + team, _, _ = client.CreateTeam(team) patch := &model.TeamPatch{} @@ -727,8 +758,8 @@ func TestTeamUnicodeNames(t *testing.T) { patch.Description = model.NewString("\ufffaGreat team.") patch.CompanyName = model.NewString("\u202bAcme Inc\u202c") - rteam, resp := Client.PatchTeam(team.Id, patch) - CheckNoError(t, resp) + rteam, _, err := client.PatchTeam(team.Id, patch) + require.NoError(t, err) require.Equal(t, "Goat Team", rteam.DisplayName, "bad unicode should be filtered from display name") require.Equal(t, "Great team.", rteam.Description, "bad unicode should be filtered from description") @@ -739,16 +770,16 @@ func TestTeamUnicodeNames(t *testing.T) { func TestRegenerateTeamInviteId(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client team := &model.Team{DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen} - team, _ = Client.CreateTeam(team) + team, _, _ = client.CreateTeam(team) assert.NotEqual(t, team.InviteId, "") assert.NotEqual(t, team.InviteId, "inviteid0") - rteam, resp := Client.RegenerateTeamInviteId(team.Id) - CheckNoError(t, resp) + rteam, _, err := client.RegenerateTeamInviteId(team.Id) + require.NoError(t, err) assert.NotEqual(t, team.InviteId, rteam.InviteId) assert.NotEqual(t, team.InviteId, "") @@ -758,36 +789,35 @@ func TestSoftDeleteTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.SoftDeleteTeam(th.BasicTeam.Id) + resp, err := th.Client.SoftDeleteTeam(th.BasicTeam.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.SoftDeleteTeam(th.BasicTeam.Id) + resp, err = th.Client.SoftDeleteTeam(th.BasicTeam.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen} - team, _ = th.Client.CreateTeam(team) + team, _, _ = th.Client.CreateTeam(team) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - ok, resp := client.SoftDeleteTeam(team.Id) - CheckNoError(t, resp) + _, err2 := client.SoftDeleteTeam(team.Id) + require.NoError(t, err2) - require.True(t, ok, "should have returned true") - - rteam, err := th.App.GetTeam(team.Id) - require.Nil(t, err, "should have returned archived team") + rteam, appErr := th.App.GetTeam(team.Id) + require.Nil(t, appErr, "should have returned archived team") require.NotEqual(t, rteam.DeleteAt, 0, "should have not set to zero") - ok, resp = client.SoftDeleteTeam("junk") + resp, err2 = client.SoftDeleteTeam("junk") + require.Error(t, err2) CheckBadRequestStatus(t, resp) - - require.False(t, ok, "should have returned false") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.SoftDeleteTeam(th.BasicTeam.Id) - CheckNoError(t, resp) + _, err = client.SoftDeleteTeam(th.BasicTeam.Id) + require.NoError(t, err) }) } @@ -803,22 +833,23 @@ func TestPermanentDeleteTeam(t *testing.T) { t.Run("Permanent deletion not available through API if EnableAPITeamDeletion is not set", func(t *testing.T) { team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen} - team, _ = th.Client.CreateTeam(team) + team, _, _ = th.Client.CreateTeam(team) - _, resp := th.Client.PermanentDeleteTeam(team.Id) + resp, err := th.Client.PermanentDeleteTeam(team.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.PermanentDeleteTeam(team.Id) + resp, err = th.SystemAdminClient.PermanentDeleteTeam(team.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("Permanent deletion available through local mode even if EnableAPITeamDeletion is not set", func(t *testing.T) { team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen} - team, _ = th.Client.CreateTeam(team) + team, _, _ = th.Client.CreateTeam(team) - ok, resp := th.LocalClient.PermanentDeleteTeam(team.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err := th.LocalClient.PermanentDeleteTeam(team.Id) + require.NoError(t, err) }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { @@ -828,41 +859,39 @@ func TestPermanentDeleteTeam(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPITeamDeletion = true }) team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen} - team, _ = client.CreateTeam(team) - ok, resp := client.PermanentDeleteTeam(team.Id) - CheckNoError(t, resp) - assert.True(t, ok) + team, _, _ = client.CreateTeam(team) + _, err := client.PermanentDeleteTeam(team.Id) + require.NoError(t, err) - _, err := th.App.GetTeam(team.Id) - assert.NotNil(t, err) + _, appErr := th.App.GetTeam(team.Id) + assert.NotNil(t, appErr) - ok, resp = client.PermanentDeleteTeam("junk") + resp, err := client.PermanentDeleteTeam("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - - require.False(t, ok, "should have returned false") }, "Permanent deletion with EnableAPITeamDeletion set") } func TestGetAllTeams(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team1 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: true} - team1, resp := Client.CreateTeam(team1) - CheckNoError(t, resp) + team1, _, err := client.CreateTeam(team1) + require.NoError(t, err) team2 := &model.Team{DisplayName: "Name2", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: true} - team2, resp = Client.CreateTeam(team2) - CheckNoError(t, resp) + team2, _, err = client.CreateTeam(team2) + require.NoError(t, err) team3 := &model.Team{DisplayName: "Name3", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: false} - team3, resp = Client.CreateTeam(team3) - CheckNoError(t, resp) + team3, _, err = client.CreateTeam(team3) + require.NoError(t, err) team4 := &model.Team{DisplayName: "Name4", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: false} - team4, resp = Client.CreateTeam(team4) - CheckNoError(t, resp) + team4, _, err = client.CreateTeam(team4) + require.NoError(t, err) testCases := []struct { Name string @@ -982,17 +1011,19 @@ func TestGetAllTeams(t *testing.T) { var teams []*model.Team var count int64 + var resp *model.Response + var err2 error if tc.WithCount { - teams, count, resp = Client.GetAllTeamsWithTotalCount("", tc.Page, tc.PerPage) + teams, count, resp, err2 = client.GetAllTeamsWithTotalCount("", tc.Page, tc.PerPage) } else { - teams, resp = Client.GetAllTeams("", tc.Page, tc.PerPage) + teams, resp, err2 = client.GetAllTeams("", tc.Page, tc.PerPage) } if tc.ExpectedError { - CheckErrorMessage(t, resp, tc.ErrorId) - checkHTTPStatus(t, resp, tc.ExpectedStatusCode, true) + CheckErrorID(t, err2, tc.ErrorId) + checkHTTPStatus(t, resp, tc.ExpectedStatusCode) return } - CheckNoError(t, resp) + require.NoError(t, err2) require.Equal(t, len(tc.ExpectedTeams), len(teams)) for idx, team := range teams { assert.Equal(t, tc.ExpectedTeams[idx], team.Id) @@ -1002,20 +1033,23 @@ func TestGetAllTeams(t *testing.T) { } t.Run("Local mode", func(t *testing.T) { - teams, res := th.LocalClient.GetAllTeams("", 0, 10) - CheckNoError(t, res) + teams, _, err2 := th.LocalClient.GetAllTeams("", 0, 10) + require.NoError(t, err2) require.Len(t, teams, 5) }) // Choose a team which the system manager can access - sysManagerTeams, resp := th.SystemManagerClient.GetAllTeams("", 0, 10000) + sysManagerTeams, resp, err := th.SystemManagerClient.GetAllTeams("", 0, 10000) + require.NoError(t, err) CheckOKStatus(t, resp) policyTeam := sysManagerTeams[0] // If no policies exist, GetAllTeamsExcludePolicyConstrained should return everything t.Run("exclude policy constrained, without policy", func(t *testing.T) { - _, excludeConstrainedResp := Client.GetAllTeamsExcludePolicyConstrained("", 0, 100) + _, excludeConstrainedResp, err2 := client.GetAllTeamsExcludePolicyConstrained("", 0, 100) + require.Error(t, err2) CheckForbiddenStatus(t, excludeConstrainedResp) - teams, excludeConstrainedResp := th.SystemAdminClient.GetAllTeamsExcludePolicyConstrained("", 0, 100) + teams, excludeConstrainedResp, err2 := th.SystemAdminClient.GetAllTeamsExcludePolicyConstrained("", 0, 100) + require.NoError(t, err2) CheckOKStatus(t, excludeConstrainedResp) found := false for _, team := range teams { @@ -1037,7 +1071,8 @@ func TestGetAllTeams(t *testing.T) { require.NoError(t, savePolicyErr) // This time, the team shouldn't be returned t.Run("exclude policy constrained, with policy", func(t *testing.T) { - teams, excludeConstrainedResp := th.SystemAdminClient.GetAllTeamsExcludePolicyConstrained("", 0, 100) + teams, excludeConstrainedResp, err2 := th.SystemAdminClient.GetAllTeamsExcludePolicyConstrained("", 0, 100) + require.NoError(t, err2) CheckOKStatus(t, excludeConstrainedResp) found := false for _, team := range teams { @@ -1050,7 +1085,8 @@ func TestGetAllTeams(t *testing.T) { }) t.Run("does not return policy ID", func(t *testing.T) { - teams, sysManagerResp := th.SystemManagerClient.GetAllTeams("", 0, 100) + teams, sysManagerResp, err2 := th.SystemManagerClient.GetAllTeams("", 0, 100) + require.NoError(t, err2) CheckOKStatus(t, sysManagerResp) found := false for _, team := range teams { @@ -1064,7 +1100,8 @@ func TestGetAllTeams(t *testing.T) { }) t.Run("returns policy ID", func(t *testing.T) { - teams, sysAdminResp := th.SystemAdminClient.GetAllTeams("", 0, 100) + teams, sysAdminResp, err2 := th.SystemAdminClient.GetAllTeams("", 0, 100) + require.NoError(t, err2) CheckOKStatus(t, sysAdminResp) found := false for _, team := range teams { @@ -1078,8 +1115,9 @@ func TestGetAllTeams(t *testing.T) { }) t.Run("Unauthorized", func(t *testing.T) { - Client.Logout() - _, resp = Client.GetAllTeams("", 1, 10) + client.Logout() + _, resp, err = client.GetAllTeams("", 1, 10) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -1088,7 +1126,7 @@ func TestGetAllTeamsSanitization(t *testing.T) { th := Setup(t) defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), @@ -1096,8 +1134,8 @@ func TestGetAllTeamsSanitization(t *testing.T) { AllowedDomains: "simulator.amazonses.com,localhost", AllowOpenInvite: true, }) - CheckNoError(t, resp) - team2, resp := th.SystemAdminClient.CreateTeam(&model.Team{ + require.NoError(t, err) + team2, _, err := th.SystemAdminClient.CreateTeam(&model.Team{ DisplayName: t.Name() + "_2", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), @@ -1105,7 +1143,7 @@ func TestGetAllTeamsSanitization(t *testing.T) { AllowedDomains: "simulator.amazonses.com,localhost", AllowOpenInvite: true, }) - CheckNoError(t, resp) + require.NoError(t, err) // This may not work if the server has over 1000 open teams on it @@ -1113,8 +1151,8 @@ func TestGetAllTeamsSanitization(t *testing.T) { teamFound := false team2Found := false - rteams, resp := th.Client.GetAllTeams("", 0, 1000) - CheckNoError(t, resp) + rteams, _, err := th.Client.GetAllTeams("", 0, 1000) + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id == team.Id { teamFound = true @@ -1132,8 +1170,8 @@ func TestGetAllTeamsSanitization(t *testing.T) { }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rteams, resp := client.GetAllTeams("", 0, 1000) - CheckNoError(t, resp) + rteams, _, err := client.GetAllTeams("", 0, 1000) + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id != team.Id && rteam.Id != team2.Id { continue @@ -1151,46 +1189,51 @@ func TestGetTeamByName(t *testing.T) { team := th.BasicTeam th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rteam, resp := client.GetTeamByName(team.Name, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeamByName(team.Name, "") + require.NoError(t, err) require.Equal(t, rteam.Name, team.Name, "wrong team") - _, resp = client.GetTeamByName("junk", "") + _, resp, err := client.GetTeamByName("junk", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = client.GetTeamByName("", "") + _, resp, err = client.GetTeamByName("", "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.GetTeamByName(strings.ToUpper(team.Name), "") - CheckNoError(t, resp) + _, _, err := client.GetTeamByName(strings.ToUpper(team.Name), "") + require.NoError(t, err) }) th.Client.Logout() - _, resp := th.Client.GetTeamByName(team.Name, "") + _, resp, err := th.Client.GetTeamByName(team.Name, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamByName(team.Name, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamByName(team.Name, "") + require.NoError(t, err) th.LoginTeamAdmin() team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowOpenInvite: false} - rteam2, _ := th.Client.CreateTeam(team2) + rteam2, _, _ := th.Client.CreateTeam(team2) team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamInvite, AllowOpenInvite: true} - rteam3, _ := th.Client.CreateTeam(team3) + rteam3, _, _ := th.Client.CreateTeam(team3) th.LoginBasic() // AllowInviteOpen is false and team is open, and user is not on team - _, resp = th.Client.GetTeamByName(rteam2.Name, "") + _, resp, err = th.Client.GetTeamByName(rteam2.Name, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) // AllowInviteOpen is true and team is invite only, and user is not on team - _, resp = th.Client.GetTeamByName(rteam3.Name, "") + _, resp, err = th.Client.GetTeamByName(rteam3.Name, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -1198,14 +1241,14 @@ func TestGetTeamByNameSanitization(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) t.Run("team user", func(t *testing.T) { th.LinkUserToTeam(th.BasicUser2, team) @@ -1213,8 +1256,8 @@ func TestGetTeamByNameSanitization(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteam, resp := client.GetTeamByName(team.Name, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeamByName(team.Name, "") + require.NoError(t, err) require.Empty(t, rteam.Email, "should've sanitized email") require.NotEmpty(t, rteam.InviteId, "should have not sanitized inviteid") @@ -1228,24 +1271,24 @@ func TestGetTeamByNameSanitization(t *testing.T) { th.LoginBasic2WithClient(client) - rteam, resp := client.GetTeam(team.Id, "") - CheckNoError(t, resp) + rteam, _, err := client.GetTeam(team.Id, "") + require.NoError(t, err) require.Empty(t, rteam.Email, "should have sanitized email") require.Empty(t, rteam.InviteId, "should have sanitized inviteid") }) t.Run("team admin/non-admin", func(t *testing.T) { - rteam, resp := th.Client.GetTeamByName(team.Name, "") - CheckNoError(t, resp) + rteam, _, err := th.Client.GetTeamByName(team.Name, "") + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should have not sanitized inviteid") }) t.Run("system admin", func(t *testing.T) { - rteam, resp := th.SystemAdminClient.GetTeamByName(team.Name, "") - CheckNoError(t, resp) + rteam, _, err := th.SystemAdminClient.GetTeamByName(team.Name, "") + require.NoError(t, err) require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should have not sanitized inviteid") @@ -1259,59 +1302,62 @@ func TestSearchAllTeams(t *testing.T) { oTeam := th.BasicTeam oTeam.AllowOpenInvite = true - updatedTeam, err := th.App.UpdateTeam(oTeam) - require.Nil(t, err, err) + updatedTeam, appErr := th.App.UpdateTeam(oTeam) + require.Nil(t, appErr) oTeam.UpdateAt = updatedTeam.UpdateAt pTeam := &model.Team{DisplayName: "PName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamInvite} th.Client.CreateTeam(pTeam) - rteams, resp := th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) - CheckNoError(t, resp) + rteams, _, err := th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) + require.NoError(t, err) require.Empty(t, rteams, "should have not returned team") - rteams, resp = th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) - CheckNoError(t, resp) + rteams, _, err = th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) + require.NoError(t, err) require.Empty(t, rteams, "should have not returned team") th.Client.Logout() - _, resp = th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) + _, resp, err := th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) + _, resp, err = th.Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rteams, resp = client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) - CheckNoError(t, resp) + rteams, _, err2 := client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) + require.NoError(t, err2) require.Len(t, rteams, 1, "should have returned 1 team") require.Equal(t, oTeam.Id, rteams[0].Id, "invalid team") - rteams, resp = client.SearchTeams(&model.TeamSearch{Term: oTeam.DisplayName}) - CheckNoError(t, resp) + rteams, _, err2 = client.SearchTeams(&model.TeamSearch{Term: oTeam.DisplayName}) + require.NoError(t, err2) require.Len(t, rteams, 1, "should have returned 1 team") require.Equal(t, oTeam.Id, rteams[0].Id, "invalid team") - rteams, resp = client.SearchTeams(&model.TeamSearch{Term: "junk"}) - CheckNoError(t, resp) + rteams, _, err2 = client.SearchTeams(&model.TeamSearch{Term: "junk"}) + require.NoError(t, err2) require.Empty(t, rteams, "should have not returned team") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rteams, resp = client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) - CheckNoError(t, resp) + rteams, _, err2 := client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) + require.NoError(t, err2) require.Len(t, rteams, 1, "should have returned 1 team") - rteams, resp = client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) - CheckNoError(t, resp) + rteams, _, err2 = client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) + require.NoError(t, err2) require.Len(t, rteams, 1, "should have returned 1 team") }) // Choose a team which the system manager can access - sysManagerTeams, resp := th.SystemManagerClient.GetAllTeams("", 0, 10000) + sysManagerTeams, resp, err := th.SystemManagerClient.GetAllTeams("", 0, 10000) + require.NoError(t, err) CheckOKStatus(t, resp) policyTeam := sysManagerTeams[0] // Now actually create the policy and assign the team to it @@ -1324,7 +1370,8 @@ func TestSearchAllTeams(t *testing.T) { }) require.NoError(t, savePolicyErr) t.Run("does not return policy ID", func(t *testing.T) { - teams, sysManagerResp := th.SystemManagerClient.SearchTeams(&model.TeamSearch{Term: policyTeam.Name}) + teams, sysManagerResp, err := th.SystemManagerClient.SearchTeams(&model.TeamSearch{Term: policyTeam.Name}) + require.NoError(t, err) CheckOKStatus(t, sysManagerResp) found := false for _, team := range teams { @@ -1337,7 +1384,8 @@ func TestSearchAllTeams(t *testing.T) { require.True(t, found) }) t.Run("returns policy ID", func(t *testing.T) { - teams, sysAdminResp := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: policyTeam.Name}) + teams, sysAdminResp, err := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: policyTeam.Name}) + require.NoError(t, err) CheckOKStatus(t, sysAdminResp) found := false for _, team := range teams { @@ -1369,13 +1417,13 @@ func TestSearchAllTeamsPaged(t *testing.T) { teams[i] = newTeam } - foobarTeam, err := th.App.CreateTeam(th.Context, &model.Team{ + foobarTeam, appErr := th.App.CreateTeam(th.Context, &model.Team{ DisplayName: "FOOBARDISPLAYNAME", Name: "whatever", Type: model.TeamOpen, Email: th.GenerateTestEmail(), }) - require.Nil(t, err) + require.Nil(t, appErr) testCases := []struct { Name string @@ -1465,8 +1513,8 @@ func TestSearchAllTeamsPaged(t *testing.T) { for _, tc := range testCases { t.Run(tc.Name, func(t *testing.T) { - teams, count, resp := th.SystemAdminClient.SearchTeamsPaged(tc.Search) - require.Nil(t, resp.Error) + teams, count, _, err := th.SystemAdminClient.SearchTeamsPaged(tc.Search) + require.NoError(t, err) require.Equal(t, tc.ExpectedTotalCount, count) require.Equal(t, len(tc.ExpectedTeams), len(teams)) for i, team := range teams { @@ -1475,8 +1523,8 @@ func TestSearchAllTeamsPaged(t *testing.T) { }) } - _, _, resp := th.Client.SearchTeamsPaged(&model.TeamSearch{Term: commonRandom, PerPage: model.NewInt(100)}) - require.Equal(t, "api.team.search_teams.pagination_not_implemented.public_team_search", resp.Error.Id) + _, _, resp, err := th.Client.SearchTeamsPaged(&model.TeamSearch{Term: commonRandom, PerPage: model.NewInt(100)}) + CheckErrorID(t, err, "api.team.search_teams.pagination_not_implemented.public_team_search") require.Equal(t, http.StatusNotImplemented, resp.StatusCode) } @@ -1484,29 +1532,29 @@ func TestSearchAllTeamsSanitization(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) - team2, resp := th.Client.CreateTeam(&model.Team{ + require.NoError(t, err) + team2, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_2", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) t.Run("non-team user", func(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) - CheckNoError(t, resp) + rteams, _, err := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) + require.NoError(t, err) for _, rteam := range rteams { require.Empty(t, rteam.Email, "should've sanitized email") require.Empty(t, rteam.AllowedDomains, "should've sanitized allowed domains") @@ -1520,8 +1568,8 @@ func TestSearchAllTeamsSanitization(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) - CheckNoError(t, resp) + rteams, _, err := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) + require.NoError(t, err) for _, rteam := range rteams { require.Empty(t, rteam.Email, "should've sanitized email") require.Empty(t, rteam.AllowedDomains, "should've sanitized allowed domains") @@ -1530,8 +1578,8 @@ func TestSearchAllTeamsSanitization(t *testing.T) { }) t.Run("team admin", func(t *testing.T) { - rteams, resp := th.Client.SearchTeams(&model.TeamSearch{Term: t.Name()}) - CheckNoError(t, resp) + rteams, _, err := th.Client.SearchTeams(&model.TeamSearch{Term: t.Name()}) + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id == team.Id || rteam.Id == team2.Id || rteam.Id == th.BasicTeam.Id { require.NotEmpty(t, rteam.Email, "should not have sanitized email") @@ -1541,8 +1589,8 @@ func TestSearchAllTeamsSanitization(t *testing.T) { }) t.Run("system admin", func(t *testing.T) { - rteams, resp := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: t.Name()}) - CheckNoError(t, resp) + rteams, _, err := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: t.Name()}) + require.NoError(t, err) for _, rteam := range rteams { require.NotEmpty(t, rteam.Email, "should not have sanitized email") require.NotEmpty(t, rteam.InviteId, "should have not sanitized inviteid") @@ -1553,13 +1601,13 @@ func TestSearchAllTeamsSanitization(t *testing.T) { func TestGetTeamsForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamInvite} - rteam2, _ := Client.CreateTeam(team2) + rteam2, _, _ := client.CreateTeam(team2) - teams, resp := Client.GetTeamsForUser(th.BasicUser.Id, "") - CheckNoError(t, resp) + teams, _, err := client.GetTeamsForUser(th.BasicUser.Id, "") + require.NoError(t, err) require.Len(t, teams, 2, "wrong number of teams") @@ -1576,39 +1624,42 @@ func TestGetTeamsForUser(t *testing.T) { require.True(t, found1, "missing team") require.True(t, found2, "missing team") - _, resp = Client.GetTeamsForUser("junk", "") + _, resp, err := client.GetTeamsForUser("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamsForUser(model.NewId(), "") + _, resp, err = client.GetTeamsForUser(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetTeamsForUser(th.BasicUser2.Id, "") + _, resp, err = client.GetTeamsForUser(th.BasicUser2.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamsForUser(th.BasicUser2.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamsForUser(th.BasicUser2.Id, "") + require.NoError(t, err) } func TestGetTeamsForUserSanitization(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - team, resp := th.Client.CreateTeam(&model.Team{ + team, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_1", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) - team2, resp := th.Client.CreateTeam(&model.Team{ + require.NoError(t, err) + team2, _, err := th.Client.CreateTeam(&model.Team{ DisplayName: t.Name() + "_2", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, AllowedDomains: "simulator.amazonses.com,localhost", }) - CheckNoError(t, resp) + require.NoError(t, err) t.Run("team user", func(t *testing.T) { th.LinkUserToTeam(th.BasicUser2, team) @@ -1617,8 +1668,8 @@ func TestGetTeamsForUserSanitization(t *testing.T) { client := th.CreateClient() th.LoginBasic2WithClient(client) - rteams, resp := client.GetTeamsForUser(th.BasicUser2.Id, "") - CheckNoError(t, resp) + rteams, _, err := client.GetTeamsForUser(th.BasicUser2.Id, "") + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id != team.Id && rteam.Id != team2.Id { continue @@ -1637,8 +1688,8 @@ func TestGetTeamsForUserSanitization(t *testing.T) { th.RemovePermissionFromRole(model.PermissionInviteUser.Id, model.TeamUserRoleId) th.LoginBasic2WithClient(client) - rteams, resp := client.GetTeamsForUser(th.BasicUser2.Id, "") - CheckNoError(t, resp) + rteams, _, err := client.GetTeamsForUser(th.BasicUser2.Id, "") + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id != team.Id && rteam.Id != team2.Id { continue @@ -1650,8 +1701,8 @@ func TestGetTeamsForUserSanitization(t *testing.T) { }) t.Run("team admin", func(t *testing.T) { - rteams, resp := th.Client.GetTeamsForUser(th.BasicUser.Id, "") - CheckNoError(t, resp) + rteams, _, err := th.Client.GetTeamsForUser(th.BasicUser.Id, "") + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id != team.Id && rteam.Id != team2.Id { continue @@ -1663,8 +1714,8 @@ func TestGetTeamsForUserSanitization(t *testing.T) { }) t.Run("system admin", func(t *testing.T) { - rteams, resp := th.SystemAdminClient.GetTeamsForUser(th.BasicUser.Id, "") - CheckNoError(t, resp) + rteams, _, err := th.SystemAdminClient.GetTeamsForUser(th.BasicUser.Id, "") + require.NoError(t, err) for _, rteam := range rteams { if rteam.Id != team.Id && rteam.Id != team2.Id { continue @@ -1679,45 +1730,50 @@ func TestGetTeamsForUserSanitization(t *testing.T) { func TestGetTeamMember(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam user := th.BasicUser - rmember, resp := Client.GetTeamMember(team.Id, user.Id, "") - CheckNoError(t, resp) + rmember, _, err := client.GetTeamMember(team.Id, user.Id, "") + require.NoError(t, err) require.Equal(t, rmember.TeamId, team.Id, "wrong team id") require.Equal(t, rmember.UserId, user.Id, "wrong user id") - _, resp = Client.GetTeamMember("junk", user.Id, "") + _, resp, err := client.GetTeamMember("junk", user.Id, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMember(team.Id, "junk", "") + _, resp, err = client.GetTeamMember(team.Id, "junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMember("junk", "junk", "") + _, resp, err = client.GetTeamMember("junk", "junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMember(team.Id, model.NewId(), "") + _, resp, err = client.GetTeamMember(team.Id, model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = Client.GetTeamMember(model.NewId(), user.Id, "") + _, resp, err = client.GetTeamMember(model.NewId(), user.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamMember(team.Id, user.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMember(team.Id, user.Id, "") + require.NoError(t, err) } func TestGetTeamMembers(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam userNotMember := th.CreateUser() - rmembers, resp := Client.GetTeamMembers(team.Id, 0, 100, "") - CheckNoError(t, resp) + rmembers, _, err := client.GetTeamMembers(team.Id, 0, 100, "") + require.NoError(t, err) t.Logf("rmembers count %v\n", len(rmembers)) @@ -1728,22 +1784,22 @@ func TestGetTeamMembers(t *testing.T) { require.NotEqual(t, rmember.UserId, userNotMember.Id, "user should be a member of team") } - rmembers, resp = Client.GetTeamMembers(team.Id, 0, 1, "") - CheckNoError(t, resp) + rmembers, _, err = client.GetTeamMembers(team.Id, 0, 1, "") + require.NoError(t, err) require.Len(t, rmembers, 1, "should be 1 per page") - rmembers, resp = Client.GetTeamMembers(team.Id, 1, 1, "") - CheckNoError(t, resp) + rmembers, _, err = client.GetTeamMembers(team.Id, 1, 1, "") + require.NoError(t, err) require.Len(t, rmembers, 1, "should be 1 per page") - rmembers, resp = Client.GetTeamMembers(team.Id, 10000, 100, "") - CheckNoError(t, resp) + rmembers, _, err = client.GetTeamMembers(team.Id, 10000, 100, "") + require.NoError(t, err) require.Empty(t, rmembers, "should be no member") - rmembers, resp = Client.GetTeamMembers(team.Id, 0, 2, "") - CheckNoError(t, resp) - rmembers2, resp := Client.GetTeamMembers(team.Id, 1, 2, "") - CheckNoError(t, resp) + rmembers, _, err = client.GetTeamMembers(team.Id, 0, 2, "") + require.NoError(t, err) + rmembers2, _, err := client.GetTeamMembers(team.Id, 1, 2, "") + require.NoError(t, err) for _, tm1 := range rmembers { for _, tm2 := range rmembers2 { @@ -1751,39 +1807,42 @@ func TestGetTeamMembers(t *testing.T) { } } - _, resp = Client.GetTeamMembers("junk", 0, 100, "") + _, resp, err := client.GetTeamMembers("junk", 0, 100, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMembers(model.NewId(), 0, 100, "") + _, resp, err = client.GetTeamMembers(model.NewId(), 0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamMembers(team.Id, 0, 1, "") + client.Logout() + _, resp, err = client.GetTeamMembers(team.Id, 0, 1, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, "", false, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, "", false, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, false, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, false, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, true, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, true, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, "", true, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, "", true, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, false, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersSortAndWithoutDeletedUsers(team.Id, 0, 100, model.USERNAME, false, "") + require.NoError(t, err) } func TestGetTeamMembersForUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - members, resp := Client.GetTeamMembersForUser(th.BasicUser.Id, "") - CheckNoError(t, resp) + members, _, err := client.GetTeamMembersForUser(th.BasicUser.Id, "") + require.NoError(t, err) found := false for _, m := range members { @@ -1794,61 +1853,69 @@ func TestGetTeamMembersForUser(t *testing.T) { require.True(t, found, "missing team member") - _, resp = Client.GetTeamMembersForUser("junk", "") + _, resp, err := client.GetTeamMembersForUser("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMembersForUser(model.NewId(), "") + _, resp, err = client.GetTeamMembersForUser(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") + client.Logout() + _, resp, err = client.GetTeamMembersForUser(th.BasicUser.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetTeamMembersForUser(th.BasicUser.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamMembersForUser(th.BasicUser.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamMembersForUser(th.BasicUser.Id, "") + require.NoError(t, err) } func TestGetTeamMembersByIds(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - tm, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) - CheckNoError(t, resp) + tm, _, err := client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) + require.NoError(t, err) require.Equal(t, tm[0].UserId, th.BasicUser.Id, "returned wrong user") - _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{}) + _, resp, err := client.GetTeamMembersByIds(th.BasicTeam.Id, []string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - tm1, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk"}) - CheckNoError(t, resp) + tm1, _, err := client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk"}) + require.NoError(t, err) require.False(t, len(tm1) > 0, "no users should be returned") - tm1, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk", th.BasicUser.Id}) - CheckNoError(t, resp) + tm1, _, err = client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk", th.BasicUser.Id}) + require.NoError(t, err) require.Len(t, tm1, 1, "1 user should be returned") - _, resp = Client.GetTeamMembersByIds("junk", []string{th.BasicUser.Id}) + _, resp, err = client.GetTeamMembersByIds("junk", []string{th.BasicUser.Id}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamMembersByIds(model.NewId(), []string{th.BasicUser.Id}) + _, resp, err = client.GetTeamMembersByIds(model.NewId(), []string{th.BasicUser.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) + client.Logout() + _, resp, err = client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestAddTeamMember(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam otherUser := th.CreateUser() @@ -1862,34 +1929,33 @@ func TestAddTeamMember(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) guest := th.CreateUser() - _, resp := th.SystemAdminClient.DemoteUserToGuest(guest.Id) - CheckNoError(t, resp) + _, err := th.SystemAdminClient.DemoteUserToGuest(guest.Id) + require.NoError(t, err) - err := th.App.RemoveUserFromTeam(th.Context, th.BasicTeam.Id, th.BasicUser2.Id, "") - if err != nil { - require.FailNow(t, err.Error()) - } + appErr := th.App.RemoveUserFromTeam(th.Context, th.BasicTeam.Id, th.BasicUser2.Id, "") + require.Nil(t, appErr) // Regular user can't add a member to a team they don't belong to. th.LoginBasic2() - _, resp = Client.AddTeamMember(team.Id, otherUser.Id) + _, resp, err := client.AddTeamMember(team.Id, otherUser.Id) CheckForbiddenStatus(t, resp) - require.NotNil(t, resp.Error, "Error is nil") - Client.Logout() + require.Error(t, err, "Error is nil") + client.Logout() // SystemAdmin and mode can add member to a team th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - tm, r := client.AddTeamMember(team.Id, otherUser.Id) - CheckNoError(t, r) - CheckCreatedStatus(t, r) + var tm *model.TeamMember + tm, resp, err = client.AddTeamMember(team.Id, otherUser.Id) + require.NoError(t, err) + CheckCreatedStatus(t, resp) require.Equal(t, tm.UserId, otherUser.Id, "user ids should have matched") require.Equal(t, tm.TeamId, team.Id, "team ids should have matched") }) // Regular user can add a member to a team they belong to. th.LoginBasic() - tm, resp := Client.AddTeamMember(team.Id, otherUser.Id) - CheckNoError(t, resp) + tm, resp, err := client.AddTeamMember(team.Id, otherUser.Id) + require.NoError(t, err) CheckCreatedStatus(t, resp) // Check all the returned data. @@ -1900,21 +1966,25 @@ func TestAddTeamMember(t *testing.T) { require.Equal(t, tm.TeamId, team.Id, "team ids should have matched") // Check with various invalid requests. - tm, resp = Client.AddTeamMember(team.Id, "junk") + tm, resp, err = client.AddTeamMember(team.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, tm, "should have not returned team member") - _, resp = Client.AddTeamMember("junk", otherUser.Id) + _, resp, err = client.AddTeamMember("junk", otherUser.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.AddTeamMember(GenerateTestId(), otherUser.Id) + _, resp, err = client.AddTeamMember(GenerateTestId(), otherUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.AddTeamMember(team.Id, GenerateTestId()) + _, resp, err = client.AddTeamMember(team.Id, GenerateTestId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() + client.Logout() // Check the appropriate permissions are enforced. defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -1931,7 +2001,8 @@ func TestAddTeamMember(t *testing.T) { th.LoginBasic() // Check that a regular user can't add someone to the team. - _, resp = Client.AddTeamMember(team.Id, otherUser.Id) + _, resp, err = client.AddTeamMember(team.Id, otherUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Update user to team admin @@ -1940,8 +2011,8 @@ func TestAddTeamMember(t *testing.T) { th.LoginBasic() // Should work as a team admin. - _, resp = Client.AddTeamMember(team.Id, otherUser.Id) - CheckNoError(t, resp) + _, _, err = client.AddTeamMember(team.Id, otherUser.Id) + require.NoError(t, err) // Change permission level to team user th.AddPermissionToRole(model.PermissionInviteUser.Id, model.TeamUserRoleId) @@ -1954,16 +2025,16 @@ func TestAddTeamMember(t *testing.T) { th.LoginBasic() // Should work as a regular user. - _, resp = Client.AddTeamMember(team.Id, otherUser.Id) - CheckNoError(t, resp) + _, _, err = client.AddTeamMember(team.Id, otherUser.Id) + require.NoError(t, err) // Should return error with invalid JSON in body. - _, err = Client.DoApiPost("/teams/"+team.Id+"/members", "invalid") - require.NotNil(t, err) - require.Equal(t, "api.team.add_team_member.invalid_body.app_error", err.Id) + _, err = client.DoApiPost("/teams/"+team.Id+"/members", "invalid") + require.Error(t, err) + CheckErrorID(t, err, "api.team.add_team_member.invalid_body.app_error") // by token - Client.Login(otherUser.Email, otherUser.Password) + client.Login(otherUser.Email, otherUser.Password) token := model.NewToken( app.TokenTypeTeamInvitation, @@ -1971,8 +2042,8 @@ func TestAddTeamMember(t *testing.T) { ) require.NoError(t, th.App.Srv().Store.Token().Save(token)) - tm, resp = Client.AddTeamMemberFromInvite(token.Token, "") - CheckNoError(t, resp) + tm, _, err = client.AddTeamMemberFromInvite(token.Token, "") + require.NoError(t, err) require.NotNil(t, tm, "should have returned team member") @@ -1980,10 +2051,11 @@ func TestAddTeamMember(t *testing.T) { require.Equal(t, tm.TeamId, team.Id, "team ids should have matched") - _, nErr := th.App.Srv().Store.Token().GetByToken(token.Token) - require.Error(t, nErr, "The token must be deleted after be used") + _, err = th.App.Srv().Store.Token().GetByToken(token.Token) + require.Error(t, err, "The token must be deleted after be used") - tm, resp = Client.AddTeamMemberFromInvite("junk", "") + tm, resp, err = client.AddTeamMemberFromInvite("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) require.Nil(t, tm, "should have not returned team member") @@ -1993,7 +2065,8 @@ func TestAddTeamMember(t *testing.T) { token.CreateAt = model.GetMillis() - 1000*60*60*50 require.NoError(t, th.App.Srv().Store.Token().Save(token)) - _, resp = Client.AddTeamMemberFromInvite(token.Token, "") + _, resp, err = client.AddTeamMemberFromInvite(token.Token, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) th.App.DeleteToken(token) @@ -2005,24 +2078,26 @@ func TestAddTeamMember(t *testing.T) { ) require.NoError(t, th.App.Srv().Store.Token().Save(token)) - _, resp = Client.AddTeamMemberFromInvite(token.Token, "") + _, resp, err = client.AddTeamMemberFromInvite(token.Token, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) th.App.DeleteToken(token) // by invite_id th.App.Srv().SetLicense(model.NewTestLicense("")) defer th.App.Srv().SetLicense(nil) - _, resp = Client.Login(guest.Email, guest.Password) - CheckNoError(t, resp) + _, _, err = client.Login(guest.Email, guest.Password) + require.NoError(t, err) - _, resp = Client.AddTeamMemberFromInvite("", team.InviteId) + _, resp, err = client.AddTeamMemberFromInvite("", team.InviteId) + require.Error(t, err) CheckForbiddenStatus(t, resp) // by invite_id - Client.Login(otherUser.Email, otherUser.Password) + client.Login(otherUser.Email, otherUser.Password) - tm, resp = Client.AddTeamMemberFromInvite("", team.InviteId) - CheckNoError(t, resp) + tm, _, err = client.AddTeamMemberFromInvite("", team.InviteId) + require.NoError(t, err) require.NotNil(t, tm, "should have returned team member") @@ -2030,15 +2105,16 @@ func TestAddTeamMember(t *testing.T) { require.Equal(t, tm.TeamId, team.Id, "team ids should have matched") - tm, resp = Client.AddTeamMemberFromInvite("", "junk") + tm, resp, err = client.AddTeamMemberFromInvite("", "junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) require.Nil(t, tm, "should have not returned team member") // Set a team to group-constrained team.GroupConstrained = model.NewBool(true) - _, err = th.App.UpdateTeam(team) - require.Nil(t, err) + _, appErr = th.App.UpdateTeam(team) + require.Nil(t, appErr) // Attempt to use a token on a group-constrained team token = model.NewToken( @@ -2046,41 +2122,41 @@ func TestAddTeamMember(t *testing.T) { model.MapToJson(map[string]string{"teamId": team.Id}), ) require.NoError(t, th.App.Srv().Store.Token().Save(token)) - _, resp = Client.AddTeamMemberFromInvite(token.Token, "") - require.Equal(t, "app.team.invite_token.group_constrained.error", resp.Error.Id) + _, _, err = client.AddTeamMemberFromInvite(token.Token, "") + CheckErrorID(t, err, "app.team.invite_token.group_constrained.error") // Attempt to use an invite id - _, resp = Client.AddTeamMemberFromInvite("", team.InviteId) - require.Equal(t, "app.team.invite_id.group_constrained.error", resp.Error.Id) + _, _, err = client.AddTeamMemberFromInvite("", team.InviteId) + CheckErrorID(t, err, "app.team.invite_id.group_constrained.error") // User is not in associated groups so shouldn't be allowed th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.AddTeamMember(team.Id, otherUser.Id) - CheckErrorMessage(t, resp, "api.team.add_members.user_denied") + _, _, err = client.AddTeamMember(team.Id, otherUser.Id) + CheckErrorID(t, err, "api.team.add_members.user_denied") }) // Associate group to team - _, err = th.App.UpsertGroupSyncable(&model.GroupSyncable{ + _, appErr = th.App.UpsertGroupSyncable(&model.GroupSyncable{ GroupId: th.Group.Id, SyncableId: team.Id, Type: model.GroupSyncableTypeTeam, }) - require.Nil(t, err) + require.Nil(t, appErr) // Add user to group - _, err = th.App.UpsertGroupMember(th.Group.Id, otherUser.Id) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(th.Group.Id, otherUser.Id) + require.Nil(t, appErr) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.AddTeamMember(team.Id, otherUser.Id) - CheckNoError(t, resp) + _, _, err = client.AddTeamMember(team.Id, otherUser.Id) + require.NoError(t, err) }) } func TestAddTeamMemberMyself(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client // Check the appropriate permissions are enforced. defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -2156,9 +2232,9 @@ func TestAddTeamMemberMyself(t *testing.T) { } else { th.RemovePermissionFromRole(model.PermissionJoinPrivateTeams.Id, model.SystemUserRoleId) } - _, resp := Client.AddTeamMember(team.Id, th.BasicUser.Id) + _, resp, err := client.AddTeamMember(team.Id, th.BasicUser.Id) if tc.ExpectedSuccess { - CheckNoError(t, resp) + require.NoError(t, err) } else { CheckForbiddenStatus(t, resp) } @@ -2173,22 +2249,22 @@ func TestAddTeamMembersDomainConstrained(t *testing.T) { client := th.SystemAdminClient team := th.BasicTeam team.AllowedDomains = "domain1.com, domain2.com" - _, response := client.UpdateTeam(team) - require.Nil(t, response.Error) + _, _, err := client.UpdateTeam(team) + require.NoError(t, err) // create two users on allowed domains - user1, response := client.CreateUser(&model.User{ + user1, _, err := client.CreateUser(&model.User{ Email: "user@domain1.com", Password: "Pa$$word11", Username: GenerateTestUsername(), }) - require.Nil(t, response.Error) - user2, response := client.CreateUser(&model.User{ + require.NoError(t, err) + user2, _, err := client.CreateUser(&model.User{ Email: "user@domain2.com", Password: "Pa$$word11", Username: GenerateTestUsername(), }) - require.Nil(t, response.Error) + require.NoError(t, err) userList := []string{ user1.Id, @@ -2196,28 +2272,28 @@ func TestAddTeamMembersDomainConstrained(t *testing.T) { } // validate that they can be added - tm, response := client.AddTeamMembers(team.Id, userList) - require.Nil(t, response.Error) + tm, _, err := client.AddTeamMembers(team.Id, userList) + require.NoError(t, err) require.Len(t, tm, 2) // cleanup - _, response = client.RemoveTeamMember(team.Id, user1.Id) - require.Nil(t, response.Error) - _, response = client.RemoveTeamMember(team.Id, user2.Id) - require.Nil(t, response.Error) + _, err = client.RemoveTeamMember(team.Id, user1.Id) + require.NoError(t, err) + _, err = client.RemoveTeamMember(team.Id, user2.Id) + require.NoError(t, err) // disable one of the allowed domains team.AllowedDomains = "domain1.com" - _, response = client.UpdateTeam(team) - require.Nil(t, response.Error) + _, _, err = client.UpdateTeam(team) + require.NoError(t, err) // validate that they cannot be added - _, response = client.AddTeamMembers(team.Id, userList) - require.NotNil(t, response.Error) + _, _, err = client.AddTeamMembers(team.Id, userList) + require.Error(t, err) // validate that one user can be added gracefully - members, response := client.AddTeamMembersGracefully(team.Id, userList) - require.Nil(t, response.Error) + members, _, err := client.AddTeamMembersGracefully(team.Id, userList) + require.NoError(t, err) require.Len(t, members, 2) require.NotNil(t, members[0].Member) require.NotNil(t, members[1].Error) @@ -2230,7 +2306,7 @@ func TestAddTeamMembersDomainConstrained(t *testing.T) { func TestAddTeamMembers(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam otherUser := th.CreateUser() userList := []string{ @@ -2242,19 +2318,20 @@ func TestAddTeamMembers(t *testing.T) { }) bot := th.CreateBotWithSystemAdminClient() - err := th.App.RemoveUserFromTeam(th.Context, th.BasicTeam.Id, th.BasicUser2.Id, "") - require.Nil(t, err) + appErr := th.App.RemoveUserFromTeam(th.Context, th.BasicTeam.Id, th.BasicUser2.Id, "") + require.Nil(t, appErr) // Regular user can't add a member to a team they don't belong to. th.LoginBasic2() - _, resp := Client.AddTeamMembers(team.Id, userList) + _, resp, err := client.AddTeamMembers(team.Id, userList) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() + client.Logout() // Regular user can add a member to a team they belong to. th.LoginBasic() - tm, resp := Client.AddTeamMembers(team.Id, userList) - CheckNoError(t, resp) + tm, resp, err := client.AddTeamMembers(team.Id, userList) + require.NoError(t, err) CheckCreatedStatus(t, resp) // Check all the returned data. @@ -2265,24 +2342,28 @@ func TestAddTeamMembers(t *testing.T) { require.Equal(t, tm[0].TeamId, team.Id, "team ids should have matched") // Check with various invalid requests. - _, resp = Client.AddTeamMembers("junk", userList) + _, resp, err = client.AddTeamMembers("junk", userList) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.AddTeamMembers(GenerateTestId(), userList) + _, resp, err = client.AddTeamMembers(GenerateTestId(), userList) + require.Error(t, err) CheckNotFoundStatus(t, resp) testUserList := append(userList, GenerateTestId()) - _, resp = Client.AddTeamMembers(team.Id, testUserList) + _, resp, err = client.AddTeamMembers(team.Id, testUserList) + require.Error(t, err) CheckNotFoundStatus(t, resp) // Test with many users. for i := 0; i < 260; i++ { testUserList = append(testUserList, GenerateTestId()) } - _, resp = Client.AddTeamMembers(team.Id, testUserList) + _, resp, err = client.AddTeamMembers(team.Id, testUserList) + require.Error(t, err) CheckBadRequestStatus(t, resp) - Client.Logout() + client.Logout() // Check the appropriate permissions are enforced. defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -2299,7 +2380,8 @@ func TestAddTeamMembers(t *testing.T) { th.LoginBasic() // Check that a regular user can't add someone to the team. - _, resp = Client.AddTeamMembers(team.Id, userList) + _, resp, err = client.AddTeamMembers(team.Id, userList) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Update user to team admin @@ -2308,8 +2390,8 @@ func TestAddTeamMembers(t *testing.T) { th.LoginBasic() // Should work as a team admin. - _, resp = Client.AddTeamMembers(team.Id, userList) - CheckNoError(t, resp) + _, _, err = client.AddTeamMembers(team.Id, userList) + require.NoError(t, err) // Change permission level to team user th.AddPermissionToRole(model.PermissionInviteUser.Id, model.TeamUserRoleId) @@ -2322,42 +2404,42 @@ func TestAddTeamMembers(t *testing.T) { th.LoginBasic() // Should work as a regular user. - _, resp = Client.AddTeamMembers(team.Id, userList) - CheckNoError(t, resp) + _, _, err = client.AddTeamMembers(team.Id, userList) + require.NoError(t, err) // Set a team to group-constrained team.GroupConstrained = model.NewBool(true) - _, err = th.App.UpdateTeam(team) - require.Nil(t, err) + _, appErr = th.App.UpdateTeam(team) + require.Nil(t, appErr) // User is not in associated groups so shouldn't be allowed - _, resp = Client.AddTeamMembers(team.Id, userList) - CheckErrorMessage(t, resp, "api.team.add_members.user_denied") + _, _, err = client.AddTeamMembers(team.Id, userList) + CheckErrorID(t, err, "api.team.add_members.user_denied") // Ensure that a group synced team can still add bots - _, resp = Client.AddTeamMembers(team.Id, []string{bot.UserId}) - CheckNoError(t, resp) + _, _, err = client.AddTeamMembers(team.Id, []string{bot.UserId}) + require.NoError(t, err) // Associate group to team - _, err = th.App.UpsertGroupSyncable(&model.GroupSyncable{ + _, appErr = th.App.UpsertGroupSyncable(&model.GroupSyncable{ GroupId: th.Group.Id, SyncableId: team.Id, Type: model.GroupSyncableTypeTeam, }) - require.Nil(t, err) + require.Nil(t, appErr) // Add user to group - _, err = th.App.UpsertGroupMember(th.Group.Id, userList[0]) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(th.Group.Id, userList[0]) + require.Nil(t, appErr) - _, resp = Client.AddTeamMembers(team.Id, userList) - CheckNoError(t, resp) + _, _, err = client.AddTeamMembers(team.Id, userList) + require.NoError(t, err) } func TestRemoveTeamMember(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableBotAccountCreation = true @@ -2365,68 +2447,70 @@ func TestRemoveTeamMember(t *testing.T) { bot := th.CreateBotWithSystemAdminClient() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - pass, resp := client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) + require.NoError(t, err) - require.True(t, pass, "should have passed") - - _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.BasicUser.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.BasicUser.Id) + require.NoError(t, err) }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.RemoveTeamMember(th.BasicTeam.Id, "junk") + resp, err := client.RemoveTeamMember(th.BasicTeam.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.RemoveTeamMember("junk", th.BasicUser2.Id) + resp, err = client.RemoveTeamMember("junk", th.BasicUser2.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) - _, resp := Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser2.Id) + resp, err := client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser2.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp = client.RemoveTeamMember(model.NewId(), th.BasicUser.Id) + resp, err = client.RemoveTeamMember(model.NewId(), th.BasicUser.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) - _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.SystemAdminUser.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.SystemAdminUser.Id) + require.NoError(t, err) - _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, bot.UserId) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, bot.UserId) + require.NoError(t, err) // If the team is group-constrained the user cannot be removed th.BasicTeam.GroupConstrained = model.NewBool(true) - _, err := th.App.UpdateTeam(th.BasicTeam) - require.Nil(t, err) + _, appErr := th.App.UpdateTeam(th.BasicTeam) + require.Nil(t, appErr) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) - require.Equal(t, "api.team.remove_member.group_constrained.app_error", resp.Error.Id) + _, err2 := client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) + CheckErrorID(t, err2, "api.team.remove_member.group_constrained.app_error") }) // Can remove a bot even if team is group-constrained th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.RemoveTeamMember(th.BasicTeam.Id, bot.UserId) - CheckNoError(t, resp) - _, resp = client.AddTeamMember(th.BasicTeam.Id, bot.UserId) - CheckNoError(t, resp) + _, err2 := client.RemoveTeamMember(th.BasicTeam.Id, bot.UserId) + require.NoError(t, err2) + _, _, err2 = client.AddTeamMember(th.BasicTeam.Id, bot.UserId) + require.NoError(t, err2) }) // Can remove self even if team is group-constrained - _, resp = th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, th.SystemAdminUser.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, th.SystemAdminUser.Id) + require.NoError(t, err) } func TestGetTeamStats(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam - rstats, resp := Client.GetTeamStats(team.Id, "") - CheckNoError(t, resp) + rstats, _, err := client.GetTeamStats(team.Id, "") + require.NoError(t, err) require.Equal(t, rstats.TeamId, team.Id, "wrong team id") @@ -2434,20 +2518,22 @@ func TestGetTeamStats(t *testing.T) { require.Equal(t, rstats.ActiveMemberCount, int64(3), "wrong count") - _, resp = Client.GetTeamStats("junk", "") + _, resp, err := client.GetTeamStats("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamStats(model.NewId(), "") + _, resp, err = client.GetTeamStats(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetTeamStats(team.Id, "") + require.NoError(t, err) // deactivate BasicUser2 th.UpdateActiveUser(th.BasicUser2, false) - rstats, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") - CheckNoError(t, resp) + rstats, _, err = th.SystemAdminClient.GetTeamStats(team.Id, "") + require.NoError(t, err) require.Equal(t, rstats.TotalMemberCount, int64(3), "wrong count") @@ -2455,58 +2541,62 @@ func TestGetTeamStats(t *testing.T) { // login with different user and test if forbidden user := th.CreateUser() - Client.Login(user.Email, user.Password) - _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") + client.Login(user.Email, user.Password) + _, resp, err = client.GetTeamStats(th.BasicTeam.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") + client.Logout() + _, resp, err = client.GetTeamStats(th.BasicTeam.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestUpdateTeamMemberRoles(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client SystemAdminClient := th.SystemAdminClient const TeamMember = "team_user" const TeamAdmin = "team_user team_admin" // user 1 tries to promote user 2 - ok, resp := Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) + resp, err := client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) + require.Error(t, err) CheckForbiddenStatus(t, resp) - require.False(t, ok, "should have returned false") // user 1 tries to promote himself - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamAdmin) + resp, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamAdmin) + require.Error(t, err) CheckForbiddenStatus(t, resp) // user 1 tries to demote someone - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) + resp, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) + require.Error(t, err) CheckForbiddenStatus(t, resp) // system admin promotes user 1 - ok, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamAdmin) - CheckNoError(t, resp) - require.True(t, ok, "should have returned true") + _, err = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamAdmin) + require.NoError(t, err) // user 1 (team admin) promotes user 2 - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) - CheckNoError(t, resp) + _, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) + require.NoError(t, err) // user 1 (team admin) demotes user 2 (team admin) - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamMember) - CheckNoError(t, resp) + _, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamMember) + require.NoError(t, err) // user 1 (team admin) tries to demote system admin (not member of a team) - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) + resp, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) + require.Error(t, err) CheckNotFoundStatus(t, resp) // user 1 (team admin) demotes system admin (member of a team) th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) - CheckNoError(t, resp) + _, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TeamMember) + require.NoError(t, err) // Note from API v3 // Note to anyone who thinks this (above) test is wrong: // This operation will not affect the system admin's permissions because they have global access to all teams. @@ -2514,28 +2604,31 @@ func TestUpdateTeamMemberRoles(t *testing.T) { // System admins should be able to manipulate permission no matter what their team level permissions are. // system admin promotes user 2 - _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) - CheckNoError(t, resp) + _, err = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamAdmin) + require.NoError(t, err) // system admin demotes user 2 (team admin) - _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamMember) - CheckNoError(t, resp) + _, err = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TeamMember) + require.NoError(t, err) // user 1 (team admin) tries to promote himself to a random team - _, resp = Client.UpdateTeamMemberRoles(model.NewId(), th.BasicUser.Id, TeamAdmin) + resp, err = client.UpdateTeamMemberRoles(model.NewId(), th.BasicUser.Id, TeamAdmin) + require.Error(t, err) CheckForbiddenStatus(t, resp) // user 1 (team admin) tries to promote a random user - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, model.NewId(), TeamAdmin) + resp, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, model.NewId(), TeamAdmin) + require.Error(t, err) CheckNotFoundStatus(t, resp) // user 1 (team admin) tries to promote invalid team permission - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "junk") + resp, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) // user 1 (team admin) demotes himself - _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamMember) - CheckNoError(t, resp) + _, err = client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TeamMember) + require.NoError(t, err) } func TestUpdateTeamMemberSchemeRoles(t *testing.T) { @@ -2549,11 +2642,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: false, } - _, r1 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s1) - CheckNoError(t, r1) + _, err := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s1) + require.NoError(t, err) - tm1, rtm1 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm1) + tm1, _, err := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm1.SchemeGuest) assert.Equal(t, false, tm1.SchemeUser) assert.Equal(t, false, tm1.SchemeAdmin) @@ -2563,11 +2656,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: false, } - _, r2 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s2) - CheckNoError(t, r2) + _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s2) + require.NoError(t, err) - tm2, rtm2 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm2) + tm2, _, err := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm2.SchemeGuest) assert.Equal(t, true, tm2.SchemeUser) assert.Equal(t, false, tm2.SchemeAdmin) @@ -2577,11 +2670,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: false, } - _, r3 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s3) - CheckNoError(t, r3) + _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s3) + require.NoError(t, err) - tm3, rtm3 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm3) + tm3, _, err := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm3.SchemeGuest) assert.Equal(t, false, tm3.SchemeUser) assert.Equal(t, true, tm3.SchemeAdmin) @@ -2591,11 +2684,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: false, } - _, r4 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) - CheckNoError(t, r4) + _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) + require.NoError(t, err) - tm4, rtm4 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm4) + tm4, _, err := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, false, tm4.SchemeGuest) assert.Equal(t, true, tm4.SchemeUser) assert.Equal(t, true, tm4.SchemeAdmin) @@ -2605,11 +2698,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: false, SchemeGuest: true, } - _, r5 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s5) - CheckNoError(t, r5) + _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s5) + require.NoError(t, err) - tm5, rtm5 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, rtm5) + tm5, _, err := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, true, tm5.SchemeGuest) assert.Equal(t, false, tm5.SchemeUser) assert.Equal(t, false, tm5.SchemeAdmin) @@ -2619,61 +2712,71 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SchemeUser: true, SchemeGuest: true, } - _, resp := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s6) + resp, err := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s6) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, model.NewId(), s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, model.NewId(), s4) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, "ASDF", s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, "ASDF", s4) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.LoginBasic2() - _, resp = th.Client.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) + resp, err = th.Client.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) + require.Error(t, err) CheckForbiddenStatus(t, resp) SystemAdminClient.Logout() - _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, s4) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestGetMyTeamsUnread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user := th.BasicUser - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) - teams, resp := Client.GetTeamsUnreadForUser(user.Id, "", true) - CheckNoError(t, resp) + teams, _, err := client.GetTeamsUnreadForUser(user.Id, "", true) + require.NoError(t, err) require.NotEqual(t, len(teams), 0, "should have results") - teams, resp = Client.GetTeamsUnreadForUser(user.Id, th.BasicTeam.Id, true) - CheckNoError(t, resp) + teams, _, err = client.GetTeamsUnreadForUser(user.Id, th.BasicTeam.Id, true) + require.NoError(t, err) require.Empty(t, teams, "should not have results") - _, resp = Client.GetTeamsUnreadForUser("fail", "", true) + _, resp, err := client.GetTeamsUnreadForUser("fail", "", true) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = Client.GetTeamsUnreadForUser(model.NewId(), "", true) + _, resp, err = client.GetTeamsUnreadForUser(model.NewId(), "", true) + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetTeamsUnreadForUser(user.Id, "", true) + client.Logout() + _, resp, err = client.GetTeamsUnreadForUser(user.Id, "", true) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestTeamExists(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client public_member_team := th.BasicTeam err := th.App.UpdateTeamPrivacy(public_member_team.Id, model.TeamOpen, true) require.Nil(t, err) @@ -2702,28 +2805,29 @@ func TestTeamExists(t *testing.T) { t.Run("Logged user with permissions and valid public team", func(t *testing.T) { th.LoginBasic() - exists, resp := Client.TeamExists(public_not_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(public_not_member_team.Name, "") + require.NoError(t, err) assert.True(t, exists, "team should exist") }) t.Run("Logged user with permissions and valid private team", func(t *testing.T) { th.LoginBasic() - exists, resp := Client.TeamExists(private_not_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(private_not_member_team.Name, "") + require.NoError(t, err) assert.True(t, exists, "team should exist") }) t.Run("Logged user and invalid team", func(t *testing.T) { th.LoginBasic() - exists, resp := Client.TeamExists("testingteam", "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists("testingteam", "") + require.NoError(t, err) assert.False(t, exists, "team should not exist") }) t.Run("Logged out user", func(t *testing.T) { - Client.Logout() - _, resp := Client.TeamExists(public_not_member_team.Name, "") + client.Logout() + _, resp, err := client.TeamExists(public_not_member_team.Name, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) @@ -2731,8 +2835,8 @@ func TestTeamExists(t *testing.T) { th.LoginBasic() th.RemovePermissionFromRole(model.PermissionListPublicTeams.Id, model.SystemUserRoleId) - exists, resp := Client.TeamExists(public_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(public_member_team.Name, "") + require.NoError(t, err) assert.True(t, exists, "team should be visible") }) @@ -2740,8 +2844,8 @@ func TestTeamExists(t *testing.T) { th.LoginBasic() th.RemovePermissionFromRole(model.PermissionListPublicTeams.Id, model.SystemUserRoleId) - exists, resp := Client.TeamExists(public_not_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(public_not_member_team.Name, "") + require.NoError(t, err) assert.False(t, exists, "team should not be visible") }) @@ -2749,8 +2853,8 @@ func TestTeamExists(t *testing.T) { th.LoginBasic() th.RemovePermissionFromRole(model.PermissionListPrivateTeams.Id, model.SystemUserRoleId) - exists, resp := Client.TeamExists(private_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(private_member_team.Name, "") + require.NoError(t, err) assert.True(t, exists, "team should be visible") }) @@ -2758,8 +2862,8 @@ func TestTeamExists(t *testing.T) { th.LoginBasic() th.RemovePermissionFromRole(model.PermissionListPrivateTeams.Id, model.SystemUserRoleId) - exists, resp := Client.TeamExists(private_not_member_team.Name, "") - CheckNoError(t, resp) + exists, _, err := client.TeamExists(private_not_member_team.Name, "") + require.NoError(t, err) assert.False(t, exists, "team should not be visible") }) } @@ -2772,10 +2876,12 @@ func TestImportTeam(t *testing.T) { data, err := testutils.ReadTestFile("Fake_Team_Import.zip") require.False(t, err != nil && len(data) == 0, "Error while reading the test file.") - _, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "XYZ", "Fake_Team_Import.zip", th.BasicTeam.Id) + _, resp, err := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "XYZ", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.ImportTeam(data, binary.Size(data), "", "Fake_Team_Import.zip", th.BasicTeam.Id) + _, resp, err = th.SystemAdminClient.ImportTeam(data, binary.Size(data), "", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "Import from unknown and source") @@ -2787,8 +2893,8 @@ func TestImportTeam(t *testing.T) { require.False(t, err != nil && len(data) == 0, "Error while reading the test file.") // Import the channels/users/posts - fileResp, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) - CheckNoError(t, resp) + fileResp, _, err := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.NoError(t, err) fileData, err := base64.StdEncoding.DecodeString(fileResp["results"]) require.NoError(t, err, "failed to decode base64 results data") @@ -2797,25 +2903,25 @@ func TestImportTeam(t *testing.T) { require.Truef(t, strings.Contains(fileReturned, "darth.vader@stardeath.com"), "failed to report the user was imported, fileReturned: %s", fileReturned) // Checking the imported users - importedUser, resp := th.SystemAdminClient.GetUserByUsername("bot_test", "") - CheckNoError(t, resp) + importedUser, _, err := th.SystemAdminClient.GetUserByUsername("bot_test", "") + require.NoError(t, err) require.Equal(t, importedUser.Username, "bot_test", "username should match with the imported user") - importedUser, resp = th.SystemAdminClient.GetUserByUsername("lordvader", "") - CheckNoError(t, resp) + importedUser, _, err = th.SystemAdminClient.GetUserByUsername("lordvader", "") + require.NoError(t, err) require.Equal(t, importedUser.Username, "lordvader", "username should match with the imported user") // Checking the imported Channels - importedChannel, resp := th.SystemAdminClient.GetChannelByName("testchannel", th.BasicTeam.Id, "") - CheckNoError(t, resp) + importedChannel, _, err := th.SystemAdminClient.GetChannelByName("testchannel", th.BasicTeam.Id, "") + require.NoError(t, err) require.Equal(t, importedChannel.Name, "testchannel", "names did not match expected: testchannel") - importedChannel, resp = th.SystemAdminClient.GetChannelByName("general", th.BasicTeam.Id, "") - CheckNoError(t, resp) + importedChannel, _, err = th.SystemAdminClient.GetChannelByName("general", th.BasicTeam.Id, "") + require.NoError(t, err) require.Equal(t, importedChannel.Name, "general", "names did not match expected: general") - posts, resp := th.SystemAdminClient.GetPostsForChannel(importedChannel.Id, 0, 60, "", false) - CheckNoError(t, resp) + posts, _, err := th.SystemAdminClient.GetPostsForChannel(importedChannel.Id, 0, 60, "", false) + require.NoError(t, err) require.Equal(t, posts.Posts[posts.Order[3]].Message, "This is a test post to test the import process", "missing posts in the import process") }) @@ -2828,13 +2934,15 @@ func TestImportTeam(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("cloud")) // Import the channels/users/posts - _, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + _, resp, err := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.Srv().SetLicense(nil) }) t.Run("MissingFile", func(t *testing.T) { - _, resp := th.SystemAdminClient.ImportTeam(nil, 4343, "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + _, resp, err := th.SystemAdminClient.ImportTeam(nil, 4343, "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -2845,7 +2953,8 @@ func TestImportTeam(t *testing.T) { require.False(t, err != nil && len(data) == 0, "Error while reading the test file.") // Import the channels/users/posts - _, resp := th.Client.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + _, resp, err := th.Client.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -2872,8 +2981,8 @@ func TestInviteUsersToTeam(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = false }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) - require.NotNil(t, resp.Error, "Should be disabled") + _, err := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) + require.Error(t, err, "Should be disabled") }) checkEmail := func(t *testing.T, expectedSubject string) { @@ -2900,9 +3009,8 @@ func TestInviteUsersToTeam(t *testing.T) { } th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = true }) - okMsg, resp := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) - CheckNoError(t, resp) - require.True(t, okMsg, "should return true") + _, err := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) + require.NoError(t, err) nameFormat := *th.App.Config().TeamSettings.TeammateNameDisplay expectedSubject := i18n.T("api.templates.invite_subject", map[string]interface{}{"SenderName": th.SystemAdminUser.GetDisplayName(nameFormat), @@ -2912,9 +3020,8 @@ func TestInviteUsersToTeam(t *testing.T) { mail.DeleteMailBox(user1) mail.DeleteMailBox(user2) - okMsg, resp = th.LocalClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) - CheckNoError(t, resp) - require.True(t, okMsg, "should return true") + _, err = th.LocalClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) + require.NoError(t, err) expectedSubject = i18n.T("api.templates.invite_subject", map[string]interface{}{"SenderName": "Administrator", "TeamDisplayName": th.BasicTeam.DisplayName, @@ -2924,12 +3031,11 @@ func TestInviteUsersToTeam(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictCreationToDomains = "@global.com,@common.com" }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - okMsg, resp := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) - require.False(t, okMsg, "should return false") - require.NotNil(t, resp.Error, "Adding users with non-restricted domains was allowed") + _, err := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) + require.Error(t, err, "Adding users with non-restricted domains was allowed") - invitesWithErrors, resp := client.InviteUsersToTeamGracefully(th.BasicTeam.Id, emailList) - CheckNoError(t, resp) + invitesWithErrors, _, err := client.InviteUsersToTeamGracefully(th.BasicTeam.Id, emailList) + require.NoError(t, err) require.Len(t, invitesWithErrors, 2) require.NotNil(t, invitesWithErrors[0].Error) require.NotNil(t, invitesWithErrors[1].Error) @@ -2937,27 +3043,24 @@ func TestInviteUsersToTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { th.BasicTeam.AllowedDomains = "invalid.com,common.com" - _, err := th.App.UpdateTeam(th.BasicTeam) - require.NotNil(t, err, "Should not update the team") + _, appErr := th.App.UpdateTeam(th.BasicTeam) + require.NotNil(t, appErr, "Should not update the team") th.BasicTeam.AllowedDomains = "common.com" - _, err = th.App.UpdateTeam(th.BasicTeam) - require.Nilf(t, err, "%v, Should update the team", err) + _, appErr = th.App.UpdateTeam(th.BasicTeam) + require.Nilf(t, appErr, "%v, Should update the team", appErr) - okMsg, resp := client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@global.com"}) - require.False(t, okMsg, "should return false") - require.NotNilf(t, resp.Error, "%v, Per team restriction should take precedence over the globally allowed domains", err) + _, err := client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@global.com"}) + require.Errorf(t, err, "%v, Per team restriction should take precedence over the globally allowed domains", err) - okMsg, resp = client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@common.com"}) - require.True(t, okMsg, "should return true") - require.Nilf(t, resp.Error, "%v, Failed to invite user which was common between team and global domain restriction", err) + _, err = client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@common.com"}) + require.NoErrorf(t, err, "%v, Failed to invite user which was common between team and global domain restriction", err) - okMsg, resp = client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@invalid.com"}) - require.False(t, okMsg, "should return false") - require.NotNilf(t, resp.Error, "%v, Should not invite user", err) + _, err = client.InviteUsersToTeam(th.BasicTeam.Id, []string{"test@invalid.com"}) + require.Errorf(t, err, "%v, Should not invite user", err) - invitesWithErrors, resp := client.InviteUsersToTeamGracefully(th.BasicTeam.Id, []string{"test@invalid.com", "test@common.com"}) - CheckNoError(t, resp) + invitesWithErrors, _, err := client.InviteUsersToTeamGracefully(th.BasicTeam.Id, []string{"test@invalid.com", "test@common.com"}) + require.NoError(t, err) require.Len(t, invitesWithErrors, 2) require.NotNil(t, invitesWithErrors[0].Error) require.Nil(t, invitesWithErrors[1].Error) @@ -2965,21 +3068,22 @@ func TestInviteUsersToTeam(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { th.BasicTeam.AllowedDomains = "common.com" - _, err := th.App.UpdateTeam(th.BasicTeam) - require.Nilf(t, err, "%v, Should update the team", err) + _, appErr := th.App.UpdateTeam(th.BasicTeam) + require.Nilf(t, appErr, "%v, Should update the team", appErr) emailList := make([]string, 22) for i := 0; i < 22; i++ { emailList[i] = "test-" + strconv.Itoa(i) + "@common.com" } - okMsg, resp := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) - require.False(t, okMsg, "should return false") + resp, err := client.InviteUsersToTeam(th.BasicTeam.Id, emailList) + require.Error(t, err) CheckRequestEntityTooLargeStatus(t, resp) - CheckErrorMessage(t, resp, "app.email.rate_limit_exceeded.app_error") + CheckErrorID(t, err, "app.email.rate_limit_exceeded.app_error") - _, resp = client.InviteUsersToTeamGracefully(th.BasicTeam.Id, emailList) + _, resp, err = client.InviteUsersToTeamGracefully(th.BasicTeam.Id, emailList) + require.Error(t, err) CheckRequestEntityTooLargeStatus(t, resp) - CheckErrorMessage(t, resp, "app.email.rate_limit_exceeded.app_error") + CheckErrorID(t, err, "app.email.rate_limit_exceeded.app_error") }, "rate limits") } @@ -3012,32 +3116,31 @@ func TestInviteGuestsToTeam(t *testing.T) { th.App.Srv().SetLicense(model.NewTestLicense("")) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = false }) - _, resp := th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") - assert.NotNil(t, resp.Error, "Should be disabled") + _, err := th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") + assert.Error(t, err, "Should be disabled") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = false }) - _, resp = th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") - require.NotNil(t, resp.Error, "Should be disabled") + _, err = th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") + require.Error(t, err, "Should be disabled") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = true }) th.App.Srv().SetLicense(nil) - _, resp = th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") - require.NotNil(t, resp.Error, "Should be disabled") + _, err = th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") + require.Error(t, err, "Should be disabled") th.App.Srv().SetLicense(model.NewTestLicense("")) defer th.App.Srv().SetLicense(nil) - okMsg, resp := th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") - CheckNoError(t, resp) - require.True(t, okMsg, "should return true") + _, err = th.SystemAdminClient.InviteGuestsToTeam(th.BasicTeam.Id, emailList, []string{th.BasicChannel.Id}, "test-message") + require.NoError(t, err) t.Run("invalid data in request body", func(t *testing.T) { res, err := th.SystemAdminClient.DoApiPost(th.SystemAdminClient.GetTeamRoute(th.BasicTeam.Id)+"/invite-guests/email", "bad data") - require.NotNil(t, err) - require.Equal(t, "api.team.invite_guests_to_channels.invalid_body.app_error", err.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.team.invite_guests_to_channels.invalid_body.app_error") require.Equal(t, http.StatusBadRequest, res.StatusCode) }) @@ -3118,8 +3221,8 @@ func TestInviteGuestsToTeam(t *testing.T) { assert.Equal(t, "app.email.rate_limit_exceeded.app_error", err.Id) assert.Equal(t, http.StatusRequestEntityTooLarge, err.StatusCode) - _, err = th.App.InviteGuestsToChannelsGracefully(th.BasicTeam.Id, invite, th.BasicUser.Id) - require.NotNil(t, err) + _, appErr := th.App.InviteGuestsToChannelsGracefully(th.BasicTeam.Id, invite, th.BasicUser.Id) + require.NotNil(t, appErr) assert.Equal(t, "app.email.rate_limit_exceeded.app_error", err.Id) assert.Equal(t, http.StatusRequestEntityTooLarge, err.StatusCode) }) @@ -3128,31 +3231,32 @@ func TestInviteGuestsToTeam(t *testing.T) { func TestGetTeamInviteInfo(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam - team, resp := Client.GetTeamInviteInfo(team.InviteId) - CheckNoError(t, resp) + team, _, err := client.GetTeamInviteInfo(team.InviteId) + require.NoError(t, err) require.NotEmpty(t, team.DisplayName, "should not be empty") require.Empty(t, team.Email, "should be empty") team.InviteId = "12345678901234567890123456789012" - team, resp = th.SystemAdminClient.UpdateTeam(team) - CheckNoError(t, resp) + team, _, err = th.SystemAdminClient.UpdateTeam(team) + require.NoError(t, err) - _, resp = Client.GetTeamInviteInfo(team.InviteId) - CheckNoError(t, resp) + _, _, err = client.GetTeamInviteInfo(team.InviteId) + require.NoError(t, err) - _, resp = Client.GetTeamInviteInfo("junk") + _, resp, err := client.GetTeamInviteInfo("junk") + require.Error(t, err) CheckNotFoundStatus(t, resp) } func TestSetTeamIcon(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam data, err := testutils.ReadTestFile("test.png") @@ -3160,19 +3264,17 @@ func TestSetTeamIcon(t *testing.T) { th.LoginTeamAdmin() - ok, resp := Client.SetTeamIcon(team.Id, data) - require.True(t, ok, resp.Error) - - CheckNoError(t, resp) - - ok, resp = Client.SetTeamIcon(model.NewId(), data) - require.False(t, ok, "Should return false, set team icon not allowed") + _, err = client.SetTeamIcon(team.Id, data) + require.NoError(t, err) + resp, err := client.SetTeamIcon(model.NewId(), data) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() - _, resp = Client.SetTeamIcon(team.Id, data) + resp, err = client.SetTeamIcon(team.Id, data) + require.Error(t, err) if resp.StatusCode == http.StatusForbidden { CheckForbiddenStatus(t, resp) } else if resp.StatusCode == http.StatusUnauthorized { @@ -3181,9 +3283,10 @@ func TestSetTeamIcon(t *testing.T) { require.Fail(t, "Should have failed either forbidden or unauthorized") } - Client.Logout() + client.Logout() - _, resp = Client.SetTeamIcon(team.Id, data) + resp, err = client.SetTeamIcon(team.Id, data) + require.Error(t, err) if resp.StatusCode == http.StatusForbidden { CheckForbiddenStatus(t, resp) } else if resp.StatusCode == http.StatusUnauthorized { @@ -3195,8 +3298,8 @@ func TestSetTeamIcon(t *testing.T) { teamBefore, appErr := th.App.GetTeam(team.Id) require.Nil(t, appErr) - _, resp = th.SystemAdminClient.SetTeamIcon(team.Id, data) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.SetTeamIcon(team.Id, data) + require.NoError(t, err) teamAfter, appErr := th.App.GetTeam(team.Id) require.Nil(t, appErr) @@ -3210,49 +3313,53 @@ func TestSetTeamIcon(t *testing.T) { func TestGetTeamIcon(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam // should always fail because no initial image and no auto creation - _, resp := Client.GetTeamIcon(team.Id, "") + _, resp, err := client.GetTeamIcon(team.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) - Client.Logout() + client.Logout() - _, resp = Client.GetTeamIcon(team.Id, "") + _, resp, err = client.GetTeamIcon(team.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } func TestRemoveTeamIcon(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client team := th.BasicTeam th.LoginTeamAdmin() data, _ := testutils.ReadTestFile("test.png") - Client.SetTeamIcon(team.Id, data) + client.SetTeamIcon(team.Id, data) - _, resp := Client.RemoveTeamIcon(team.Id) - CheckNoError(t, resp) + _, err := client.RemoveTeamIcon(team.Id) + require.NoError(t, err) teamAfter, _ := th.App.GetTeam(team.Id) require.Equal(t, teamAfter.LastTeamIconUpdate, int64(0), "should update LastTeamIconUpdate to 0") - Client.SetTeamIcon(team.Id, data) + client.SetTeamIcon(team.Id, data) - _, resp = th.SystemAdminClient.RemoveTeamIcon(team.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.RemoveTeamIcon(team.Id) + require.NoError(t, err) teamAfter, _ = th.App.GetTeam(team.Id) require.Equal(t, teamAfter.LastTeamIconUpdate, int64(0), "should update LastTeamIconUpdate to 0") - Client.SetTeamIcon(team.Id, data) - Client.Logout() + client.SetTeamIcon(team.Id, data) + client.Logout() - _, resp = Client.RemoveTeamIcon(team.Id) + resp, err := client.RemoveTeamIcon(team.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() - _, resp = Client.RemoveTeamIcon(team.Id) + resp, err = client.RemoveTeamIcon(team.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -3274,7 +3381,7 @@ func TestUpdateTeamScheme(t *testing.T) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TeamOpen, } - team, _ = th.SystemAdminClient.CreateTeam(team) + team, _, _ = th.SystemAdminClient.CreateTeam(team) teamScheme := &model.Scheme{ DisplayName: "DisplayName", @@ -3282,48 +3389,55 @@ func TestUpdateTeamScheme(t *testing.T) { Description: "Some description", Scope: model.SchemeScopeTeam, } - teamScheme, _ = th.SystemAdminClient.CreateScheme(teamScheme) + teamScheme, _, _ = th.SystemAdminClient.CreateScheme(teamScheme) channelScheme := &model.Scheme{ DisplayName: "DisplayName", Name: model.NewId(), Description: "Some description", Scope: model.SchemeScopeChannel, } - channelScheme, _ = th.SystemAdminClient.CreateScheme(channelScheme) + channelScheme, _, _ = th.SystemAdminClient.CreateScheme(channelScheme) // Test the setup/base case. - _, resp := th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) - CheckNoError(t, resp) + _, err := th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) + require.NoError(t, err) // Test the return to default scheme - _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, "") - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateTeamScheme(team.Id, "") + require.NoError(t, err) // Test various invalid team and scheme id combinations. - _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, "x") + resp, err := th.SystemAdminClient.UpdateTeamScheme(team.Id, "x") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.UpdateTeamScheme("x", teamScheme.Id) + resp, err = th.SystemAdminClient.UpdateTeamScheme("x", teamScheme.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.SystemAdminClient.UpdateTeamScheme("x", "x") + resp, err = th.SystemAdminClient.UpdateTeamScheme("x", "x") + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test that permissions are required. - _, resp = th.Client.UpdateTeamScheme(team.Id, teamScheme.Id) + resp, err = th.Client.UpdateTeamScheme(team.Id, teamScheme.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test that a license is required. th.App.Srv().SetLicense(nil) - _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) + resp, err = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) th.App.Srv().SetLicense(model.NewTestLicense("")) // Test an invalid scheme scope. - _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, channelScheme.Id) + resp, err = th.SystemAdminClient.UpdateTeamScheme(team.Id, channelScheme.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) // Test that an unauthenticated user gets rejected. th.SystemAdminClient.Logout() - _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) + resp, err = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -3336,25 +3450,25 @@ func TestTeamMembersMinusGroupMembers(t *testing.T) { team := th.CreateTeam() team.GroupConstrained = model.NewBool(true) - team, err := th.App.UpdateTeam(team) - require.Nil(t, err) + team, appErr := th.App.UpdateTeam(team) + require.Nil(t, appErr) - _, err = th.App.AddTeamMember(th.Context, team.Id, user1.Id) - require.Nil(t, err) - _, err = th.App.AddTeamMember(th.Context, team.Id, user2.Id) - require.Nil(t, err) + _, appErr = th.App.AddTeamMember(th.Context, team.Id, user1.Id) + require.Nil(t, appErr) + _, appErr = th.App.AddTeamMember(th.Context, team.Id, user2.Id) + require.Nil(t, appErr) group1 := th.CreateGroup() group2 := th.CreateGroup() - _, err = th.App.UpsertGroupMember(group1.Id, user1.Id) - require.Nil(t, err) - _, err = th.App.UpsertGroupMember(group2.Id, user2.Id) - require.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group1.Id, user1.Id) + require.Nil(t, appErr) + _, appErr = th.App.UpsertGroupMember(group2.Id, user2.Id) + require.Nil(t, appErr) // No permissions - _, _, res := th.Client.TeamMembersMinusGroupMembers(team.Id, []string{group1.Id, group2.Id}, 0, 100, "") - require.Equal(t, "api.context.permissions.app_error", res.Error.Id) + _, _, _, err := th.Client.TeamMembersMinusGroupMembers(team.Id, []string{group1.Id, group2.Id}, 0, 100, "") + CheckErrorID(t, err, "api.context.permissions.app_error") testCases := map[string]struct { groupIDs []string @@ -3409,8 +3523,8 @@ func TestTeamMembersMinusGroupMembers(t *testing.T) { for name, tc := range testCases { t.Run(name, func(t *testing.T) { - uwg, count, res := th.SystemAdminClient.TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage, "") - require.Nil(t, res.Error) + uwg, count, _, err := th.SystemAdminClient.TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage, "") + require.NoError(t, err) require.Len(t, uwg, tc.length) require.Equal(t, tc.count, int(count)) if tc.otherAssertions != nil { @@ -3425,22 +3539,22 @@ func TestInvalidateAllEmailInvites(t *testing.T) { defer th.TearDown() t.Run("Forbidden when request performed by system user", func(t *testing.T) { - ok, res := th.Client.InvalidateEmailInvites() - require.Equal(t, false, ok) + res, err := th.Client.InvalidateEmailInvites() + require.Error(t, err) CheckForbiddenStatus(t, res) }) t.Run("OK when request performed by system user with requisite system permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionInvalidateEmailInvite.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionInvalidateEmailInvite.Id, model.SystemUserRoleId) - ok, res := th.Client.InvalidateEmailInvites() - require.Equal(t, true, ok) + res, err := th.Client.InvalidateEmailInvites() + require.NoError(t, err) CheckOKStatus(t, res) }) t.Run("OK when request performed by system admin", func(t *testing.T) { - ok, res := th.SystemAdminClient.InvalidateEmailInvites() - require.Equal(t, true, ok) + res, err := th.SystemAdminClient.InvalidateEmailInvites() + require.NoError(t, err) CheckOKStatus(t, res) }) } diff --git a/api4/terms_of_service_test.go b/api4/terms_of_service_test.go index 3fb2446985..e3699d14a4 100644 --- a/api4/terms_of_service_test.go +++ b/api4/terms_of_service_test.go @@ -15,13 +15,13 @@ import ( func TestGetTermsOfService(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - _, err := th.App.CreateTermsOfService("abc", th.BasicUser.Id) - require.Nil(t, err) + _, appErr := th.App.CreateTermsOfService("abc", th.BasicUser.Id) + require.Nil(t, appErr) - termsOfService, resp := Client.GetTermsOfService("") - CheckNoError(t, resp) + termsOfService, _, err := client.GetTermsOfService("") + require.NoError(t, err) assert.NotNil(t, termsOfService) assert.Equal(t, "abc", termsOfService.Text) @@ -32,25 +32,25 @@ func TestGetTermsOfService(t *testing.T) { func TestCreateTermsOfService(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client - _, resp := Client.CreateTermsOfService("terms of service new", th.BasicUser.Id) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err := client.CreateTermsOfService("terms of service new", th.BasicUser.Id) + CheckErrorID(t, err, "api.context.permissions.app_error") } func TestCreateTermsOfServiceAdminUser(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.SystemAdminClient + client := th.SystemAdminClient - termsOfService, resp := Client.CreateTermsOfService("terms of service new", th.SystemAdminUser.Id) - CheckErrorMessage(t, resp, "api.create_terms_of_service.custom_terms_of_service_disabled.app_error") + termsOfService, _, err := client.CreateTermsOfService("terms of service new", th.SystemAdminUser.Id) + CheckErrorID(t, err, "api.create_terms_of_service.custom_terms_of_service_disabled.app_error") assert.Nil(t, termsOfService) th.App.Srv().SetLicense(model.NewTestLicense("EnableCustomTermsOfService")) - termsOfService, resp = Client.CreateTermsOfService("terms of service new_2", th.SystemAdminUser.Id) - CheckNoError(t, resp) + termsOfService, _, err = client.CreateTermsOfService("terms of service new_2", th.SystemAdminUser.Id) + require.NoError(t, err) assert.NotEmpty(t, termsOfService.Id) assert.NotEmpty(t, termsOfService.CreateAt) assert.Equal(t, "terms of service new_2", termsOfService.Text) diff --git a/api4/upload_test.go b/api4/upload_test.go index 8179951131..d057eeda71 100644 --- a/api4/upload_test.go +++ b/api4/upload_test.go @@ -30,26 +30,24 @@ func TestCreateUpload(t *testing.T) { t.Run("file attachments disabled", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnableFileAttachments = false }) defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnableFileAttachments = true }) - u, resp := th.Client.CreateUpload(us) + u, resp, err := th.Client.CreateUpload(us) require.Nil(t, u) - require.NotNil(t, resp.Error) - require.Equal(t, "api.file.attachments.disabled.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.file.attachments.disabled.app_error") require.Equal(t, http.StatusNotImplemented, resp.StatusCode) }) t.Run("no permissions", func(t *testing.T) { us.ChannelId = th.BasicPrivateChannel2.Id - u, resp := th.Client.CreateUpload(us) + u, resp, err := th.Client.CreateUpload(us) require.Nil(t, u) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Equal(t, http.StatusForbidden, resp.StatusCode) }) t.Run("valid", func(t *testing.T) { us.ChannelId = th.BasicChannel.Id - u, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + u, resp, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, u) require.Equal(t, http.StatusCreated, resp.StatusCode) }) @@ -70,10 +68,9 @@ func TestCreateUpload(t *testing.T) { FileSize: info.Size(), Type: model.UploadTypeImport, } - u, resp := th.Client.CreateUpload(us) + u, resp, err := th.Client.CreateUpload(us) require.Nil(t, u) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Equal(t, http.StatusForbidden, resp.StatusCode) }) @@ -83,8 +80,8 @@ func TestCreateUpload(t *testing.T) { FileSize: info.Size(), Type: model.UploadTypeImport, } - u, resp := th.SystemAdminClient.CreateUpload(us) - require.Nil(t, resp.Error) + u, _, err := th.SystemAdminClient.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, u) }) }) @@ -109,28 +106,26 @@ func TestGetUpload(t *testing.T) { require.NotEmpty(t, us) t.Run("upload not found", func(t *testing.T) { - u, resp := th.Client.GetUpload(model.NewId()) + u, resp, err := th.Client.GetUpload(model.NewId()) require.Nil(t, u) - require.NotNil(t, resp.Error) - require.Equal(t, "app.upload.get.app_error", resp.Error.Id) + CheckErrorID(t, err, "app.upload.get.app_error") require.Equal(t, http.StatusNotFound, resp.StatusCode) }) t.Run("no permissions", func(t *testing.T) { - u, resp := th.Client.GetUpload(us.Id) + u, _, err := th.Client.GetUpload(us.Id) require.Nil(t, u) - require.NotNil(t, resp.Error) - require.Equal(t, "api.upload.get_upload.forbidden.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.upload.get_upload.forbidden.app_error") }) t.Run("success", func(t *testing.T) { - expected, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + expected, resp, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, expected) require.Equal(t, http.StatusCreated, resp.StatusCode) - u, resp := th.Client.GetUpload(expected.Id) - require.Nil(t, resp.Error) + u, _, err := th.Client.GetUpload(expected.Id) + require.NoError(t, err) require.NotEmpty(t, u) require.Equal(t, expected, u) }) @@ -141,15 +136,15 @@ func TestGetUploadsForUser(t *testing.T) { defer th.TearDown() t.Run("no permissions", func(t *testing.T) { - uss, resp := th.Client.GetUploadsForUser(th.BasicUser2.Id) - require.NotNil(t, resp.Error) - require.Equal(t, "api.user.get_uploads_for_user.forbidden.app_error", resp.Error.Id) + uss, _, err := th.Client.GetUploadsForUser(th.BasicUser2.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.user.get_uploads_for_user.forbidden.app_error") require.Nil(t, uss) }) t.Run("empty", func(t *testing.T) { - uss, resp := th.Client.GetUploadsForUser(th.BasicUser.Id) - require.Nil(t, resp.Error) + uss, _, err := th.Client.GetUploadsForUser(th.BasicUser.Id) + require.NoError(t, err) require.Empty(t, uss) }) @@ -173,8 +168,8 @@ func TestGetUploadsForUser(t *testing.T) { uploads[i] = us } - uss, resp := th.Client.GetUploadsForUser(th.BasicUser.Id) - require.Nil(t, resp.Error) + uss, _, err := th.Client.GetUploadsForUser(th.BasicUser.Id) + require.NoError(t, err) require.NotEmpty(t, uss) require.Len(t, uss, len(uploads)) for i := range uploads { @@ -209,58 +204,54 @@ func TestUploadData(t *testing.T) { t.Run("file attachments disabled", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnableFileAttachments = false }) defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.EnableFileAttachments = true }) - info, resp := th.Client.UploadData(model.NewId(), bytes.NewReader(data)) + info, _, err := th.Client.UploadData(model.NewId(), bytes.NewReader(data)) require.Nil(t, info) - require.NotNil(t, resp.Error) - require.Equal(t, "api.file.attachments.disabled.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.file.attachments.disabled.app_error") }) t.Run("upload not found", func(t *testing.T) { - info, resp := th.Client.UploadData(model.NewId(), bytes.NewReader(data)) + info, resp, err := th.Client.UploadData(model.NewId(), bytes.NewReader(data)) require.Nil(t, info) - require.NotNil(t, resp.Error) - require.Equal(t, "app.upload.get.app_error", resp.Error.Id) + CheckErrorID(t, err, "app.upload.get.app_error") require.Equal(t, http.StatusNotFound, resp.StatusCode) }) t.Run("no permissions", func(t *testing.T) { - info, resp := th.Client.UploadData(us.Id, bytes.NewReader(data)) + info, _, err := th.Client.UploadData(us.Id, bytes.NewReader(data)) require.Nil(t, info) - require.NotNil(t, resp.Error) - require.Equal(t, "api.context.permissions.app_error", resp.Error.Id) + CheckErrorID(t, err, "api.context.permissions.app_error") }) t.Run("bad content-length", func(t *testing.T) { - u, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + u, resp, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, u) require.Equal(t, http.StatusCreated, resp.StatusCode) - info, resp := th.Client.UploadData(u.Id, bytes.NewReader(append(data, 0x00))) + info, _, err := th.Client.UploadData(u.Id, bytes.NewReader(append(data, 0x00))) require.Nil(t, info) - require.NotNil(t, resp.Error) - require.Equal(t, "api.upload.upload_data.invalid_content_length", resp.Error.Id) + CheckErrorID(t, err, "api.upload.upload_data.invalid_content_length") }) t.Run("success", func(t *testing.T) { - u, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + u, resp, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, u) require.Equal(t, http.StatusCreated, resp.StatusCode) - info, resp := th.Client.UploadData(u.Id, bytes.NewReader(data)) - require.Nil(t, resp.Error) + info, _, err := th.Client.UploadData(u.Id, bytes.NewReader(data)) + require.NoError(t, err) require.NotEmpty(t, info) require.Equal(t, u.Filename, info.Name) - file, resp := th.Client.GetFile(info.Id) - require.Nil(t, resp.Error) + file, _, err := th.Client.GetFile(info.Id) + require.NoError(t, err) require.Equal(t, file, data) }) t.Run("resume success", func(t *testing.T) { - u, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + u, resp, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotEmpty(t, u) require.Equal(t, http.StatusCreated, resp.StatusCode) @@ -268,18 +259,18 @@ func TestUploadData(t *testing.T) { R: bytes.NewReader(data), N: 5 * 1024 * 1024, } - info, resp := th.Client.UploadData(u.Id, rd) - require.Nil(t, resp.Error) + info, resp, err := th.Client.UploadData(u.Id, rd) + require.NoError(t, err) require.Nil(t, info) require.Equal(t, http.StatusNoContent, resp.StatusCode) - info, resp = th.Client.UploadData(u.Id, bytes.NewReader(data[5*1024*1024:])) - require.Nil(t, resp.Error) + info, _, err = th.Client.UploadData(u.Id, bytes.NewReader(data[5*1024*1024:])) + require.NoError(t, err) require.NotEmpty(t, info) require.Equal(t, u.Filename, info.Name) - file, resp := th.Client.GetFile(info.Id) - require.Nil(t, resp.Error) + file, _, err := th.Client.GetFile(info.Id) + require.NoError(t, err) require.Equal(t, file, data) }) } @@ -300,8 +291,8 @@ func TestUploadDataMultipart(t *testing.T) { Filename: "upload", FileSize: 8 * 1024 * 1024, } - us, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + us, _, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotNil(t, us) require.NotEmpty(t, us) @@ -321,10 +312,9 @@ func TestUploadDataMultipart(t *testing.T) { } t.Run("bad content-type", func(t *testing.T) { - info, resp := th.Client.DoUploadFile("/uploads/"+us.Id, data, "multipart/form-data;") + info, _, err := th.Client.DoUploadFile("/uploads/"+us.Id, data, "multipart/form-data;") require.Nil(t, info) - require.NotNil(t, resp.Error) - require.Equal(t, "api.upload.upload_data.invalid_content_type", resp.Error.Id) + CheckErrorID(t, err, "api.upload.upload_data.invalid_content_type") }) t.Run("success", func(t *testing.T) { @@ -341,16 +331,16 @@ func TestUploadDataMultipart(t *testing.T) { require.NotEmpty(t, info) require.Equal(t, us.Filename, info.Name) - file, resp := th.Client.GetFile(info.Id) - require.Nil(t, resp.Error) + file, _, err := th.Client.GetFile(info.Id) + require.NoError(t, err) require.Equal(t, file, data) }) t.Run("resume success", func(t *testing.T) { mpData, contentType := genMultipartData(t, data[:5*1024*1024]) - u, resp := th.Client.CreateUpload(us) - require.Nil(t, resp.Error) + u, _, err := th.Client.CreateUpload(us) + require.NoError(t, err) require.NotNil(t, u) require.NotEmpty(t, u) @@ -376,8 +366,8 @@ func TestUploadDataMultipart(t *testing.T) { require.NotEmpty(t, info) require.Equal(t, u.Filename, info.Name) - file, resp := th.Client.GetFile(info.Id) - require.Nil(t, resp.Error) + file, _, err := th.Client.GetFile(info.Id) + require.NoError(t, err) require.Equal(t, file, data) }) } diff --git a/api4/user_test.go b/api4/user_test.go index 8275dcd9aa..7ecbd88881 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -39,43 +39,44 @@ func TestCreateUser(t *testing.T) { EmailVerified: true, } - ruser, resp := th.Client.CreateUser(&user) - CheckNoError(t, resp) + ruser, resp, err := th.Client.CreateUser(&user) + require.NoError(t, err) CheckCreatedStatus(t, resp) // Creating a user as a regular user with verified flag should not verify the new user. require.False(t, ruser.EmailVerified) - _, _ = th.Client.Login(user.Email, user.Password) + _, _, _ = th.Client.Login(user.Email, user.Password) require.Equal(t, user.Nickname, ruser.Nickname, "nickname didn't match") require.Equal(t, model.SystemUserRoleId, ruser.Roles, "did not clear roles") CheckUserSanitization(t, ruser) - _, resp = th.Client.CreateUser(ruser) + _, resp, err = th.Client.CreateUser(ruser) + require.Error(t, err) CheckBadRequestStatus(t, resp) ruser.Id = "" ruser.Username = GenerateTestUsername() ruser.Password = "passwd1" - _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "app.user.save.email_exists.app_error") + _, resp, err = th.Client.CreateUser(ruser) + CheckErrorID(t, err, "app.user.save.email_exists.app_error") CheckBadRequestStatus(t, resp) ruser.Email = th.GenerateTestEmail() ruser.Username = user.Username - _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "app.user.save.username_exists.app_error") + _, resp, err = th.Client.CreateUser(ruser) + CheckErrorID(t, err, "app.user.save.username_exists.app_error") CheckBadRequestStatus(t, resp) ruser.Email = "" - _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "model.user.is_valid.email.app_error") + _, resp, err = th.Client.CreateUser(ruser) + CheckErrorID(t, err, "model.user.is_valid.email.app_error") CheckBadRequestStatus(t, resp) ruser.Username = "testinvalid+++" - _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "model.user.is_valid.username.app_error") + _, resp, err = th.Client.CreateUser(ruser) + CheckErrorID(t, err, "model.user.is_valid.username.app_error") CheckBadRequestStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = false }) @@ -83,26 +84,27 @@ func TestCreateUser(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user2 := &model.User{Email: th.GenerateTestEmail(), Password: "Password1", Username: GenerateTestUsername(), EmailVerified: true} - ruser2, resp := client.CreateUser(user2) - CheckNoError(t, resp) + ruser2, _, err2 := client.CreateUser(user2) + require.NoError(t, err2) // Creating a user as sysadmin should verify the user with the EmailVerified flag. require.True(t, ruser2.EmailVerified) - r, err := client.DoApiPost("/users", "garbage") - require.NotNil(t, err, "should have errored") + r, err2 := client.DoApiPost("/users", "garbage") + require.Error(t, err2, "should have errored") assert.Equal(t, http.StatusBadRequest, r.StatusCode) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { email := th.GenerateTestEmail() user2 := &model.User{Email: email, Password: "Password1", Username: GenerateTestUsername(), EmailVerified: true} - _, resp := client.CreateUser(user2) - CheckNoError(t, resp) + _, _, err = client.CreateUser(user2) + require.NoError(t, err) _, appErr := th.App.GetUserByUsername(user2.Username) require.Nil(t, appErr) user3 := &model.User{Email: fmt.Sprintf(" %s ", email), Password: "Password1", Username: GenerateTestUsername(), EmailVerified: true} - _, resp = client.CreateUser(user3) + _, resp, err = client.CreateUser(user3) + require.Error(t, err) CheckBadRequestStatus(t, resp) _, appErr = th.App.GetUserByUsername(user3.Username) require.NotNil(t, appErr) @@ -130,15 +132,16 @@ func TestCreateUserInputFilter(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := &model.User{Email: "foobar+testdomainrestriction@mattermost.com", Password: "Password1", Username: GenerateTestUsername()} - u, resp := client.CreateUser(user) // we need the returned created user to use its Id for deletion. - CheckNoError(t, resp) - _, resp = client.PermanentDeleteUser(u.Id) - CheckNoError(t, resp) + u, _, err := client.CreateUser(user) // we need the returned created user to use its Id for deletion. + require.NoError(t, err) + _, err = client.PermanentDeleteUser(u.Id) + require.NoError(t, err) }, "ValidUser") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := &model.User{Email: "foobar+testdomainrestriction@mattermost.org", Password: "Password1", Username: GenerateTestUsername()} - _, resp := client.CreateUser(user) + _, resp, err := client.CreateUser(user) + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "InvalidEmail") @@ -150,10 +153,10 @@ func TestCreateUserInputFilter(t *testing.T) { AuthService: "ldap", AuthData: model.NewString("999099"), } - u, resp := th.SystemAdminClient.CreateUser(user) - CheckNoError(t, resp) - _, resp = th.SystemAdminClient.PermanentDeleteUser(u.Id) - CheckNoError(t, resp) + u, _, err := th.SystemAdminClient.CreateUser(user) + require.NoError(t, err) + _, err = th.SystemAdminClient.PermanentDeleteUser(u.Id) + require.NoError(t, err) }) t.Run("LocalClient", func(t *testing.T) { user := &model.User{ @@ -162,16 +165,17 @@ func TestCreateUserInputFilter(t *testing.T) { AuthService: "ldap", AuthData: model.NewString("999100"), } - u, resp := th.LocalClient.CreateUser(user) - CheckNoError(t, resp) - _, resp = th.LocalClient.PermanentDeleteUser(u.Id) - CheckNoError(t, resp) + u, _, err := th.LocalClient.CreateUser(user) + require.NoError(t, err) + _, err = th.LocalClient.PermanentDeleteUser(u.Id) + require.NoError(t, err) }) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := &model.User{Email: "foobar+testdomainrestriction@mattermost.org", Password: "Password1", Username: GenerateTestUsername(), AuthService: "ldap"} - _, resp := th.Client.CreateUser(user) + _, resp, err := th.Client.CreateUser(user) + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "InvalidAuthServiceFilter") }) @@ -187,13 +191,13 @@ func TestCreateUserInputFilter(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { emailAddr := "foobar+testinvalidrole@mattermost.com" user := &model.User{Email: emailAddr, Password: "Password1", Username: GenerateTestUsername(), Roles: "system_user system_admin"} - _, resp := client.CreateUser(user) - CheckNoError(t, resp) - ruser, err := th.App.GetUserByEmail(emailAddr) - require.Nil(t, err) + _, _, err := client.CreateUser(user) + require.NoError(t, err) + ruser, appErr := th.App.GetUserByEmail(emailAddr) + require.Nil(t, appErr) assert.NotEqual(t, ruser.Roles, "system_user system_admin") - _, resp = client.PermanentDeleteUser(ruser.Id) - CheckNoError(t, resp) + _, err = client.PermanentDeleteUser(ruser.Id) + require.NoError(t, err) }, "InvalidRole") }) @@ -203,7 +207,8 @@ func TestCreateUserInputFilter(t *testing.T) { *cfg.TeamSettings.EnableUserCreation = true }) user := &model.User{Id: "AAAAAAAAAAAAAAAAAAAAAAAAAA", Email: "foobar+testinvalidid@mattermost.com", Password: "Password1", Username: GenerateTestUsername(), Roles: "system_user system_admin"} - _, resp := client.CreateUser(user) + _, resp, err := client.CreateUser(user) + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "InvalidId") } @@ -220,15 +225,15 @@ func TestCreateUserWithToken(t *testing.T) { ) require.NoError(t, th.App.Srv().Store.Token().Save(token)) - ruser, resp := th.Client.CreateUserWithToken(&user, token.Token) - CheckNoError(t, resp) + ruser, resp, err := th.Client.CreateUserWithToken(&user, token.Token) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) require.Equal(t, user.Nickname, ruser.Nickname) require.Equal(t, model.SystemUserRoleId, ruser.Roles, "should clear roles") CheckUserSanitization(t, ruser) - _, err := th.App.Srv().Store.Token().GetByToken(token.Token) + _, err = th.App.Srv().Store.Token().GetByToken(token.Token) require.Error(t, err, "The token must be deleted after being used") teams, appErr := th.App.GetTeamsForUser(ruser.Id) @@ -245,15 +250,15 @@ func TestCreateUserWithToken(t *testing.T) { ) require.NoError(t, th.App.Srv().Store.Token().Save(token)) - ruser, resp := client.CreateUserWithToken(&user, token.Token) - CheckNoError(t, resp) + ruser, resp, err := client.CreateUserWithToken(&user, token.Token) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) require.Equal(t, user.Nickname, ruser.Nickname) require.Equal(t, model.SystemUserRoleId, ruser.Roles, "should clear roles") CheckUserSanitization(t, ruser) - _, err := th.App.Srv().Store.Token().GetByToken(token.Token) + _, err = th.App.Srv().Store.Token().GetByToken(token.Token) require.Error(t, err, "The token must be deleted after being used") teams, appErr := th.App.GetTeamsForUser(ruser.Id) @@ -271,9 +276,9 @@ func TestCreateUserWithToken(t *testing.T) { require.NoError(t, th.App.Srv().Store.Token().Save(token)) defer th.App.DeleteToken(token) - _, resp := th.Client.CreateUserWithToken(&user, "") - CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.missing_token.app_error") + _, _, err := th.Client.CreateUserWithToken(&user, "") + require.Error(t, err) + CheckErrorID(t, err, "api.user.create_user.missing_token.app_error") }) t.Run("TokenExpired", func(t *testing.T) { @@ -288,17 +293,19 @@ func TestCreateUserWithToken(t *testing.T) { require.NoError(t, th.App.Srv().Store.Token().Save(token)) defer th.App.DeleteToken(token) - _, resp := th.Client.CreateUserWithToken(&user, token.Token) + _, resp, err := th.Client.CreateUserWithToken(&user, token.Token) + require.Error(t, err) CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_link_expired.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_link_expired.app_error") }) t.Run("WrongToken", func(t *testing.T) { user := model.User{Email: th.GenerateTestEmail(), Nickname: "Corey Hulen", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} - _, resp := th.Client.CreateUserWithToken(&user, "wrong") + _, resp, err := th.Client.CreateUserWithToken(&user, "wrong") + require.Error(t, err) CheckNotFoundStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_link_invalid.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_link_invalid.app_error") }) t.Run("EnableUserCreationDisable", func(t *testing.T) { @@ -319,9 +326,10 @@ func TestCreateUserWithToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserCreation = false }) - _, resp := th.Client.CreateUserWithToken(&user, token.Token) + _, resp, err := th.Client.CreateUserWithToken(&user, token.Token) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_email_disabled.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_email_disabled.app_error") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { @@ -339,9 +347,10 @@ func TestCreateUserWithToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserCreation = false }) - _, resp := client.CreateUserWithToken(&user, token.Token) + _, resp, err := client.CreateUserWithToken(&user, token.Token) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_email_disabled.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_email_disabled.app_error") }, "EnableUserCreationDisable") t.Run("EnableOpenServerDisable", func(t *testing.T) { @@ -360,15 +369,15 @@ func TestCreateUserWithToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = false }) - ruser, resp := th.Client.CreateUserWithToken(&user, token.Token) - CheckNoError(t, resp) + ruser, resp, err := th.Client.CreateUserWithToken(&user, token.Token) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) require.Equal(t, user.Nickname, ruser.Nickname) require.Equal(t, model.SystemUserRoleId, ruser.Roles, "should clear roles") CheckUserSanitization(t, ruser) - _, err := th.App.Srv().Store.Token().GetByToken(token.Token) + _, err = th.App.Srv().Store.Token().GetByToken(token.Token) require.Error(t, err, "The token must be deleted after be used") }) } @@ -392,27 +401,27 @@ func TestCreateUserWebSocketEvent(t *testing.T) { EmailVerified: true, } - guest, err := th.App.CreateGuest(th.Context, guest) - require.Nil(t, err) + guest, errr := th.App.CreateGuest(th.Context, guest) + require.Nil(t, errr) - _, _, err = th.App.AddUserToTeam(th.Context, th.BasicTeam.Id, guest.Id, "") - require.Nil(t, err) + _, _, errr = th.App.AddUserToTeam(th.Context, th.BasicTeam.Id, guest.Id, "") + require.Nil(t, errr) - _, err = th.App.AddUserToChannel(guest, th.BasicChannel, false) - require.Nil(t, err) + _, errr = th.App.AddUserToChannel(guest, th.BasicChannel, false) + require.Nil(t, errr) guestClient := th.CreateClient() - _, resp := guestClient.Login(guest.Email, guestPassword) - require.Nil(t, resp.Error) + _, _, err := guestClient.Login(guest.Email, guestPassword) + require.NoError(t, err) guestWSClient, err := th.CreateWebSocketClientWithClient(guestClient) - require.Nil(t, err) + require.NoError(t, err) defer guestWSClient.Close() guestWSClient.Listen() userWSClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) defer userWSClient.Close() userWSClient.Listen() @@ -420,8 +429,8 @@ func TestCreateUserWebSocketEvent(t *testing.T) { inviteId := th.BasicTeam.InviteId - _, resp = th.Client.CreateUserWithInviteId(&user, inviteId) - CheckNoError(t, resp) + _, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.NoError(t, err) CheckCreatedStatus(t, resp) var userHasReceived bool @@ -458,8 +467,8 @@ func TestCreateUserWithInviteId(t *testing.T) { inviteId := th.BasicTeam.InviteId - ruser, resp := th.Client.CreateUserWithInviteId(&user, inviteId) - CheckNoError(t, resp) + ruser, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) @@ -472,8 +481,8 @@ func TestCreateUserWithInviteId(t *testing.T) { inviteId := th.BasicTeam.InviteId - ruser, resp := client.CreateUserWithInviteId(&user, inviteId) - CheckNoError(t, resp) + ruser, resp, err := client.CreateUserWithInviteId(&user, inviteId) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) @@ -486,38 +495,38 @@ func TestCreateUserWithInviteId(t *testing.T) { user := model.User{Email: th.GenerateTestEmail(), Nickname: "", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} th.BasicTeam.GroupConstrained = model.NewBool(true) - team, err := th.App.UpdateTeam(th.BasicTeam) - require.Nil(t, err) + team, appErr := th.App.UpdateTeam(th.BasicTeam) + require.Nil(t, appErr) defer func() { th.BasicTeam.GroupConstrained = model.NewBool(false) - _, err = th.App.UpdateTeam(th.BasicTeam) - require.Nil(t, err) + _, appErr = th.App.UpdateTeam(th.BasicTeam) + require.Nil(t, appErr) }() inviteID := team.InviteId - _, resp := th.Client.CreateUserWithInviteId(&user, inviteID) - require.Equal(t, "app.team.invite_id.group_constrained.error", resp.Error.Id) + _, _, err := th.Client.CreateUserWithInviteId(&user, inviteID) + CheckErrorID(t, err, "app.team.invite_id.group_constrained.error") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := model.User{Email: th.GenerateTestEmail(), Nickname: "", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} th.BasicTeam.GroupConstrained = model.NewBool(true) - team, err := th.App.UpdateTeam(th.BasicTeam) - require.Nil(t, err) + team, appErr := th.App.UpdateTeam(th.BasicTeam) + require.Nil(t, appErr) defer func() { th.BasicTeam.GroupConstrained = model.NewBool(false) - _, err = th.App.UpdateTeam(th.BasicTeam) - require.Nil(t, err) + _, appErr = th.App.UpdateTeam(th.BasicTeam) + require.Nil(t, appErr) }() inviteID := team.InviteId - _, resp := client.CreateUserWithInviteId(&user, inviteID) - require.Equal(t, "app.team.invite_id.group_constrained.error", resp.Error.Id) + _, _, err := client.CreateUserWithInviteId(&user, inviteID) + CheckErrorID(t, err, "app.team.invite_id.group_constrained.error") }, "GroupConstrainedTeam") t.Run("WrongInviteId", func(t *testing.T) { @@ -525,17 +534,18 @@ func TestCreateUserWithInviteId(t *testing.T) { inviteId := model.NewId() - _, resp := th.Client.CreateUserWithInviteId(&user, inviteId) + _, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.Error(t, err) CheckNotFoundStatus(t, resp) - CheckErrorMessage(t, resp, "app.team.get_by_invite_id.finding.app_error") + CheckErrorID(t, err, "app.team.get_by_invite_id.finding.app_error") }) t.Run("NoInviteId", func(t *testing.T) { user := model.User{Email: th.GenerateTestEmail(), Nickname: "Corey Hulen", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} - _, resp := th.Client.CreateUserWithInviteId(&user, "") - CheckBadRequestStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.missing_invite_id.app_error") + _, _, err := th.Client.CreateUserWithInviteId(&user, "") + require.Error(t, err) + CheckErrorID(t, err, "api.user.create_user.missing_invite_id.app_error") }) t.Run("ExpiredInviteId", func(t *testing.T) { @@ -543,12 +553,13 @@ func TestCreateUserWithInviteId(t *testing.T) { inviteId := th.BasicTeam.InviteId - _, resp := th.SystemAdminClient.RegenerateTeamInviteId(th.BasicTeam.Id) - CheckNoError(t, resp) + _, _, err := th.SystemAdminClient.RegenerateTeamInviteId(th.BasicTeam.Id) + require.NoError(t, err) - _, resp = th.Client.CreateUserWithInviteId(&user, inviteId) + _, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.Error(t, err) CheckNotFoundStatus(t, resp) - CheckErrorMessage(t, resp, "app.team.get_by_invite_id.finding.app_error") + CheckErrorID(t, err, "app.team.get_by_invite_id.finding.app_error") }) t.Run("EnableUserCreationDisable", func(t *testing.T) { @@ -563,9 +574,10 @@ func TestCreateUserWithInviteId(t *testing.T) { inviteId := th.BasicTeam.InviteId - _, resp := th.Client.CreateUserWithInviteId(&user, inviteId) + _, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_email_disabled.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_email_disabled.app_error") }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := model.User{Email: th.GenerateTestEmail(), Nickname: "Corey Hulen", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} @@ -576,9 +588,10 @@ func TestCreateUserWithInviteId(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserCreation = false }) inviteId := th.BasicTeam.InviteId - _, resp := client.CreateUserWithInviteId(&user, inviteId) + _, resp, err := client.CreateUserWithInviteId(&user, inviteId) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.user.create_user.signup_email_disabled.app_error") + CheckErrorID(t, err, "api.user.create_user.signup_email_disabled.app_error") }, "EnableUserCreationDisable") t.Run("EnableOpenServerDisable", func(t *testing.T) { @@ -591,12 +604,12 @@ func TestCreateUserWithInviteId(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = false }) - team, res := th.SystemAdminClient.RegenerateTeamInviteId(th.BasicTeam.Id) - assert.Nil(t, res.Error) + team, _, err := th.SystemAdminClient.RegenerateTeamInviteId(th.BasicTeam.Id) + assert.NoError(t, err) inviteId := team.InviteId - ruser, resp := th.Client.CreateUserWithInviteId(&user, inviteId) - CheckNoError(t, resp) + ruser, resp, err := th.Client.CreateUserWithInviteId(&user, inviteId) + require.NoError(t, err) CheckCreatedStatus(t, resp) th.Client.Login(user.Email, user.Password) @@ -610,13 +623,14 @@ func TestGetMe(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - ruser, resp := th.Client.GetMe("") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetMe("") + require.NoError(t, err) require.Equal(t, th.BasicUser.Id, ruser.Id) th.Client.Logout() - _, resp = th.Client.GetMe("") + _, resp, err := th.Client.GetMe("") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -630,8 +644,8 @@ func TestGetUser(t *testing.T) { th.App.UpdateUser(user, false) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - ruser, resp := client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, resp, err := client.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -640,13 +654,15 @@ func TestGetUser(t *testing.T) { assert.Equal(t, ruser.Props["testpropkey"], "testpropvalue") require.False(t, ruser.IsBot) - ruser, resp = client.GetUser(user.Id, resp.Etag) + ruser, resp, _ = client.GetUser(user.Id, resp.Etag) CheckEtag(t, ruser, resp) - _, resp = client.GetUser("junk", "") + _, resp, err = client.GetUser("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.GetUser(model.NewId(), "") + _, resp, err = client.GetUser(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -654,19 +670,20 @@ func TestGetUser(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = false }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) - ruser, resp := th.Client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUser(user.Id, "") + require.NoError(t, err) require.Empty(t, ruser.Email, "email should be blank") require.Empty(t, ruser.FirstName, "first name should be blank") require.Empty(t, ruser.LastName, "last name should be blank") th.Client.Logout() - _, resp = th.Client.GetUser(user.Id, "") + _, resp, err := th.Client.GetUser(user.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) // System admins should ignore privacy settings - ruser, _ = th.SystemAdminClient.GetUser(user.Id, resp.Etag) + ruser, _, _ = th.SystemAdminClient.GetUser(user.Id, resp.Etag) require.NotEmpty(t, ruser.Email, "email should not be blank") require.NotEmpty(t, ruser.FirstName, "first name should not be blank") require.NotEmpty(t, ruser.LastName, "last name should not be blank") @@ -682,8 +699,8 @@ func TestGetUserWithAcceptedTermsOfServiceForOtherUser(t *testing.T) { th.App.UpdateUser(user, false) - ruser, resp := th.Client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -692,8 +709,8 @@ func TestGetUserWithAcceptedTermsOfServiceForOtherUser(t *testing.T) { th.App.SaveUserTermsOfService(user.Id, tos.Id, true) - ruser, resp = th.Client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err = th.Client.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -710,8 +727,8 @@ func TestGetUserWithAcceptedTermsOfService(t *testing.T) { tos, _ := th.App.CreateTermsOfService("Dummy TOS", user.Id) - ruser, resp := th.Client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -720,8 +737,8 @@ func TestGetUserWithAcceptedTermsOfService(t *testing.T) { th.App.SaveUserTermsOfService(user.Id, tos.Id, true) - ruser, resp = th.Client.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err = th.Client.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -739,8 +756,8 @@ func TestGetUserWithAcceptedTermsOfServiceWithAdminUser(t *testing.T) { tos, _ := th.App.CreateTermsOfService("Dummy TOS", user.Id) - ruser, resp := th.SystemAdminClient.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err := th.SystemAdminClient.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -749,8 +766,8 @@ func TestGetUserWithAcceptedTermsOfServiceWithAdminUser(t *testing.T) { th.App.SaveUserTermsOfService(user.Id, tos.Id, true) - ruser, resp = th.SystemAdminClient.GetUser(user.Id, "") - CheckNoError(t, resp) + ruser, _, err = th.SystemAdminClient.GetUser(user.Id, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -778,12 +795,13 @@ func TestGetBotUser(t *testing.T) { Description: "bot", } - createdBot, resp := th.Client.CreateBot(bot) + createdBot, resp, err := th.Client.CreateBot(bot) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - botUser, resp := th.Client.GetUser(createdBot.UserId, "") - CheckNoError(t, resp) + botUser, _, err := th.Client.GetUser(createdBot.UserId, "") + require.NoError(t, err) require.Equal(t, bot.Username, botUser.Username) require.True(t, botUser.IsBot) } @@ -795,16 +813,17 @@ func TestGetUserByUsername(t *testing.T) { user := th.BasicUser th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - ruser, resp := client.GetUserByUsername(user.Username, "") - CheckNoError(t, resp) + ruser, resp, err := client.GetUserByUsername(user.Username, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) - ruser, resp = client.GetUserByUsername(user.Username, resp.Etag) + ruser, resp, _ = client.GetUserByUsername(user.Username, resp.Etag) CheckEtag(t, ruser, resp) - _, resp = client.GetUserByUsername(GenerateTestUsername(), "") + _, resp, err = client.GetUserByUsername(GenerateTestUsername(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) @@ -812,24 +831,25 @@ func TestGetUserByUsername(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = false }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) - ruser, resp := th.Client.GetUserByUsername(th.BasicUser2.Username, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUserByUsername(th.BasicUser2.Username, "") + require.NoError(t, err) require.Empty(t, ruser.Email, "email should be blank") require.Empty(t, ruser.FirstName, "first name should be blank") require.Empty(t, ruser.LastName, "last name should be blank") - ruser, resp = th.Client.GetUserByUsername(th.BasicUser.Username, "") - CheckNoError(t, resp) + ruser, _, err = th.Client.GetUserByUsername(th.BasicUser.Username, "") + require.NoError(t, err) require.NotEmpty(t, ruser.NotifyProps, "notify props should be sent") th.Client.Logout() - _, resp = th.Client.GetUserByUsername(user.Username, "") + _, resp, err := th.Client.GetUserByUsername(user.Username, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { // System admins should ignore privacy settings - ruser, _ = client.GetUserByUsername(user.Username, resp.Etag) + ruser, _, _ = client.GetUserByUsername(user.Username, resp.Etag) require.NotEmpty(t, ruser.Email, "email should not be blank") require.NotEmpty(t, ruser.FirstName, "first name should not be blank") require.NotEmpty(t, ruser.LastName, "last name should not be blank") @@ -842,8 +862,8 @@ func TestGetUserByUsernameWithAcceptedTermsOfService(t *testing.T) { user := th.BasicUser - ruser, resp := th.Client.GetUserByUsername(user.Username, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUserByUsername(user.Username, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -851,8 +871,8 @@ func TestGetUserByUsernameWithAcceptedTermsOfService(t *testing.T) { tos, _ := th.App.CreateTermsOfService("Dummy TOS", user.Id) th.App.SaveUserTermsOfService(ruser.Id, tos.Id, true) - ruser, resp = th.Client.GetUserByUsername(user.Username, "") - CheckNoError(t, resp) + ruser, _, err = th.Client.GetUserByUsername(user.Username, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) @@ -866,7 +886,7 @@ func TestSaveUserTermsOfService(t *testing.T) { t.Run("Invalid data", func(t *testing.T) { resp, err := th.Client.DoApiPost("/users/"+th.BasicUser.Id+"/terms_of_service", "{}") - require.NotNil(t, err) + require.Error(t, err) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) } @@ -876,12 +896,12 @@ func TestGetUserByEmail(t *testing.T) { defer th.TearDown() user := th.CreateUser() - userWithSlash, resp := th.SystemAdminClient.CreateUser(&model.User{ + userWithSlash, _, err := th.SystemAdminClient.CreateUser(&model.User{ Email: "email/with/slashes@example.com", Username: GenerateTestUsername(), Password: "Pa$$word11", }) - require.Nil(t, resp.Error) + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = true @@ -890,34 +910,36 @@ func TestGetUserByEmail(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { t.Run("should be able to get another user by email", func(t *testing.T) { - ruser, resp := client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err := client.GetUserByEmail(user.Email, "") + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, user.Email, ruser.Email) }) t.Run("Get user with a / character in the email", func(t *testing.T) { - ruser, resp := client.GetUserByEmail(userWithSlash.Email, "") - require.Nil(t, resp.Error) + ruser, _, err := client.GetUserByEmail(userWithSlash.Email, "") + require.NoError(t, err) require.Equal(t, ruser.Id, userWithSlash.Id) }) t.Run("should return not modified when provided with a matching etag", func(t *testing.T) { - _, resp := client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + _, resp, err := client.GetUserByEmail(user.Email, "") + require.NoError(t, err) - ruser, resp := client.GetUserByEmail(user.Email, resp.Etag) + ruser, resp, _ := client.GetUserByEmail(user.Email, resp.Etag) CheckEtag(t, ruser, resp) }) t.Run("should return bad request when given an invalid email", func(t *testing.T) { - _, resp := client.GetUserByEmail(GenerateTestUsername(), "") + _, resp, err := client.GetUserByEmail(GenerateTestUsername(), "") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("should return 404 when given a non-existent email", func(t *testing.T) { - _, resp := client.GetUserByEmail(th.GenerateTestEmail(), "") + _, resp, err := client.GetUserByEmail(th.GenerateTestEmail(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }) }) @@ -928,8 +950,8 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowFullName = false }) - ruser, resp := th.Client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.Equal(t, "", ruser.FirstName, "first name should be blank") assert.Equal(t, "", ruser.LastName, "last name should be blank") @@ -937,8 +959,8 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowFullName = true }) - ruser, resp = th.Client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err = th.Client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.NotEqual(t, "", ruser.FirstName, "first name should be set") assert.NotEqual(t, "", ruser.LastName, "last name should be set") }) @@ -948,15 +970,16 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowEmailAddress = false }) - _, resp := th.Client.GetUserByEmail(user.Email, "") + _, resp, err := th.Client.GetUserByEmail(user.Email, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = true }) - ruser, resp := th.Client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.Equal(t, user.Email, ruser.Email, "email should be set") }) @@ -967,8 +990,8 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowFullName = false }) - ruser, resp := client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err := client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.NotEqual(t, "", ruser.FirstName, "first name should be set") assert.NotEqual(t, "", ruser.LastName, "last name should be set") @@ -976,8 +999,8 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowFullName = true }) - ruser, resp = client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err = client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.NotEqual(t, "", ruser.FirstName, "first name should be set") assert.NotEqual(t, "", ruser.LastName, "last name should be set") }) @@ -987,16 +1010,16 @@ func TestGetUserByEmail(t *testing.T) { *cfg.PrivacySettings.ShowEmailAddress = false }) - ruser, resp := client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err := client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.Equal(t, user.Email, ruser.Email, "email should be set") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = true }) - ruser, resp = client.GetUserByEmail(user.Email, "") - CheckNoError(t, resp) + ruser, _, err = client.GetUserByEmail(user.Email, "") + require.NoError(t, err) assert.Equal(t, user.Email, ruser.Email, "email should be set") }) }) @@ -1008,26 +1031,26 @@ func TestSearchUsers(t *testing.T) { search := &model.UserSearch{Term: th.BasicUser.Username} - users, resp := th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err := th.Client.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(th.BasicUser.Id, users), "should have found user") - _, err := th.App.UpdateActive(th.Context, th.BasicUser2, false) - require.Nil(t, err) + _, appErr := th.App.UpdateActive(th.Context, th.BasicUser2, false) + require.Nil(t, appErr) search.Term = th.BasicUser2.Username search.AllowInactive = false - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser2.Id, users), "should not have found user") search.AllowInactive = true - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(th.BasicUser2.Id, users), "should have found user") @@ -1035,15 +1058,15 @@ func TestSearchUsers(t *testing.T) { search.AllowInactive = false search.TeamId = th.BasicTeam.Id - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(th.BasicUser.Id, users), "should have found user") search.NotInChannelId = th.BasicChannel.Id - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser.Id, users), "should not have found user") @@ -1051,29 +1074,33 @@ func TestSearchUsers(t *testing.T) { search.NotInChannelId = "" search.InChannelId = th.BasicChannel.Id - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(th.BasicUser.Id, users), "should have found user") search.InChannelId = "" search.NotInChannelId = th.BasicChannel.Id - _, resp = th.Client.SearchUsers(search) + _, resp, err := th.Client.SearchUsers(search) + require.Error(t, err) CheckBadRequestStatus(t, resp) search.NotInChannelId = model.NewId() search.TeamId = model.NewId() - _, resp = th.Client.SearchUsers(search) + _, resp, err = th.Client.SearchUsers(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) search.NotInChannelId = "" search.TeamId = model.NewId() - _, resp = th.Client.SearchUsers(search) + _, resp, err = th.Client.SearchUsers(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) search.InChannelId = model.NewId() search.TeamId = "" - _, resp = th.Client.SearchUsers(search) + _, resp, err = th.Client.SearchUsers(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) // Test search for users not in any team @@ -1082,29 +1109,30 @@ func TestSearchUsers(t *testing.T) { search.InChannelId = "" search.NotInTeamId = th.BasicTeam.Id - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser.Id, users), "should not have found user") oddUser := th.CreateUser() search.Term = oddUser.Username - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(oddUser.Id, users), "should have found user") - _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, oddUser.Id) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, oddUser.Id) + require.NoError(t, err) - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(oddUser.Id, users), "should not have found user") search.NotInTeamId = model.NewId() - _, resp = th.Client.SearchUsers(search) + _, resp, err = th.Client.SearchUsers(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) search.Term = th.BasicUser.Username @@ -1112,26 +1140,26 @@ func TestSearchUsers(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = false }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) - _, err = th.App.UpdateActive(th.Context, th.BasicUser2, true) - require.Nil(t, err) + _, appErr = th.App.UpdateActive(th.Context, th.BasicUser2, true) + require.Nil(t, appErr) search.InChannelId = "" search.NotInTeamId = "" search.Term = th.BasicUser2.Email - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser2.Id, users), "should not have found user") search.Term = th.BasicUser2.FirstName - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser2.Id, users), "should not have found user") search.Term = th.BasicUser2.LastName - users, resp = th.Client.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) require.False(t, findUserInList(th.BasicUser2.Id, users), "should not have found user") @@ -1139,46 +1167,48 @@ func TestSearchUsers(t *testing.T) { search.InChannelId = th.BasicChannel.Id search.NotInChannelId = th.BasicChannel.Id search.TeamId = th.BasicTeam.Id - users, resp = th.SystemAdminClient.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.SystemAdminClient.SearchUsers(search) + require.NoError(t, err) require.True(t, findUserInList(th.BasicUser.Id, users), "should have found user") id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) + assert.Nil(t, appErr) search = &model.UserSearch{Term: th.BasicUser.Username, InGroupId: group.Id} t.Run("Requires ldap license when searching in group", func(t *testing.T) { - _, resp = th.SystemAdminClient.SearchUsers(search) + _, resp, err = th.SystemAdminClient.SearchUsers(search) + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) th.App.Srv().SetLicense(model.NewTestLicense("ldap")) t.Run("Requires manage system permission when searching for users in a group", func(t *testing.T) { - _, resp = th.Client.SearchUsers(search) + _, resp, err = th.Client.SearchUsers(search) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("Returns empty list when no users found searching for users in a group", func(t *testing.T) { - users, resp = th.SystemAdminClient.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.SystemAdminClient.SearchUsers(search) + require.NoError(t, err) require.Empty(t, users) }) - _, err = th.App.UpsertGroupMember(group.Id, th.BasicUser.Id) - assert.Nil(t, err) + _, appErr = th.App.UpsertGroupMember(group.Id, th.BasicUser.Id) + assert.Nil(t, appErr) t.Run("Returns user in group user found in group", func(t *testing.T) { - users, resp = th.SystemAdminClient.SearchUsers(search) - CheckNoError(t, resp) + users, _, err = th.SystemAdminClient.SearchUsers(search) + require.NoError(t, err) require.Equal(t, users[0].Id, th.BasicUser.Id) }) } @@ -1250,11 +1280,11 @@ func TestAutocompleteUsersInChannel(t *testing.T) { for _, tc := range tt { t.Run(tc.Name, func(t *testing.T) { th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") + rusers, _, err := th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") if tc.ShouldFail { - CheckErrorMessage(t, resp, "api.user.autocomplete_users.missing_team_id.app_error") + CheckErrorID(t, err, "api.user.autocomplete_users.missing_team_id.app_error") } else { - CheckNoError(t, resp) + require.NoError(t, err) if tc.MoreThan { assert.True(t, len(rusers.Users) >= tc.ExpectedResults) } else { @@ -1263,11 +1293,13 @@ func TestAutocompleteUsersInChannel(t *testing.T) { } th.Client.Logout() - _, resp = th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") + _, resp, err := th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(newUser.Email, newUser.Password) - _, resp = th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") + _, resp, err = th.Client.AutocompleteUsersInChannel(tc.TeamId, tc.ChannelId, tc.Username, model.UserSearchDefaultLimit, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -1276,8 +1308,8 @@ func TestAutocompleteUsersInChannel(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsersInChannel(teamId, channelId, username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsersInChannel(teamId, channelId, username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Equal(t, rusers.Users[0].FirstName, "", "should not show first/last name") assert.Equal(t, rusers.Users[0].LastName, "", "should not show first/last name") @@ -1295,8 +1327,8 @@ func TestAutocompleteUsersInChannel(t *testing.T) { th.Client.Login(permissionsUser.Email, permissionsUser.Password) - rusers, resp := th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Len(t, rusers.OutOfChannel, 1) defaultRolePermissions := th.SaveDefaultRolePermissions() @@ -1307,20 +1339,20 @@ func TestAutocompleteUsersInChannel(t *testing.T) { th.RemovePermissionFromRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) th.RemovePermissionFromRole(model.PermissionViewMembers.Id, model.TeamUserRoleId) - rusers, resp = th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Empty(t, rusers.OutOfChannel) th.App.GetOrCreateDirectChannel(th.Context, permissionsUser.Id, otherUser.Id) - rusers, resp = th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.AutocompleteUsersInChannel(teamId, channelId, "", model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Len(t, rusers.OutOfChannel, 1) }) t.Run("user must have access to team id, especially when it does not match channel's team id", func(t *testing.T) { - _, resp := th.Client.AutocompleteUsersInChannel("otherTeamId", channelId, username, model.UserSearchDefaultLimit, "") - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + _, _, err := th.Client.AutocompleteUsersInChannel("otherTeamId", channelId, username, model.UserSearchDefaultLimit, "") + CheckErrorID(t, err, "api.context.permissions.app_error") }) } @@ -1364,19 +1396,21 @@ func TestAutocompleteUsersInTeam(t *testing.T) { for _, tc := range tt { t.Run(tc.Name, func(t *testing.T) { th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) if tc.MoreThan { assert.True(t, len(rusers.Users) >= tc.ExpectedResults) } else { assert.Len(t, rusers.Users, tc.ExpectedResults) } th.Client.Logout() - _, resp = th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") + _, resp, err := th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(newUser.Email, newUser.Password) - _, resp = th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") + _, resp, err = th.Client.AutocompleteUsersInTeam(tc.TeamId, tc.Username, model.UserSearchDefaultLimit, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -1385,8 +1419,8 @@ func TestAutocompleteUsersInTeam(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsersInTeam(teamId, username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsersInTeam(teamId, username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Equal(t, rusers.Users[0].FirstName, "", "should not show first/last name") assert.Equal(t, rusers.Users[0].LastName, "", "should not show first/last name") @@ -1428,8 +1462,8 @@ func TestAutocompleteUsers(t *testing.T) { for _, tc := range tt { t.Run(tc.Name, func(t *testing.T) { th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) if tc.MoreThan { assert.True(t, len(rusers.Users) >= tc.ExpectedResults) } else { @@ -1437,12 +1471,13 @@ func TestAutocompleteUsers(t *testing.T) { } th.Client.Logout() - _, resp = th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") + _, resp, err := th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(newUser.Email, newUser.Password) - _, resp = th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + _, _, err = th.Client.AutocompleteUsers(tc.Username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) }) } @@ -1450,8 +1485,8 @@ func TestAutocompleteUsers(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowFullName = false }) th.LoginBasic() - rusers, resp := th.Client.AutocompleteUsers(username, model.UserSearchDefaultLimit, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.AutocompleteUsers(username, model.UserSearchDefaultLimit, "") + require.NoError(t, err) assert.Equal(t, rusers.Users[0].FirstName, "", "should not show first/last name") assert.Equal(t, rusers.Users[0].LastName, "", "should not show first/last name") @@ -1467,28 +1502,31 @@ func TestGetProfileImage(t *testing.T) { th.LoginBasic() user := th.BasicUser - data, resp := th.Client.GetProfileImage(user.Id, "") - CheckNoError(t, resp) + data, resp, err := th.Client.GetProfileImage(user.Id, "") + require.NoError(t, err) require.NotEmpty(t, data, "should not be empty") - _, resp = th.Client.GetProfileImage(user.Id, resp.Etag) + _, resp, _ = th.Client.GetProfileImage(user.Id, resp.Etag) require.NotEqual(t, http.StatusNotModified, resp.StatusCode, "should not hit etag") - _, resp = th.Client.GetProfileImage("junk", "") + _, resp, err = th.Client.GetProfileImage("junk", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.GetProfileImage(model.NewId(), "") + _, resp, err = th.Client.GetProfileImage(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetProfileImage(user.Id, "") + _, resp, err = th.Client.GetProfileImage(user.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetProfileImage(user.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetProfileImage(user.Id, "") + require.NoError(t, err) info := &model.FileInfo{Path: "/users/" + user.Id + "/profile.png"} - err := th.cleanupTestFile(info) + err = th.cleanupTestFile(info) require.NoError(t, err) } @@ -1498,31 +1536,28 @@ func TestGetUsersByIds(t *testing.T) { th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { t.Run("should return the user", func(t *testing.T) { - users, resp := client.GetUsersByIds([]string{th.BasicUser.Id}) - - CheckNoError(t, resp) + users, _, err := client.GetUsersByIds([]string{th.BasicUser.Id}) + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, users[0].Id) CheckUserSanitization(t, users[0]) }) t.Run("should return error when no IDs are specified", func(t *testing.T) { - _, resp := client.GetUsersByIds([]string{}) - + _, resp, err := client.GetUsersByIds([]string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("should not return an error for invalid IDs", func(t *testing.T) { - users, resp := client.GetUsersByIds([]string{"junk"}) - - CheckNoError(t, resp) + users, _, err := client.GetUsersByIds([]string{"junk"}) + require.NoError(t, err) require.Empty(t, users, "no users should be returned") }) t.Run("should still return users for valid IDs when invalid IDs are specified", func(t *testing.T) { - users, resp := client.GetUsersByIds([]string{"junk", th.BasicUser.Id}) - - CheckNoError(t, resp) + users, _, err := client.GetUsersByIds([]string{"junk", th.BasicUser.Id}) + require.NoError(t, err) require.Len(t, users, 1, "1 user should be returned") }) @@ -1531,7 +1566,8 @@ func TestGetUsersByIds(t *testing.T) { t.Run("should return error when not logged in", func(t *testing.T) { th.Client.Logout() - _, resp := th.Client.GetUsersByIds([]string{th.BasicUser.Id}) + _, resp, err := th.Client.GetUsersByIds([]string{th.BasicUser.Id}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -1542,21 +1578,21 @@ func TestGetUsersByIdsWithOptions(t *testing.T) { defer th.TearDown() // Users before the timestamp shouldn't be returned - user1, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) - require.Nil(t, err) + user1, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) + require.Nil(t, appErr) - user2, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) - require.Nil(t, err) + user2, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) + require.Nil(t, appErr) // Users not in the list of IDs shouldn't be returned - _, err = th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) - require.Nil(t, err) + _, appErr = th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Username: model.NewId(), Password: model.NewId()}) + require.Nil(t, appErr) - users, resp := th.Client.GetUsersByIdsWithOptions([]string{user1.Id, user2.Id}, &model.UserGetByIdsOptions{ + users, _, err := th.Client.GetUsersByIdsWithOptions([]string{user1.Id, user2.Id}, &model.UserGetByIdsOptions{ Since: user2.UpdateAt - 1, }) - assert.Nil(t, resp.Error) + assert.NoError(t, err) assert.Len(t, users, 1) assert.Equal(t, users[0].Id, user2.Id) }) @@ -1566,11 +1602,11 @@ func TestGetUsersByGroupChannelIds(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - gc1, err := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, th.BasicUser.Id) - require.Nil(t, err) + gc1, appErr := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, th.BasicUser.Id) + require.Nil(t, appErr) - usersByChannelId, resp := th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) - CheckNoError(t, resp) + usersByChannelId, _, err := th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) + require.NoError(t, err) users, ok := usersByChannelId[gc1.Id] assert.True(t, ok) @@ -1582,14 +1618,15 @@ func TestGetUsersByGroupChannelIds(t *testing.T) { require.ElementsMatch(t, []string{th.SystemAdminUser.Id, th.TeamAdminUser.Id}, userIds) th.LoginBasic2() - usersByChannelId, resp = th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) - CheckNoError(t, resp) + usersByChannelId, _, err = th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) + require.NoError(t, err) _, ok = usersByChannelId[gc1.Id] require.False(t, ok) th.Client.Logout() - _, resp = th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) + _, resp, err := th.Client.GetUsersByGroupChannelIds([]string{gc1.Id}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -1597,25 +1634,27 @@ func TestGetUsersByUsernames(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - users, resp := th.Client.GetUsersByUsernames([]string{th.BasicUser.Username}) - CheckNoError(t, resp) + users, _, err := th.Client.GetUsersByUsernames([]string{th.BasicUser.Username}) + require.NoError(t, err) require.Equal(t, th.BasicUser.Id, users[0].Id) CheckUserSanitization(t, users[0]) - _, resp = th.Client.GetUsersByIds([]string{}) + _, resp, err := th.Client.GetUsersByIds([]string{}) + require.Error(t, err) CheckBadRequestStatus(t, resp) - users, resp = th.Client.GetUsersByUsernames([]string{"junk"}) - CheckNoError(t, resp) + users, _, err = th.Client.GetUsersByUsernames([]string{"junk"}) + require.NoError(t, err) require.Empty(t, users, "no users should be returned") - users, resp = th.Client.GetUsersByUsernames([]string{"junk", th.BasicUser.Username}) - CheckNoError(t, resp) + users, _, err = th.Client.GetUsersByUsernames([]string{"junk", th.BasicUser.Username}) + require.NoError(t, err) require.Len(t, users, 1, "1 user should be returned") th.Client.Logout() - _, resp = th.Client.GetUsersByUsernames([]string{th.BasicUser.Username}) + _, resp, err = th.Client.GetUsersByUsernames([]string{th.BasicUser.Username}) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -1628,8 +1667,8 @@ func TestGetTotalUsersStat(t *testing.T) { IncludeBotAccounts: true, }) - rstats, resp := th.Client.GetTotalUsersStats("") - CheckNoError(t, resp) + rstats, _, err := th.Client.GetTotalUsersStats("") + require.NoError(t, err) require.Equal(t, total, rstats.TotalUsersCount) } @@ -1645,8 +1684,8 @@ func TestUpdateUser(t *testing.T) { user.Roles = model.SystemUserRoleId user.LastPasswordUpdate = 123 - ruser, resp := th.Client.UpdateUser(user) - CheckNoError(t, resp) + ruser, _, err := th.Client.UpdateUser(user) + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, "Joram Wilander", ruser.Nickname, "Nickname should update properly") @@ -1654,30 +1693,33 @@ func TestUpdateUser(t *testing.T) { require.NotEqual(t, 123, ruser.LastPasswordUpdate, "LastPasswordUpdate should not update") ruser.Email = th.GenerateTestEmail() - _, resp = th.Client.UpdateUser(ruser) + _, resp, err := th.Client.UpdateUser(ruser) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { ruser.Email = th.GenerateTestEmail() - _, resp = client.UpdateUser(user) - CheckNoError(t, resp) + _, _, err = client.UpdateUser(user) + require.NoError(t, err) }) ruser.Password = user.Password - ruser, resp = th.Client.UpdateUser(ruser) - CheckNoError(t, resp) + ruser, _, err = th.Client.UpdateUser(ruser) + require.NoError(t, err) CheckUserSanitization(t, ruser) ruser.Id = "junk" - _, resp = th.Client.UpdateUser(ruser) + _, resp, err = th.Client.UpdateUser(ruser) + require.Error(t, err) CheckBadRequestStatus(t, resp) ruser.Id = model.NewId() - _, resp = th.Client.UpdateUser(ruser) + _, resp, err = th.Client.UpdateUser(ruser) + require.Error(t, err) CheckForbiddenStatus(t, resp) r, err := th.Client.DoApiPut("/users/"+ruser.Id, "garbage") - require.NotNil(t, err) + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) session, _ := th.App.GetSession(th.Client.AuthToken) @@ -1686,20 +1728,23 @@ func TestUpdateUser(t *testing.T) { ruser.Id = user.Id ruser.Email = th.GenerateTestEmail() - _, resp = th.Client.UpdateUser(ruser) + _, resp, err = th.Client.UpdateUser(ruser) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.UpdateUser(user) + _, resp, err = th.Client.UpdateUser(user) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() - _, resp = th.Client.UpdateUser(user) + _, resp, err = th.Client.UpdateUser(user) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.UpdateUser(user) - CheckNoError(t, resp) + _, _, err = client.UpdateUser(user) + require.NoError(t, err) }) } @@ -1714,9 +1759,9 @@ func TestPatchUser(t *testing.T) { patch := &model.UserPatch{} patch.Timezone = model.StringMap{} patch.Timezone["manualTimezone"] = string(make([]byte, model.UserTimezoneMaxRunes)) - ruser, resp := th.Client.PatchUser(user.Id, patch) + ruser, resp, err := th.Client.PatchUser(user.Id, patch) CheckBadRequestStatus(t, resp) - require.Equal(t, "model.user.is_valid.timezone_limit.app_error", resp.Error.Id) + CheckErrorID(t, err, "model.user.is_valid.timezone_limit.app_error") require.Nil(t, ruser) }) @@ -1733,8 +1778,8 @@ func TestPatchUser(t *testing.T) { patch.Timezone["automaticTimezone"] = "America/New_York" patch.Timezone["manualTimezone"] = "" - ruser, resp := th.Client.PatchUser(user.Id, patch) - CheckNoError(t, resp) + ruser, _, err := th.Client.PatchUser(user.Id, patch) + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, "Joram Wilander", ruser.Nickname, "Nickname should update properly") @@ -1748,43 +1793,47 @@ func TestPatchUser(t *testing.T) { require.Equal(t, "America/New_York", ruser.Timezone["automaticTimezone"], "automaticTimezone should update properly") require.Empty(t, ruser.Timezone["manualTimezone"], "manualTimezone should update properly") - err := th.App.CheckPasswordAndAllCriteria(ruser, *patch.Password, "") - require.NotNil(t, err, "Password should not match") + appErr := th.App.CheckPasswordAndAllCriteria(ruser, *patch.Password, "") + require.NotNil(t, appErr, "Password should not match") currentPassword := user.Password - user, err = th.App.GetUser(ruser.Id) - require.Nil(t, err) + user, appErr = th.App.GetUser(ruser.Id) + require.Nil(t, appErr) - err = th.App.CheckPasswordAndAllCriteria(user, currentPassword, "") - require.Nil(t, err, "Password should still match") + appErr = th.App.CheckPasswordAndAllCriteria(user, currentPassword, "") + require.Nil(t, appErr, "Password should still match") patch = &model.UserPatch{} patch.Email = model.NewString(th.GenerateTestEmail()) - _, resp = th.Client.PatchUser(user.Id, patch) + _, resp, err := th.Client.PatchUser(user.Id, patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) patch.Password = model.NewString(currentPassword) - ruser, resp = th.Client.PatchUser(user.Id, patch) - CheckNoError(t, resp) + ruser, _, err = th.Client.PatchUser(user.Id, patch) + require.NoError(t, err) require.Equal(t, *patch.Email, ruser.Email, "Email should update properly") patch.Username = model.NewString(th.BasicUser2.Username) - _, resp = th.Client.PatchUser(user.Id, patch) + _, resp, err = th.Client.PatchUser(user.Id, patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) patch.Username = nil - _, resp = th.Client.PatchUser("junk", patch) + _, resp, err = th.Client.PatchUser("junk", patch) + require.Error(t, err) CheckBadRequestStatus(t, resp) ruser.Id = model.NewId() - _, resp = th.Client.PatchUser(model.NewId(), patch) + _, resp, err = th.Client.PatchUser(model.NewId(), patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) r, err := th.Client.DoApiPut("/users/"+user.Id+"/patch", "garbage") - require.NotNil(t, err) + require.Error(t, err) require.Equal(t, http.StatusBadRequest, r.StatusCode) session, _ := th.App.GetSession(th.Client.AuthToken) @@ -1792,25 +1841,28 @@ func TestPatchUser(t *testing.T) { th.App.AddSessionToCache(session) patch.Email = model.NewString(th.GenerateTestEmail()) - _, resp = th.Client.PatchUser(user.Id, patch) + _, resp, err = th.Client.PatchUser(user.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.PatchUser(user.Id, patch) + _, resp, err = th.Client.PatchUser(user.Id, patch) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic() - _, resp = th.Client.PatchUser(user.Id, patch) + _, resp, err = th.Client.PatchUser(user.Id, patch) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.PatchUser(user.Id, patch) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.PatchUser(user.Id, patch) + require.NoError(t, err) } func TestUserUnicodeNames(t *testing.T) { th := Setup(t) defer th.TearDown() - Client := th.Client + client := th.Client t.Run("create user unicode", func(t *testing.T) { user := model.User{ @@ -1822,11 +1874,11 @@ func TestUserUnicodeNames(t *testing.T) { Username: "\ufeffwiggin77", Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} - ruser, resp := Client.CreateUser(&user) - CheckNoError(t, resp) + ruser, resp, err := client.CreateUser(&user) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, _ = Client.Login(user.Email, user.Password) + _, _, _ = client.Login(user.Email, user.Password) require.Equal(t, "wiggin77", ruser.Username, "Bad Unicode not filtered from username") require.Equal(t, "Andrew Wiggin", ruser.GetDisplayName(model.ShowFullName), "Bad Unicode not filtered from displayname") @@ -1835,15 +1887,15 @@ func TestUserUnicodeNames(t *testing.T) { t.Run("update user unicode", func(t *testing.T) { user := th.CreateUser() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) user.Username = "wiggin\ufff9" user.Nickname = "Ender\u0340 \ufffcWiggin" user.FirstName = "Andrew\ufff9" user.LastName = "Wig\u206fgin" - ruser, resp := Client.UpdateUser(user) - CheckNoError(t, resp) + ruser, _, err := client.UpdateUser(user) + require.NoError(t, err) require.Equal(t, "wiggin", ruser.Username, "bad unicode should be filtered from username") require.Equal(t, "Ender Wiggin", ruser.Nickname, "bad unicode should be filtered from nickname") @@ -1852,15 +1904,15 @@ func TestUserUnicodeNames(t *testing.T) { t.Run("patch user unicode", func(t *testing.T) { user := th.CreateUser() - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) patch := &model.UserPatch{} patch.Nickname = model.NewString("\U000E0000Ender\u206d Wiggin\U000E007F") patch.FirstName = model.NewString("\U0001d173Andrew\U0001d17a") patch.LastName = model.NewString("\u2028Wiggin\u2029") - ruser, resp := Client.PatchUser(user.Id, patch) - CheckNoError(t, resp) + ruser, _, err := client.PatchUser(user.Id, patch) + require.NoError(t, err) CheckUserSanitization(t, ruser) require.Equal(t, "Ender Wiggin", ruser.Nickname, "Bad unicode should be filtered from nickname") @@ -1888,14 +1940,14 @@ func TestUpdateUserAuth(t *testing.T) { userAuth.Password = user.Password // Regular user can not use endpoint - _, respErr := th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) + _, respErr, _ := th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) require.NotNil(t, respErr, "Shouldn't have permissions. Only Admins") userAuth.AuthData = model.NewString("test@test.com") userAuth.AuthService = model.UserAuthServiceSaml userAuth.Password = "newpassword" - ruser, resp := th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) - CheckNoError(t, resp) + ruser, _, err := th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) + require.NoError(t, err) // AuthData and AuthService are set, password is set to empty require.Equal(t, *userAuth.AuthData, *ruser.AuthData) @@ -1906,7 +1958,7 @@ func TestUpdateUserAuth(t *testing.T) { userAuth.AuthData = user.AuthData userAuth.AuthService = "" userAuth.Password = "1" - _, respErr = th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) + _, respErr, _ = th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) require.NotNil(t, respErr) // Regular user can not use endpoint @@ -1920,7 +1972,7 @@ func TestUpdateUserAuth(t *testing.T) { userAuth.AuthData = user.AuthData userAuth.AuthService = user.AuthService userAuth.Password = user.Password - _, respErr = th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) + _, respErr, _ = th.SystemAdminClient.UpdateUserAuth(user.Id, userAuth) require.NotNil(t, respErr, "Should have errored") } @@ -1929,42 +1981,48 @@ func TestDeleteUser(t *testing.T) { defer th.TearDown() th.LoginBasic() - _, resp := th.Client.DeleteUser(th.SystemAdminUser.Id) + resp, err := th.Client.DeleteUser(th.SystemAdminUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.DeleteUser(th.BasicUser.Id) + resp, err = th.Client.DeleteUser(th.BasicUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - _, resp = c.DeleteUser(model.NewId()) + resp, err = c.DeleteUser(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = c.DeleteUser("junk") + resp, err = c.DeleteUser("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) userToDelete := th.CreateUser() - _, resp = c.DeleteUser(userToDelete.Id) - CheckNoError(t, resp) + _, err = c.DeleteUser(userToDelete.Id) + require.NoError(t, err) }) selfDeleteUser := th.CreateUser() th.LoginBasic() - _, resp = th.Client.DeleteUser(selfDeleteUser.Id) + resp, err = th.Client.DeleteUser(selfDeleteUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Login(selfDeleteUser.Email, selfDeleteUser.Password) th.App.UpdateConfig(func(c *model.Config) { *c.TeamSettings.EnableUserDeactivation = false }) - _, resp = th.Client.DeleteUser(selfDeleteUser.Id) + resp, err = th.Client.DeleteUser(selfDeleteUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.App.UpdateConfig(func(c *model.Config) { *c.TeamSettings.EnableUserDeactivation = true }) - _, resp = th.Client.DeleteUser(selfDeleteUser.Id) - CheckNoError(t, resp) + _, err = th.Client.DeleteUser(selfDeleteUser.Id) + require.NoError(t, err) } func TestPermanentDeleteUser(t *testing.T) { @@ -1981,29 +2039,28 @@ func TestPermanentDeleteUser(t *testing.T) { userToDelete := th.CreateUser() t.Run("Permanent deletion not available through API if EnableAPIUserDeletion is not set", func(t *testing.T) { - _, resp := th.SystemAdminClient.PermanentDeleteUser(userToDelete.Id) + resp, err := th.SystemAdminClient.PermanentDeleteUser(userToDelete.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("Permanent deletion available through local mode even if EnableAPIUserDeletion is not set", func(t *testing.T) { - ok, resp := th.LocalClient.PermanentDeleteUser(userToDelete.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err := th.LocalClient.PermanentDeleteUser(userToDelete.Id) + require.NoError(t, err) }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIUserDeletion = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { userToDelete = th.CreateUser() - ok, resp := c.PermanentDeleteUser(userToDelete.Id) - CheckNoError(t, resp) - assert.True(t, ok) + _, err := c.PermanentDeleteUser(userToDelete.Id) + require.NoError(t, err) - _, err := th.App.GetTeam(userToDelete.Id) - assert.NotNil(t, err) + _, appErr := th.App.GetTeam(userToDelete.Id) + assert.NotNil(t, appErr) - ok, resp = c.PermanentDeleteUser("junk") + resp, err := c.PermanentDeleteUser("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - require.False(t, ok, "should have returned false") }, "Permanent deletion with EnableAPIUserDeletion set") } @@ -2012,60 +2069,62 @@ func TestPermanentDeleteAllUsers(t *testing.T) { defer th.TearDown() t.Run("The endpoint should not be available for neither normal nor sysadmin users", func(t *testing.T) { - _, resp := th.Client.PermanentDeleteAllUsers() + resp, err := th.Client.PermanentDeleteAllUsers() + require.Error(t, err) CheckNotFoundStatus(t, resp) - _, resp = th.SystemAdminClient.PermanentDeleteAllUsers() + resp, err = th.SystemAdminClient.PermanentDeleteAllUsers() + require.Error(t, err) CheckNotFoundStatus(t, resp) }) t.Run("The endpoint should permanently delete all users", func(t *testing.T) { // Basic user creates a team and a channel - team, err := th.App.CreateTeamWithUser(th.Context, &model.Team{ + team, appErr := th.App.CreateTeamWithUser(th.Context, &model.Team{ DisplayName: "User Created Team", Name: "user-created-team", Email: "usercreatedteam@test.com", Type: model.TeamOpen, }, th.BasicUser.Id) - require.Nil(t, err) + require.Nil(t, appErr) - channel, err := th.App.CreateChannelWithUser(th.Context, &model.Channel{ + channel, appErr := th.App.CreateChannelWithUser(th.Context, &model.Channel{ DisplayName: "User Created Channel", Name: "user-created-channel", Type: model.ChannelTypeOpen, TeamId: team.Id, }, th.BasicUser.Id) - require.Nil(t, err) + require.Nil(t, appErr) // Check that we have users and posts in the database - users, nErr := th.App.Srv().Store.User().GetAll() - require.NoError(t, nErr) + users, err := th.App.Srv().Store.User().GetAll() + require.NoError(t, err) require.Greater(t, len(users), 0) - postCount, nErr := th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) - require.NoError(t, nErr) + postCount, err := th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) + require.NoError(t, err) require.Greater(t, postCount, int64(0)) // Delete all users and their posts - _, resp := th.LocalClient.PermanentDeleteAllUsers() - require.Nil(t, resp.Error) + _, err = th.LocalClient.PermanentDeleteAllUsers() + require.NoError(t, err) // Check that both user and post tables are empty - users, nErr = th.App.Srv().Store.User().GetAll() - require.NoError(t, nErr) + users, err = th.App.Srv().Store.User().GetAll() + require.NoError(t, err) require.Len(t, users, 0) - postCount, nErr = th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) - require.NoError(t, nErr) + postCount, err = th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) + require.NoError(t, err) require.Equal(t, postCount, int64(0)) // Check that the channel and team created by the user were not deleted - rTeam, err := th.App.GetTeam(team.Id) - require.Nil(t, err) + rTeam, appErr := th.App.GetTeam(team.Id) + require.Nil(t, appErr) require.NotNil(t, rTeam) - rChannel, err := th.App.GetChannel(channel.Id) - require.Nil(t, err) + rChannel, appErr := th.App.GetChannel(channel.Id) + require.Nil(t, appErr) require.NotNil(t, rChannel) }) } @@ -2074,23 +2133,27 @@ func TestUpdateUserRoles(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.UpdateUserRoles(th.SystemAdminUser.Id, model.SystemUserRoleId) + resp, err := th.Client.UpdateUserRoles(th.SystemAdminUser.Id, model.SystemUserRoleId) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp = client.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId) - CheckNoError(t, resp) + _, err = client.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId) + require.NoError(t, err) - _, resp = client.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemAdminRoleId) - CheckNoError(t, resp) + _, err = client.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemAdminRoleId) + require.NoError(t, err) - _, resp = client.UpdateUserRoles(th.BasicUser.Id, "junk") + resp, err = client.UpdateUserRoles(th.BasicUser.Id, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.UpdateUserRoles("junk", model.SystemUserRoleId) + resp, err = client.UpdateUserRoles("junk", model.SystemUserRoleId) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = client.UpdateUserRoles(model.NewId(), model.SystemUserRoleId) + resp, err = client.UpdateUserRoles(model.NewId(), model.SystemUserRoleId) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } @@ -2151,15 +2214,13 @@ func TestUpdateUserActive(t *testing.T) { }) // deactivate 5th user, now we have 4 active users and are at limit - pass, resp := th.SystemAdminClient.UpdateUserActive(user.Id, false) - CheckNoError(t, resp) - require.True(t, pass) + _, err := th.SystemAdminClient.UpdateUserActive(user.Id, false) + require.NoError(t, err) // try and reactivate 5th user, not allowed because it exceeds the set cloud user limit - pass, resp = th.SystemAdminClient.UpdateUserActive(user.Id, true) + resp, err := th.SystemAdminClient.UpdateUserActive(user.Id, true) + CheckErrorMessage(t, err, "Unable to activate more users as the cloud account is over capacity.") CheckBadRequestStatus(t, resp) - require.False(t, pass) - require.Equal(t, resp.Error.Message, "Unable to activate more users as the cloud account is over capacity.") }) t.Run("basic tests", func(t *testing.T) { th := Setup(t).InitBasic() @@ -2168,52 +2229,52 @@ func TestUpdateUserActive(t *testing.T) { user := th.BasicUser th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserDeactivation = true }) - pass, resp := th.Client.UpdateUserActive(user.Id, false) - CheckNoError(t, resp) - - require.True(t, pass) + _, err := th.Client.UpdateUserActive(user.Id, false) + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserDeactivation = false }) - pass, resp = th.Client.UpdateUserActive(user.Id, false) + resp, err := th.Client.UpdateUserActive(user.Id, false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - require.False(t, pass) - th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserDeactivation = true }) - pass, resp = th.Client.UpdateUserActive(user.Id, false) + resp, err = th.Client.UpdateUserActive(user.Id, false) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - require.False(t, pass) - th.LoginBasic2() - _, resp = th.Client.UpdateUserActive(user.Id, true) + resp, err = th.Client.UpdateUserActive(user.Id, true) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.UpdateUserActive(GenerateTestId(), true) + resp, err = th.Client.UpdateUserActive(GenerateTestId(), true) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.UpdateUserActive("junk", true) + resp, err = th.Client.UpdateUserActive("junk", true) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.Client.Logout() - _, resp = th.Client.UpdateUserActive(user.Id, true) + resp, err = th.Client.UpdateUserActive(user.Id, true) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.UpdateUserActive(user.Id, true) - CheckNoError(t, resp) + _, err = client.UpdateUserActive(user.Id, true) + require.NoError(t, err) - _, resp = client.UpdateUserActive(user.Id, false) - CheckNoError(t, resp) + _, err = client.UpdateUserActive(user.Id, false) + require.NoError(t, err) authData := model.NewId() _, err := th.App.Srv().Store.User().UpdateAuthData(user.Id, "random", &authData, "", true) require.NoError(t, err) - _, resp = client.UpdateUserActive(user.Id, false) - CheckNoError(t, resp) + _, err = client.UpdateUserActive(user.Id, false) + require.NoError(t, err) }) }) @@ -2226,7 +2287,7 @@ func TestUpdateUserActive(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableUserDeactivation = true }) webSocketClient, err := th.CreateWebSocketClient() - assert.Nil(t, err) + assert.NoError(t, err) defer webSocketClient.Close() webSocketClient.Listen() @@ -2236,7 +2297,7 @@ func TestUpdateUserActive(t *testing.T) { require.Equal(t, model.StatusOk, resp.Status) adminWebSocketClient, err := th.CreateWebSocketSystemAdminClient() - assert.Nil(t, err) + assert.NoError(t, err) defer adminWebSocketClient.Close() adminWebSocketClient.Listen() @@ -2249,8 +2310,8 @@ func TestUpdateUserActive(t *testing.T) { // and confirm event is fired for SystemAdmin and Local mode th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, respErr := client.UpdateUserActive(user.Id, false) - CheckNoError(t, respErr) + _, err := client.UpdateUserActive(user.Id, false) + require.NoError(t, err) assertWebsocketEventUserUpdatedWithEmail(t, webSocketClient, user.Email) assertWebsocketEventUserUpdatedWithEmail(t, adminWebSocketClient, user.Email) @@ -2260,8 +2321,8 @@ func TestUpdateUserActive(t *testing.T) { // and confirm event is fired for SystemAdmin and Local mode th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PrivacySettings.ShowEmailAddress = false }) - _, respErr := client.UpdateUserActive(user.Id, true) - CheckNoError(t, respErr) + _, err := client.UpdateUserActive(user.Id, true) + require.NoError(t, err) assertWebsocketEventUserUpdatedWithEmail(t, webSocketClient, "") assertWebsocketEventUserUpdatedWithEmail(t, adminWebSocketClient, user.Email) @@ -2288,7 +2349,8 @@ func TestUpdateUserActive(t *testing.T) { defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.UpdateUserActive(user.Id, true) + resp, err := client.UpdateUserActive(user.Id, true) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) }) @@ -2305,14 +2367,14 @@ func TestUpdateUserActive(t *testing.T) { Password: "Password1", EmailVerified: true, } - user, err := th.App.CreateGuest(th.Context, guest) - require.Nil(t, err) + user, appErr := th.App.CreateGuest(th.Context, guest) + require.Nil(t, appErr) th.App.UpdateActive(th.Context, user, false) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.UpdateUserActive(user.Id, true) - CheckNoError(t, resp) + _, err := client.UpdateUserActive(user.Id, true) + require.NoError(t, err) }) }) } @@ -2322,31 +2384,32 @@ func TestGetUsers(t *testing.T) { defer th.TearDown() th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rusers, resp := client.GetUsers(0, 60, "") - CheckNoError(t, resp) + rusers, _, err := client.GetUsers(0, 60, "") + require.NoError(t, err) for _, u := range rusers { CheckUserSanitization(t, u) } - rusers, resp = client.GetUsers(0, 1, "") - CheckNoError(t, resp) + rusers, _, err = client.GetUsers(0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = client.GetUsers(1, 1, "") - CheckNoError(t, resp) + rusers, _, err = client.GetUsers(1, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = client.GetUsers(10000, 100, "") - CheckNoError(t, resp) + rusers, _, err = client.GetUsers(10000, 100, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") // Check default params for page and per_page - _, err := client.DoApiGet("/users", "") - require.Nil(t, err) + _, err = client.DoApiGet("/users", "") + require.NoError(t, err) }) th.Client.Logout() - _, resp := th.Client.GetUsers(0, 60, "") + _, resp, err := th.Client.GetUsers(0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2355,8 +2418,8 @@ func TestGetNewUsersInTeam(t *testing.T) { defer th.TearDown() teamId := th.BasicTeam.Id - rusers, resp := th.Client.GetNewUsersInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.GetNewUsersInTeam(teamId, 0, 60, "") + require.NoError(t, err) lastCreateAt := model.GetMillis() for _, u := range rusers { @@ -2365,12 +2428,13 @@ func TestGetNewUsersInTeam(t *testing.T) { CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetNewUsersInTeam(teamId, 1, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetNewUsersInTeam(teamId, 1, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") th.Client.Logout() - _, resp = th.Client.GetNewUsersInTeam(teamId, 1, 1, "") + _, resp, err := th.Client.GetNewUsersInTeam(teamId, 1, 1, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2381,20 +2445,21 @@ func TestGetRecentlyActiveUsersInTeam(t *testing.T) { th.App.SetStatusOnline(th.BasicUser.Id, true) - rusers, resp := th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 60, "") + require.NoError(t, err) for _, u := range rusers { require.NotZero(t, u.LastActivityAt, "should return last activity at") CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") th.Client.Logout() - _, resp = th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 1, "") + _, resp, err := th.Client.GetRecentlyActiveUsersInTeam(teamId, 0, 1, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2404,8 +2469,8 @@ func TestGetActiveUsersInTeam(t *testing.T) { teamId := th.BasicTeam.Id th.SystemAdminClient.UpdateUserActive(th.BasicUser2.Id, false) - rusers, resp := th.Client.GetActiveUsersInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.GetActiveUsersInTeam(teamId, 0, 60, "") + require.NoError(t, err) require.NotZero(t, len(rusers)) for _, u := range rusers { @@ -2414,16 +2479,17 @@ func TestGetActiveUsersInTeam(t *testing.T) { CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetActiveUsersInTeam(teamId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetActiveUsersInTeam(teamId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") // Check case where we have supplied both active and inactive flags - _, err := th.Client.DoApiGet("/users?inactive=true&active=true", "") - require.NotNil(t, err) + _, err = th.Client.DoApiGet("/users?inactive=true&active=true", "") + require.Error(t, err) th.Client.Logout() - _, resp = th.Client.GetActiveUsersInTeam(teamId, 0, 1, "") + _, resp, err := th.Client.GetActiveUsersInTeam(teamId, 0, 1, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2431,30 +2497,30 @@ func TestGetUsersWithoutTeam(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.GetUsersWithoutTeam(0, 100, "") - require.NotNil(t, resp.Error, "should prevent non-admin user from getting users without a team") + _, _, err := th.Client.GetUsersWithoutTeam(0, 100, "") + require.Error(t, err, "should prevent non-admin user from getting users without a team") // These usernames need to appear in the first 100 users for this to work - user, resp := th.Client.CreateUser(&model.User{ + user, _, err := th.Client.CreateUser(&model.User{ Username: "a000000000" + model.NewId(), Email: "success+" + model.NewId() + "@simulator.amazonses.com", Password: "Password1", }) - CheckNoError(t, resp) + require.NoError(t, err) th.LinkUserToTeam(user, th.BasicTeam) defer th.App.Srv().Store.User().PermanentDelete(user.Id) - user2, resp := th.Client.CreateUser(&model.User{ + user2, _, err := th.Client.CreateUser(&model.User{ Username: "a000000001" + model.NewId(), Email: "success+" + model.NewId() + "@simulator.amazonses.com", Password: "Password1", }) - CheckNoError(t, resp) + require.NoError(t, err) defer th.App.Srv().Store.User().PermanentDelete(user2.Id) - rusers, resp := th.SystemAdminClient.GetUsersWithoutTeam(0, 100, "") - CheckNoError(t, resp) + rusers, _, err := th.SystemAdminClient.GetUsersWithoutTeam(0, 100, "") + require.NoError(t, err) found1 := false found2 := false @@ -2476,38 +2542,40 @@ func TestGetUsersInTeam(t *testing.T) { defer th.TearDown() teamId := th.BasicTeam.Id - rusers, resp := th.Client.GetUsersInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + rusers, resp, err := th.Client.GetUsersInTeam(teamId, 0, 60, "") + require.NoError(t, err) for _, u := range rusers { CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetUsersInTeam(teamId, 0, 60, resp.Etag) + rusers, resp, _ = th.Client.GetUsersInTeam(teamId, 0, 60, resp.Etag) CheckEtag(t, rusers, resp) - rusers, resp = th.Client.GetUsersInTeam(teamId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInTeam(teamId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersInTeam(teamId, 1, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInTeam(teamId, 1, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersInTeam(teamId, 10000, 100, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInTeam(teamId, 10000, 100, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") th.Client.Logout() - _, resp = th.Client.GetUsersInTeam(teamId, 0, 60, "") + _, resp, err = th.Client.GetUsersInTeam(teamId, 0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() th.Client.Login(user.Email, user.Password) - _, resp = th.Client.GetUsersInTeam(teamId, 0, 60, "") + _, resp, err = th.Client.GetUsersInTeam(teamId, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetUsersInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetUsersInTeam(teamId, 0, 60, "") + require.NoError(t, err) } func TestGetUsersNotInTeam(t *testing.T) { @@ -2515,39 +2583,41 @@ func TestGetUsersNotInTeam(t *testing.T) { defer th.TearDown() teamId := th.BasicTeam.Id - rusers, resp := th.Client.GetUsersNotInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + rusers, resp, err := th.Client.GetUsersNotInTeam(teamId, 0, 60, "") + require.NoError(t, err) for _, u := range rusers { CheckUserSanitization(t, u) } require.Len(t, rusers, 2, "should be 2 users in total") - rusers, resp = th.Client.GetUsersNotInTeam(teamId, 0, 60, resp.Etag) + rusers, resp, _ = th.Client.GetUsersNotInTeam(teamId, 0, 60, resp.Etag) CheckEtag(t, rusers, resp) - rusers, resp = th.Client.GetUsersNotInTeam(teamId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersNotInTeam(teamId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersNotInTeam(teamId, 2, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersNotInTeam(teamId, 2, 1, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") - rusers, resp = th.Client.GetUsersNotInTeam(teamId, 10000, 100, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersNotInTeam(teamId, 10000, 100, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") th.Client.Logout() - _, resp = th.Client.GetUsersNotInTeam(teamId, 0, 60, "") + _, resp, err = th.Client.GetUsersNotInTeam(teamId, 0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() th.Client.Login(user.Email, user.Password) - _, resp = th.Client.GetUsersNotInTeam(teamId, 0, 60, "") + _, resp, err = th.Client.GetUsersNotInTeam(teamId, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetUsersNotInTeam(teamId, 0, 60, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetUsersNotInTeam(teamId, 0, 60, "") + require.NoError(t, err) } func TestGetUsersInChannel(t *testing.T) { @@ -2555,35 +2625,37 @@ func TestGetUsersInChannel(t *testing.T) { defer th.TearDown() channelId := th.BasicChannel.Id - rusers, resp := th.Client.GetUsersInChannel(channelId, 0, 60, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.GetUsersInChannel(channelId, 0, 60, "") + require.NoError(t, err) for _, u := range rusers { CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetUsersInChannel(channelId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInChannel(channelId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersInChannel(channelId, 1, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInChannel(channelId, 1, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersInChannel(channelId, 10000, 100, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersInChannel(channelId, 10000, 100, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") th.Client.Logout() - _, resp = th.Client.GetUsersInChannel(channelId, 0, 60, "") + _, resp, err := th.Client.GetUsersInChannel(channelId, 0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) user := th.CreateUser() th.Client.Login(user.Email, user.Password) - _, resp = th.Client.GetUsersInChannel(channelId, 0, 60, "") + _, resp, err = th.Client.GetUsersInChannel(channelId, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetUsersInChannel(channelId, 0, 60, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetUsersInChannel(channelId, 0, 60, "") + require.NoError(t, err) } func TestGetUsersNotInChannel(t *testing.T) { @@ -2595,30 +2667,32 @@ func TestGetUsersNotInChannel(t *testing.T) { user := th.CreateUser() th.LinkUserToTeam(user, th.BasicTeam) - rusers, resp := th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") - CheckNoError(t, resp) + rusers, _, err := th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + require.NoError(t, err) for _, u := range rusers { CheckUserSanitization(t, u) } - rusers, resp = th.Client.GetUsersNotInChannel(teamId, channelId, 0, 1, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersNotInChannel(teamId, channelId, 0, 1, "") + require.NoError(t, err) require.Len(t, rusers, 1, "should be 1 per page") - rusers, resp = th.Client.GetUsersNotInChannel(teamId, channelId, 10000, 100, "") - CheckNoError(t, resp) + rusers, _, err = th.Client.GetUsersNotInChannel(teamId, channelId, 10000, 100, "") + require.NoError(t, err) require.Empty(t, rusers, "should be no users") th.Client.Logout() - _, resp = th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + _, resp, err := th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(user.Email, user.Password) - _, resp = th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + _, resp, err = th.Client.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.SystemAdminClient.GetUsersNotInChannel(teamId, channelId, 0, 60, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetUsersNotInChannel(teamId, channelId, 0, 60, "") + require.NoError(t, err) } func TestGetUsersInGroup(t *testing.T) { @@ -2626,20 +2700,18 @@ func TestGetUsersInGroup(t *testing.T) { defer th.TearDown() id := model.NewId() - group, err := th.App.CreateGroup(&model.Group{ + group, appErr := th.App.CreateGroup(&model.Group{ DisplayName: "dn-foo_" + id, Name: model.NewString("name" + id), Source: model.GroupSourceLdap, Description: "description_" + id, RemoteId: model.NewId(), }) - assert.Nil(t, err) - - var response *model.Response - var users []*model.User + assert.Nil(t, appErr) t.Run("Requires ldap license", func(t *testing.T) { - _, response = th.SystemAdminClient.GetUsersInGroup(group.Id, 0, 60, "") + _, response, err := th.SystemAdminClient.GetUsersInGroup(group.Id, 0, 60, "") + require.Error(t, err) CheckNotImplementedStatus(t, response) }) @@ -2647,7 +2719,8 @@ func TestGetUsersInGroup(t *testing.T) { t.Run("Requires manage system permission to access users in group", func(t *testing.T) { th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - _, response = th.Client.GetUsersInGroup(group.Id, 0, 60, "") + _, response, err := th.Client.GetUsersInGroup(group.Id, 0, 60, "") + require.Error(t, err) CheckForbiddenStatus(t, response) }) @@ -2657,14 +2730,14 @@ func TestGetUsersInGroup(t *testing.T) { assert.Nil(t, err) t.Run("Returns users in group when called by system admin", func(t *testing.T) { - users, response = th.SystemAdminClient.GetUsersInGroup(group.Id, 0, 60, "") - CheckNoError(t, response) + users, _, err := th.SystemAdminClient.GetUsersInGroup(group.Id, 0, 60, "") + require.NoError(t, err) assert.Equal(t, users[0].Id, user1.Id) }) t.Run("Returns no users when pagination out of range", func(t *testing.T) { - users, response = th.SystemAdminClient.GetUsersInGroup(group.Id, 5, 60, "") - CheckNoError(t, response) + users, _, err := th.SystemAdminClient.GetUsersInGroup(group.Id, 5, 60, "") + require.NoError(t, err) assert.Empty(t, users) }) } @@ -2680,12 +2753,13 @@ func TestUpdateUserMfa(t *testing.T) { session.IsOAuth = true th.App.AddSessionToCache(session) - _, resp := th.Client.UpdateUserMfa(th.BasicUser.Id, "12345", false) + resp, err := th.Client.UpdateUserMfa(th.BasicUser.Id, "12345", false) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, resp := client.UpdateUserMfa(th.BasicUser.Id, "12345", false) - CheckNoError(t, resp) + _, err = client.UpdateUserMfa(th.BasicUser.Id, "12345", false) + require.NoError(t, err) }) } @@ -2699,58 +2773,58 @@ func TestUserLoginMFAFlow(t *testing.T) { }) t.Run("WithoutMFA", func(t *testing.T) { - _, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + _, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) }) t.Run("WithInvalidMFA", func(t *testing.T) { - secret, err := th.App.GenerateMfaSecret(th.BasicUser.Id) - assert.Nil(t, err) + secret, appErr := th.App.GenerateMfaSecret(th.BasicUser.Id) + assert.Nil(t, appErr) // Fake user has MFA enabled - nErr := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.NoError(t, nErr) + err := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.NoError(t, err) - nErr = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.NoError(t, nErr) + err = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.NoError(t, err) - nErr = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) - require.NoError(t, nErr) + err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) + require.NoError(t, err) - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckErrorMessage(t, resp, "mfa.validate_token.authenticate.app_error") + user, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + CheckErrorID(t, err, "mfa.validate_token.authenticate.app_error") assert.Nil(t, user) - user, resp = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, "") - CheckErrorMessage(t, resp, "mfa.validate_token.authenticate.app_error") + user, _, err = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, "") + CheckErrorID(t, err, "mfa.validate_token.authenticate.app_error") assert.Nil(t, user) - user, resp = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, "abcdefgh") - CheckErrorMessage(t, resp, "mfa.validate_token.authenticate.app_error") + user, _, err = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, "abcdefgh") + CheckErrorID(t, err, "mfa.validate_token.authenticate.app_error") assert.Nil(t, user) - secret2, err := th.App.GenerateMfaSecret(th.BasicUser2.Id) - assert.Nil(t, err) - user, resp = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, secret2.Secret) - CheckErrorMessage(t, resp, "mfa.validate_token.authenticate.app_error") + secret2, appErr := th.App.GenerateMfaSecret(th.BasicUser2.Id) + assert.Nil(t, appErr) + user, _, err = th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, secret2.Secret) + CheckErrorID(t, err, "mfa.validate_token.authenticate.app_error") assert.Nil(t, user) }) t.Run("WithCorrectMFA", func(t *testing.T) { - secret, err := th.App.GenerateMfaSecret(th.BasicUser.Id) - assert.Nil(t, err) + secret, appErr := th.App.GenerateMfaSecret(th.BasicUser.Id) + assert.Nil(t, appErr) // Fake user has MFA enabled - nErr := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.NoError(t, nErr) + err := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.NoError(t, err) - nErr = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) - require.NoError(t, nErr) + err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) + require.NoError(t, err) code := dgoogauth.ComputeCode(secret.Secret, time.Now().UTC().Unix()/30) - user, resp := th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, fmt.Sprintf("%06d", code)) - CheckNoError(t, resp) + user, _, err := th.Client.LoginWithMFA(th.BasicUser.Email, th.BasicUser.Password, fmt.Sprintf("%06d", code)) + require.NoError(t, err) assert.NotNil(t, user) }) } @@ -2761,31 +2835,37 @@ func TestGenerateMfaSecret(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableMultifactorAuthentication = false }) - _, resp := th.Client.GenerateMfaSecret(th.BasicUser.Id) + _, resp, err := th.Client.GenerateMfaSecret(th.BasicUser.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - _, resp = th.SystemAdminClient.GenerateMfaSecret(th.BasicUser.Id) + _, resp, err = th.SystemAdminClient.GenerateMfaSecret(th.BasicUser.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - _, resp = th.Client.GenerateMfaSecret("junk") + _, resp, err = th.Client.GenerateMfaSecret("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) th.App.Srv().SetLicense(model.NewTestLicense("mfa")) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableMultifactorAuthentication = true }) - _, resp = th.Client.GenerateMfaSecret(model.NewId()) + _, resp, err = th.Client.GenerateMfaSecret(model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) session, _ := th.App.GetSession(th.Client.AuthToken) session.IsOAuth = true th.App.AddSessionToCache(session) - _, resp = th.Client.GenerateMfaSecret(th.BasicUser.Id) + _, resp, err = th.Client.GenerateMfaSecret(th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GenerateMfaSecret(th.BasicUser.Id) + _, resp, err = th.Client.GenerateMfaSecret(th.BasicUser.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -2794,35 +2874,40 @@ func TestUpdateUserPassword(t *testing.T) { defer th.TearDown() password := "newpassword1" - pass, resp := th.Client.UpdateUserPassword(th.BasicUser.Id, th.BasicUser.Password, password) - CheckNoError(t, resp) + _, err := th.Client.UpdateUserPassword(th.BasicUser.Id, th.BasicUser.Password, password) + require.NoError(t, err) - require.True(t, pass) - - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, password, "") + resp, err := th.Client.UpdateUserPassword(th.BasicUser.Id, password, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, password, "junk") + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, password, "junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword("junk", password, password) + resp, err = th.Client.UpdateUserPassword("junk", password, password) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, "", password) + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, "", password) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, "junk", password) + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, "junk", password) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, password, th.BasicUser.Password) - CheckNoError(t, resp) + _, err = th.Client.UpdateUserPassword(th.BasicUser.Id, password, th.BasicUser.Password) + require.NoError(t, err) th.Client.Logout() - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, password, password) + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, password, password) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.LoginBasic2() - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, password, password) + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, password, password) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() @@ -2831,25 +2916,25 @@ func TestUpdateUserPassword(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.MaximumLoginAttempts = 2 }) // Fail twice - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, "badpwd", "newpwd") + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, "badpwd", "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, "badpwd", "newpwd") + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, "badpwd", "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) // Should fail because account is locked out - _, resp = th.Client.UpdateUserPassword(th.BasicUser.Id, th.BasicUser.Password, "newpwd") - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") + resp, err = th.Client.UpdateUserPassword(th.BasicUser.Id, th.BasicUser.Password, "newpwd") + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") CheckUnauthorizedStatus(t, resp) // System admin can update another user's password adminSetPassword := "pwdsetbyadmin" - pass, resp = th.SystemAdminClient.UpdateUserPassword(th.BasicUser.Id, "", adminSetPassword) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.UpdateUserPassword(th.BasicUser.Id, "", adminSetPassword) + require.NoError(t, err) - require.True(t, pass) - - _, resp = th.Client.Login(th.BasicUser.Email, adminSetPassword) - CheckNoError(t, resp) + _, _, err = th.Client.Login(th.BasicUser.Email, adminSetPassword) + require.NoError(t, err) } func TestUpdateUserHashedPassword(t *testing.T) { @@ -2860,19 +2945,18 @@ func TestUpdateUserHashedPassword(t *testing.T) { password := "SuperSecurePass23!" passwordHash := "$2a$10$CiS1iWVPUj7rQNdY6XW53.DmaPLsETIvmW2p0asp4Dqpofs10UL5W" th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - pass, resp := client.UpdateUserHashedPassword(th.BasicUser.Id, passwordHash) - CheckNoError(t, resp) - require.True(t, pass) + _, err := client.UpdateUserHashedPassword(th.BasicUser.Id, passwordHash) + require.NoError(t, err) }) - _, resp := client.Login(th.BasicUser.Email, password) - CheckNoError(t, resp) + _, _, err := client.Login(th.BasicUser.Email, password) + require.NoError(t, err) // Standard users should never be updating their passwords with already- // hashed passwords. - pass, resp := client.UpdateUserHashedPassword(th.BasicUser.Id, passwordHash) + resp, err := client.UpdateUserHashedPassword(th.BasicUser.Id, passwordHash) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - require.False(t, pass) } func TestResetPassword(t *testing.T) { @@ -2885,15 +2969,14 @@ func TestResetPassword(t *testing.T) { // Delete all the messages before check the reset password mail.DeleteMailBox(user.Email) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - success, resp := client.SendPasswordResetEmail(user.Email) - CheckNoError(t, resp) - require.True(t, success, "should succeed") - _, resp = client.SendPasswordResetEmail("") + _, err := client.SendPasswordResetEmail(user.Email) + require.NoError(t, err) + resp, err := client.SendPasswordResetEmail("") + require.Error(t, err) CheckBadRequestStatus(t, resp) // Should not leak whether the email is attached to an account or not - success, resp = client.SendPasswordResetEmail("notreal@example.com") - CheckNoError(t, resp) - require.True(t, success, "should succeed") + _, err = client.SendPasswordResetEmail("notreal@example.com") + require.NoError(t, err) }) // Check if the email was send to the right email address and the recovery key match var resultsMailbox mail.JSONMessageHeaderInbucket @@ -2919,32 +3002,38 @@ func TestResetPassword(t *testing.T) { recoveryToken, err := th.App.Srv().Store.Token().GetByToken(recoveryTokenString) require.NoError(t, err, "Recovery token not found (%s)", recoveryTokenString) - _, resp := th.Client.ResetPassword(recoveryToken.Token, "") + resp, err := th.Client.ResetPassword(recoveryToken.Token, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.ResetPassword(recoveryToken.Token, "newp") + resp, err = th.Client.ResetPassword(recoveryToken.Token, "newp") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.ResetPassword("", "newpwd") + resp, err = th.Client.ResetPassword("", "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.ResetPassword("junk", "newpwd") + resp, err = th.Client.ResetPassword("junk", "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) code := "" for i := 0; i < model.TokenSize; i++ { code += "a" } - _, resp = th.Client.ResetPassword(code, "newpwd") + resp, err = th.Client.ResetPassword(code, "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) - success, resp := th.Client.ResetPassword(recoveryToken.Token, "newpwd") - CheckNoError(t, resp) - require.True(t, success) + _, err = th.Client.ResetPassword(recoveryToken.Token, "newpwd") + require.NoError(t, err) th.Client.Login(user.Email, "newpwd") th.Client.Logout() - _, resp = th.Client.ResetPassword(recoveryToken.Token, "newpwd") + resp, err = th.Client.ResetPassword(recoveryToken.Token, "newpwd") + require.Error(t, err) CheckBadRequestStatus(t, resp) authData := model.NewId() _, err = th.App.Srv().Store.User().UpdateAuthData(user.Id, "random", &authData, "", true) require.NoError(t, err) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp = client.SendPasswordResetEmail(user.Email) + resp, err = client.SendPasswordResetEmail(user.Email) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) } @@ -2957,33 +3046,37 @@ func TestGetSessions(t *testing.T) { th.Client.Login(user.Email, user.Password) - sessions, resp := th.Client.GetSessions(user.Id, "") + sessions, _, err := th.Client.GetSessions(user.Id, "") + require.NoError(t, err) for _, session := range sessions { require.Equal(t, user.Id, session.UserId, "user id should match session user id") } - CheckNoError(t, resp) - _, resp = th.Client.RevokeSession("junk", model.NewId()) + resp, err := th.Client.RevokeSession("junk", model.NewId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.GetSessions(th.BasicUser2.Id, "") + _, resp, err = th.Client.GetSessions(th.BasicUser2.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.GetSessions(model.NewId(), "") + _, resp, err = th.Client.GetSessions(model.NewId(), "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetSessions(th.BasicUser2.Id, "") + _, resp, err = th.Client.GetSessions(th.BasicUser2.Id, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetSessions(user.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetSessions(user.Id, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetSessions(th.BasicUser2.Id, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetSessions(th.BasicUser2.Id, "") + require.NoError(t, err) - _, resp = th.SystemAdminClient.GetSessions(model.NewId(), "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetSessions(model.NewId(), "") + require.NoError(t, err) } func TestRevokeSessions(t *testing.T) { @@ -2992,50 +3085,55 @@ func TestRevokeSessions(t *testing.T) { user := th.BasicUser th.Client.Login(user.Email, user.Password) - sessions, _ := th.Client.GetSessions(user.Id, "") + sessions, _, _ := th.Client.GetSessions(user.Id, "") require.NotZero(t, len(sessions), "sessions should exist") for _, session := range sessions { require.Equal(t, user.Id, session.UserId, "user id does not match session user id") } session := sessions[0] - _, resp := th.Client.RevokeSession(user.Id, model.NewId()) + resp, err := th.Client.RevokeSession(user.Id, model.NewId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.RevokeSession(th.BasicUser2.Id, model.NewId()) + resp, err = th.Client.RevokeSession(th.BasicUser2.Id, model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.RevokeSession("junk", model.NewId()) + resp, err = th.Client.RevokeSession("junk", model.NewId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - status, resp := th.Client.RevokeSession(user.Id, session.Id) - require.True(t, status, "user session revoke successfully") - CheckNoError(t, resp) + _, err = th.Client.RevokeSession(user.Id, session.Id) + require.NoError(t, err) th.LoginBasic() sessions, _ = th.App.GetSessions(th.SystemAdminUser.Id) session = sessions[0] - _, resp = th.Client.RevokeSession(user.Id, session.Id) + resp, err = th.Client.RevokeSession(user.Id, session.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) th.Client.Logout() - _, resp = th.Client.RevokeSession(user.Id, model.NewId()) + resp, err = th.Client.RevokeSession(user.Id, model.NewId()) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.RevokeSession(user.Id, model.NewId()) + resp, err = th.SystemAdminClient.RevokeSession(user.Id, model.NewId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - sessions, _ = th.SystemAdminClient.GetSessions(th.SystemAdminUser.Id, "") + sessions, _, _ = th.SystemAdminClient.GetSessions(th.SystemAdminUser.Id, "") require.NotEmpty(t, sessions, "sessions should exist") for _, session := range sessions { require.Equal(t, th.SystemAdminUser.Id, session.UserId, "user id should match session user id") } session = sessions[0] - _, resp = th.SystemAdminClient.RevokeSession(th.SystemAdminUser.Id, session.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.RevokeSession(th.SystemAdminUser.Id, session.Id) + require.NoError(t, err) } func TestRevokeAllSessions(t *testing.T) { @@ -3045,32 +3143,35 @@ func TestRevokeAllSessions(t *testing.T) { user := th.BasicUser th.Client.Login(user.Email, user.Password) - _, resp := th.Client.RevokeAllSessions(th.BasicUser2.Id) + resp, err := th.Client.RevokeAllSessions(th.BasicUser2.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = th.Client.RevokeAllSessions("junk" + user.Id) + resp, err = th.Client.RevokeAllSessions("junk" + user.Id) + require.Error(t, err) CheckBadRequestStatus(t, resp) - status, resp := th.Client.RevokeAllSessions(user.Id) - require.True(t, status, "user all sessions revoke unsuccessful") - CheckNoError(t, resp) + _, err = th.Client.RevokeAllSessions(user.Id) + require.NoError(t, err) th.Client.Logout() - _, resp = th.Client.RevokeAllSessions(user.Id) + resp, err = th.Client.RevokeAllSessions(user.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(user.Email, user.Password) - sessions, _ := th.Client.GetSessions(user.Id, "") + sessions, _, _ := th.Client.GetSessions(user.Id, "") require.NotEmpty(t, sessions, "session should exist") - _, resp = th.Client.RevokeAllSessions(user.Id) - CheckNoError(t, resp) + _, err = th.Client.RevokeAllSessions(user.Id) + require.NoError(t, err) - sessions, _ = th.SystemAdminClient.GetSessions(user.Id, "") + sessions, _, _ = th.SystemAdminClient.GetSessions(user.Id, "") require.Empty(t, sessions, "no sessions should exist for user") - _, resp = th.Client.RevokeAllSessions(user.Id) + resp, err = th.Client.RevokeAllSessions(user.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -3080,11 +3181,13 @@ func TestRevokeSessionsFromAllUsers(t *testing.T) { user := th.BasicUser th.Client.Login(user.Email, user.Password) - _, resp := th.Client.RevokeSessionsFromAllUsers() + resp, err := th.Client.RevokeSessionsFromAllUsers() + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.RevokeSessionsFromAllUsers() + resp, err = th.Client.RevokeSessionsFromAllUsers() + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.Login(user.Email, user.Password) @@ -3096,12 +3199,13 @@ func TestRevokeSessionsFromAllUsers(t *testing.T) { sessions, err = th.Server.Store.Session().GetSessions(admin.Id) require.NotEmpty(t, sessions) require.NoError(t, err) - _, resp = th.Client.RevokeSessionsFromAllUsers() - CheckNoError(t, resp) + _, err = th.Client.RevokeSessionsFromAllUsers() + require.NoError(t, err) // All sessions were revoked, so making the same call // again will fail due to lack of a session. - _, resp = th.Client.RevokeSessionsFromAllUsers() + resp, err = th.Client.RevokeSessionsFromAllUsers() + require.Error(t, err) CheckUnauthorizedStatus(t, resp) sessions, err = th.Server.Store.Session().GetSessions(user.Id) @@ -3137,29 +3241,30 @@ func TestAttachDeviceId(t *testing.T) { *cfg.ServiceSettings.SiteURL = tc.SiteURL }) - pass, resp := th.Client.AttachDeviceId(deviceId) - CheckNoError(t, resp) + resp, err := th.Client.AttachDeviceId(deviceId) + require.NoError(t, err) cookies := resp.Header.Get("Set-Cookie") assert.Regexp(t, tc.ExpectedSetCookieHeaderRegexp, cookies) - assert.True(t, pass) - sessions, err := th.App.GetSessions(th.BasicUser.Id) - require.Nil(t, err) + sessions, appErr := th.App.GetSessions(th.BasicUser.Id) + require.Nil(t, appErr) assert.Equal(t, deviceId, sessions[0].DeviceId, "Missing device Id") }) } }) t.Run("invalid device id", func(t *testing.T) { - _, resp := th.Client.AttachDeviceId("") + resp, err := th.Client.AttachDeviceId("") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("not logged in", func(t *testing.T) { th.Client.Logout() - _, resp := th.Client.AttachDeviceId("") + resp, err := th.Client.AttachDeviceId("") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -3169,21 +3274,23 @@ func TestGetUserAudits(t *testing.T) { defer th.TearDown() user := th.BasicUser - audits, resp := th.Client.GetUserAudits(user.Id, 0, 100, "") + audits, _, err := th.Client.GetUserAudits(user.Id, 0, 100, "") for _, audit := range audits { require.Equal(t, user.Id, audit.UserId, "user id should match audit user id") } - CheckNoError(t, resp) + require.NoError(t, err) - _, resp = th.Client.GetUserAudits(th.BasicUser2.Id, 0, 100, "") + _, resp, err := th.Client.GetUserAudits(th.BasicUser2.Id, 0, 100, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetUserAudits(user.Id, 0, 100, "") + _, resp, err = th.Client.GetUserAudits(user.Id, 0, 100, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) - _, resp = th.SystemAdminClient.GetUserAudits(user.Id, 0, 100, "") - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.GetUserAudits(user.Id, 0, 100, "") + require.NoError(t, err) } func TestVerifyUserEmail(t *testing.T) { @@ -3193,18 +3300,20 @@ func TestVerifyUserEmail(t *testing.T) { email := th.GenerateTestEmail() user := model.User{Email: email, Nickname: "Darth Vader", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId} - ruser, _ := th.Client.CreateUser(&user) + ruser, _, _ := th.Client.CreateUser(&user) token, err := th.App.Srv().EmailService.CreateVerifyEmailToken(ruser.Id, email) require.NoError(t, err, "Unable to create email verify token") - _, resp := th.Client.VerifyUserEmail(token.Token) - CheckNoError(t, resp) + _, err = th.Client.VerifyUserEmail(token.Token) + require.NoError(t, err) - _, resp = th.Client.VerifyUserEmail(GenerateTestId()) + resp, err := th.Client.VerifyUserEmail(GenerateTestId()) + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = th.Client.VerifyUserEmail("") + resp, err = th.Client.VerifyUserEmail("") + require.Error(t, err) CheckBadRequestStatus(t, resp) } @@ -3212,21 +3321,20 @@ func TestSendVerificationEmail(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - pass, resp := th.Client.SendVerificationEmail(th.BasicUser.Email) - CheckNoError(t, resp) + _, err := th.Client.SendVerificationEmail(th.BasicUser.Email) + require.NoError(t, err) - require.True(t, pass, "should have passed") - - _, resp = th.Client.SendVerificationEmail("") + resp, err := th.Client.SendVerificationEmail("") + require.Error(t, err) CheckBadRequestStatus(t, resp) // Even non-existent emails should return 200 OK - _, resp = th.Client.SendVerificationEmail(th.GenerateTestEmail()) - CheckNoError(t, resp) + _, err = th.Client.SendVerificationEmail(th.GenerateTestEmail()) + require.NoError(t, err) th.Client.Logout() - _, resp = th.Client.SendVerificationEmail(th.BasicUser.Email) - CheckNoError(t, resp) + _, err = th.Client.SendVerificationEmail(th.BasicUser.Email) + require.NoError(t, err) } func TestSetProfileImage(t *testing.T) { @@ -3237,18 +3345,18 @@ func TestSetProfileImage(t *testing.T) { data, err := testutils.ReadTestFile("test.png") require.NoError(t, err) - ok, resp := th.Client.SetProfileImage(user.Id, data) - require.Truef(t, ok, "%v", resp.Error) - CheckNoError(t, resp) + _, err = th.Client.SetProfileImage(user.Id, data) + require.NoError(t, err) - ok, resp = th.Client.SetProfileImage(model.NewId(), data) - require.False(t, ok, "Should return false, set profile image not allowed") + resp, err := th.Client.SetProfileImage(model.NewId(), data) + require.Error(t, err) CheckForbiddenStatus(t, resp) // status code returns either forbidden or unauthorized // note: forbidden is set as default at Client4.SetProfileImage when request is terminated early by server th.Client.Logout() - _, resp = th.Client.SetProfileImage(user.Id, data) + resp, err = th.Client.SetProfileImage(user.Id, data) + require.Error(t, err) if resp.StatusCode == http.StatusForbidden { CheckForbiddenStatus(t, resp) } else if resp.StatusCode == http.StatusUnauthorized { @@ -3260,8 +3368,8 @@ func TestSetProfileImage(t *testing.T) { buser, appErr := th.App.GetUser(user.Id) require.Nil(t, appErr) - _, resp = th.SystemAdminClient.SetProfileImage(user.Id, data) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.SetProfileImage(user.Id, data) + require.NoError(t, err) ruser, appErr := th.App.GetUser(user.Id) require.Nil(t, appErr) @@ -3270,8 +3378,8 @@ func TestSetProfileImage(t *testing.T) { data2, err := testutils.ReadTestFile("testjpg.jpg") require.NoError(t, err) - _, resp = th.SystemAdminClient.SetProfileImage(user.Id, data2) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.SetProfileImage(user.Id, data2) + require.NoError(t, err) ruser, appErr = th.App.GetUser(user.Id) require.Nil(t, appErr) @@ -3288,18 +3396,18 @@ func TestSetDefaultProfileImage(t *testing.T) { defer th.TearDown() user := th.BasicUser - ok, resp := th.Client.SetDefaultProfileImage(user.Id) - require.True(t, ok) - CheckNoError(t, resp) + _, err := th.Client.SetDefaultProfileImage(user.Id) + require.NoError(t, err) - ok, resp = th.Client.SetDefaultProfileImage(model.NewId()) - require.False(t, ok, "Should return false, set profile image not allowed") + resp, err := th.Client.SetDefaultProfileImage(model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) // status code returns either forbidden or unauthorized // note: forbidden is set as default at Client4.SetDefaultProfileImage when request is terminated early by server th.Client.Logout() - _, resp = th.Client.SetDefaultProfileImage(user.Id) + resp, err = th.Client.SetDefaultProfileImage(user.Id) + require.Error(t, err) if resp.StatusCode == http.StatusForbidden { CheckForbiddenStatus(t, resp) } else if resp.StatusCode == http.StatusUnauthorized { @@ -3308,16 +3416,16 @@ func TestSetDefaultProfileImage(t *testing.T) { require.Fail(t, "Should have failed either forbidden or unauthorized") } - _, resp = th.SystemAdminClient.SetDefaultProfileImage(user.Id) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.SetDefaultProfileImage(user.Id) + require.NoError(t, err) - ruser, err := th.App.GetUser(user.Id) - require.Nil(t, err) + ruser, appErr := th.App.GetUser(user.Id) + require.Nil(t, appErr) assert.Equal(t, int64(0), ruser.LastPictureUpdate, "Picture should have resetted to default") info := &model.FileInfo{Path: "users/" + user.Id + "/profile.png"} - cleanupErr := th.cleanupTestFile(info) - require.NoError(t, cleanupErr) + err = th.cleanupTestFile(info) + require.NoError(t, err) } func TestLogin(t *testing.T) { @@ -3330,51 +3438,49 @@ func TestLogin(t *testing.T) { }) t.Run("missing password", func(t *testing.T) { - _, resp := th.Client.Login(th.BasicUser.Email, "") - CheckErrorMessage(t, resp, "api.user.login.blank_pwd.app_error") + _, _, err := th.Client.Login(th.BasicUser.Email, "") + CheckErrorID(t, err, "api.user.login.blank_pwd.app_error") }) t.Run("unknown user", func(t *testing.T) { - _, resp := th.Client.Login("unknown", th.BasicUser.Password) - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email_username") + _, _, err := th.Client.Login("unknown", th.BasicUser.Password) + CheckErrorID(t, err, "api.user.login.invalid_credentials_email_username") }) t.Run("valid login", func(t *testing.T) { - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + user, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) assert.Equal(t, user.Id, th.BasicUser.Id) }) t.Run("bot login rejected", func(t *testing.T) { - bot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot, _, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: "bot", }) - CheckNoError(t, resp) + require.NoError(t, err) - botUser, resp := th.SystemAdminClient.GetUser(bot.UserId, "") - CheckNoError(t, resp) + botUser, _, err := th.SystemAdminClient.GetUser(bot.UserId, "") + require.NoError(t, err) - changed, resp := th.SystemAdminClient.UpdateUserPassword(bot.UserId, "", "password") - CheckNoError(t, resp) - require.True(t, changed) + _, err = th.SystemAdminClient.UpdateUserPassword(bot.UserId, "", "password") + require.NoError(t, err) - _, resp = th.Client.Login(botUser.Email, "password") - CheckErrorMessage(t, resp, "api.user.login.bot_login_forbidden.app_error") + _, _, err = th.Client.Login(botUser.Email, "password") + CheckErrorID(t, err, "api.user.login.bot_login_forbidden.app_error") }) t.Run("login with terms_of_service set", func(t *testing.T) { - termsOfService, err := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) - require.Nil(t, err) + termsOfService, appErr := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) + require.Nil(t, appErr) - success, resp := th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) - CheckNoError(t, resp) - assert.True(t, *success) + _, err := th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) + require.NoError(t, err) - userTermsOfService, resp := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") - CheckNoError(t, resp) + userTermsOfService, _, err := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") + require.NoError(t, err) - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + user, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) assert.Equal(t, user.Id, th.BasicUser.Id) assert.Equal(t, user.TermsOfServiceId, userTermsOfService.TermsOfServiceId) assert.Equal(t, user.TermsOfServiceCreateAt, userTermsOfService.CreateAt) @@ -3398,8 +3504,8 @@ func TestLoginWithLag(t *testing.T) { mainHelper.SQLStore.UpdateLicense(model.NewTestLicense("ldap")) mainHelper.ToggleReplicasOff() - err := th.App.RevokeAllSessions(th.BasicUser.Id) - require.Nil(t, err) + appErr := th.App.RevokeAllSessions(th.BasicUser.Id) + require.Nil(t, appErr) mainHelper.ToggleReplicasOn() defer mainHelper.ToggleReplicasOff() @@ -3408,14 +3514,14 @@ func TestLoginWithLag(t *testing.T) { require.NoError(t, cmdErr) defer mainHelper.SetReplicationLagForTesting(0) - _, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + _, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) - err = th.App.Srv().InvalidateAllCaches() - require.Nil(t, err) + appErr = th.App.Srv().InvalidateAllCaches() + require.Nil(t, appErr) - session, err := th.App.GetSession(th.Client.AuthToken) - require.Nil(t, err) + session, appErr := th.App.GetSession(th.Client.AuthToken) + require.Nil(t, appErr) require.NotNil(t, session) }) } @@ -3427,7 +3533,7 @@ func TestLoginCookies(t *testing.T) { th.Client.HTTPHeader[model.HeaderRequestedWith] = model.HeaderRequestedWithXML - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + user, resp, _ := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) sessionCookie := "" userCookie := "" @@ -3454,7 +3560,7 @@ func TestLoginCookies(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + _, resp, _ := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) assert.Empty(t, resp.Header.Get("Set-Cookie")) }) @@ -3480,8 +3586,8 @@ func TestLoginCookies(t *testing.T) { *cfg.ServiceSettings.SiteURL = tc.SiteURL }) - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + user, resp, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) assert.Equal(t, user.Id, th.BasicUser.Id) cookies := resp.Header.Get("Set-Cookie") @@ -3508,45 +3614,48 @@ func TestCBALogin(t *testing.T) { t.Run("missing cert header", func(t *testing.T) { th.Client.Logout() - _, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + _, resp, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("missing cert subject", func(t *testing.T) { th.Client.Logout() th.Client.HTTPHeader["X-SSL-Client-Cert"] = "valid_cert_fake" - _, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + _, resp, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("emails mismatch", func(t *testing.T) { th.Client.Logout() th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=mis_match" + th.BasicUser.Email - _, resp := th.Client.Login(th.BasicUser.Email, "") + _, resp, err := th.Client.Login(th.BasicUser.Email, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) t.Run("successful cba login", func(t *testing.T) { th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=" + th.BasicUser.Email - user, resp := th.Client.Login(th.BasicUser.Email, "") - CheckNoError(t, resp) + user, _, err := th.Client.Login(th.BasicUser.Email, "") + require.NoError(t, err) require.NotNil(t, user) require.Equal(t, th.BasicUser.Id, user.Id) }) t.Run("bot login rejected", func(t *testing.T) { - bot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot, _, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: "bot", }) - CheckNoError(t, resp) + require.NoError(t, err) - botUser, resp := th.SystemAdminClient.GetUser(bot.UserId, "") - CheckNoError(t, resp) + botUser, _, err := th.SystemAdminClient.GetUser(bot.UserId, "") + require.NoError(t, err) th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=" + botUser.Email - _, resp = th.Client.Login(botUser.Email, "") - CheckErrorMessage(t, resp, "api.user.login.bot_login_forbidden.app_error") + _, _, err = th.Client.Login(botUser.Email, "") + CheckErrorID(t, err, "api.user.login.bot_login_forbidden.app_error") }) }) @@ -3568,35 +3677,35 @@ func TestCBALogin(t *testing.T) { t.Run("password required", func(t *testing.T) { th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=" + th.BasicUser.Email - _, resp := th.Client.Login(th.BasicUser.Email, "") + _, resp, err := th.Client.Login(th.BasicUser.Email, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) t.Run("successful cba login with password", func(t *testing.T) { th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=" + th.BasicUser.Email - user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + user, _, err := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) require.NotNil(t, user) require.Equal(t, th.BasicUser.Id, user.Id) }) t.Run("bot login rejected", func(t *testing.T) { - bot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot, _, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: "bot", }) - CheckNoError(t, resp) + require.NoError(t, err) - botUser, resp := th.SystemAdminClient.GetUser(bot.UserId, "") - CheckNoError(t, resp) + botUser, _, err := th.SystemAdminClient.GetUser(bot.UserId, "") + require.NoError(t, err) - changed, resp := th.SystemAdminClient.UpdateUserPassword(bot.UserId, "", "password") - CheckNoError(t, resp) - require.True(t, changed) + _, err = th.SystemAdminClient.UpdateUserPassword(bot.UserId, "", "password") + require.NoError(t, err) th.Client.HTTPHeader["X-SSL-Client-Cert-Subject-DN"] = "C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=" + botUser.Email - _, resp = th.Client.Login(botUser.Email, "password") - CheckErrorMessage(t, resp, "api.user.login.bot_login_forbidden.app_error") + _, _, err = th.Client.Login(botUser.Email, "password") + CheckErrorID(t, err, "api.user.login.bot_login_forbidden.app_error") }) }) } @@ -3616,8 +3725,8 @@ func TestSwitchAccount(t *testing.T) { Password: th.BasicUser.Password, } - link, resp := th.Client.SwitchAccountType(sr) - CheckNoError(t, resp) + link, _, err := th.Client.SwitchAccountType(sr) + require.NoError(t, err) require.NotEmpty(t, link, "bad link") @@ -3629,7 +3738,8 @@ func TestSwitchAccount(t *testing.T) { NewService: model.UserAuthServiceGitlab, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err := th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.LoginBasic() @@ -3641,7 +3751,8 @@ func TestSwitchAccount(t *testing.T) { NewPassword: th.BasicUser.Password, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckForbiddenStatus(t, resp) sr = &model.SwitchRequest{ @@ -3649,7 +3760,8 @@ func TestSwitchAccount(t *testing.T) { NewService: model.UserAuthServiceLdap, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckForbiddenStatus(t, resp) sr = &model.SwitchRequest{ @@ -3657,7 +3769,8 @@ func TestSwitchAccount(t *testing.T) { NewService: model.UserAuthServiceEmail, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ExperimentalEnableAuthenticationTransfer = true }) @@ -3665,8 +3778,8 @@ func TestSwitchAccount(t *testing.T) { th.LoginBasic() fakeAuthData := model.NewId() - _, err := th.App.Srv().Store.User().UpdateAuthData(th.BasicUser.Id, model.UserAuthServiceGitlab, &fakeAuthData, th.BasicUser.Email, true) - require.NoError(t, err) + _, appErr := th.App.Srv().Store.User().UpdateAuthData(th.BasicUser.Id, model.UserAuthServiceGitlab, &fakeAuthData, th.BasicUser.Email, true) + require.NoError(t, appErr) sr = &model.SwitchRequest{ CurrentService: model.UserAuthServiceGitlab, @@ -3675,14 +3788,14 @@ func TestSwitchAccount(t *testing.T) { NewPassword: th.BasicUser.Password, } - link, resp = th.Client.SwitchAccountType(sr) - CheckNoError(t, resp) + link, _, err = th.Client.SwitchAccountType(sr) + require.NoError(t, err) require.Equal(t, "/login?extra=signin_change", link) th.Client.Logout() - _, resp = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckNoError(t, resp) + _, _, err = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + require.NoError(t, err) th.Client.Logout() sr = &model.SwitchRequest{ @@ -3690,7 +3803,8 @@ func TestSwitchAccount(t *testing.T) { NewService: model.ServiceGoogle, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckBadRequestStatus(t, resp) sr = &model.SwitchRequest{ @@ -3699,7 +3813,8 @@ func TestSwitchAccount(t *testing.T) { Password: th.BasicUser.Password, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckNotFoundStatus(t, resp) sr = &model.SwitchRequest{ @@ -3708,7 +3823,8 @@ func TestSwitchAccount(t *testing.T) { Email: th.BasicUser.Email, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) sr = &model.SwitchRequest{ @@ -3718,7 +3834,8 @@ func TestSwitchAccount(t *testing.T) { NewPassword: th.BasicUser.Password, } - _, resp = th.Client.SwitchAccountType(sr) + _, resp, err = th.Client.SwitchAccountType(sr) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -3729,8 +3846,8 @@ func assertToken(t *testing.T, th *TestHelper, token *model.UserAccessToken, exp defer func() { th.Client.AuthToken = oldSessionToken }() th.Client.AuthToken = token.Token - ruser, resp := th.Client.GetMe("") - CheckNoError(t, resp) + ruser, _, err := th.Client.GetMe("") + require.NoError(t, err) assert.Equal(t, expectedUserId, ruser.Id, "returned wrong user") } @@ -3742,7 +3859,8 @@ func assertInvalidToken(t *testing.T, th *TestHelper, token *model.UserAccessTok defer func() { th.Client.AuthToken = oldSessionToken }() th.Client.AuthToken = token.Token - _, resp := th.Client.GetMe("") + _, resp, err := th.Client.GetMe("") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -3753,7 +3871,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + _, resp, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -3764,8 +3883,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rtoken, resp := client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + rtoken, _, err := client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, rtoken.UserId, "wrong user id") assert.NotEmpty(t, rtoken.Token, "token should not be empty") @@ -3783,7 +3902,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.CreateUserAccessToken("notarealuserid", "test token") + _, resp, err := client.CreateUserAccessToken("notarealuserid", "test token") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) }) @@ -3795,7 +3915,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.CreateUserAccessToken(th.BasicUser.Id, "") + _, resp, err := client.CreateUserAccessToken(th.BasicUser.Id, "") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) }) @@ -3808,7 +3929,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - _, resp := client.CreateUserAccessToken(th.BasicUser.Id, "test token") + _, resp, err := client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.Error(t, err) CheckNotImplementedStatus(t, resp) }) }) @@ -3820,8 +3942,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - rtoken, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + rtoken, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, rtoken.UserId, "wrong user id") assert.NotEmpty(t, rtoken.Token, "token should not be empty") @@ -3838,7 +3960,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser2.Id, "test token") + _, resp, err := th.Client.CreateUserAccessToken(th.BasicUser2.Id, "test token") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -3848,8 +3971,8 @@ func TestCreateUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - rtoken, resp := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + rtoken, _, err := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, rtoken.UserId) oldSessionToken := th.Client.AuthToken @@ -3868,7 +3991,8 @@ func TestCreateUserAccessToken(t *testing.T) { session.IsOAuth = true th.App.AddSessionToCache(session) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + _, resp, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -3886,26 +4010,28 @@ func TestCreateUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) t.Run("without MANAGE_BOT permission", func(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - _, resp = th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + _, resp, err = th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - token, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) assert.Equal(t, createdBot.UserId, token.UserId) assertToken(t, th, token, createdBot.UserId) }) @@ -3926,24 +4052,26 @@ func TestCreateUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) t.Run("only having MANAGE_BOTS permission", func(t *testing.T) { - _, resp = th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + _, resp, err = th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_OTHERS_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) - rtoken, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + rtoken, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) assert.Equal(t, createdBot.UserId, rtoken.UserId) assertToken(t, th, rtoken, createdBot.UserId) @@ -3958,7 +4086,8 @@ func TestGetUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - _, resp := th.Client.GetUserAccessToken("123") + _, resp, err := th.Client.GetUserAccessToken("123") + require.Error(t, err) CheckBadRequestStatus(t, resp) }) @@ -3968,7 +4097,8 @@ func TestGetUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - _, resp := th.Client.GetUserAccessToken(model.NewId()) + _, resp, err := th.Client.GetUserAccessToken(model.NewId()) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -3979,11 +4109,11 @@ func TestGetUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) - rtoken, resp := th.Client.GetUserAccessToken(token.Id) - CheckNoError(t, resp) + rtoken, _, err := th.Client.GetUserAccessToken(token.Id) + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, rtoken.UserId, "wrong user id") assert.Empty(t, rtoken.Token, "token should be blank") @@ -3999,11 +4129,11 @@ func TestGetUserAccessToken(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) - rtoken, resp := th.SystemAdminClient.GetUserAccessToken(token.Id) - CheckNoError(t, resp) + rtoken, _, err := th.SystemAdminClient.GetUserAccessToken(token.Id) + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, rtoken.UserId, "wrong user id") assert.Empty(t, rtoken.Token, "token should be blank") @@ -4027,29 +4157,31 @@ func TestGetUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("without MANAGE_BOTS permission", func(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - _, resp := th.Client.GetUserAccessToken(token.Id) + _, resp, err := th.Client.GetUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - returnedToken, resp := th.Client.GetUserAccessToken(token.Id) - CheckNoError(t, resp) + returnedToken, _, err := th.Client.GetUserAccessToken(token.Id) + require.NoError(t, err) // Actual token won't be returned. returnedToken.Token = token.Token @@ -4073,27 +4205,29 @@ func TestGetUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("only having MANAGE_BOTS permission", func(t *testing.T) { - _, resp = th.Client.GetUserAccessToken(token.Id) + _, resp, err := th.Client.GetUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_OTHERS_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) - returnedToken, resp := th.Client.GetUserAccessToken(token.Id) - CheckNoError(t, resp) + returnedToken, _, err := th.Client.GetUserAccessToken(token.Id) + require.NoError(t, err) // Actual token won't be returned. returnedToken.Token = token.Token @@ -4111,15 +4245,15 @@ func TestGetUserAccessTokensForUser(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + _, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) - _, resp = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rtokens, resp := client.GetUserAccessTokensForUser(th.BasicUser.Id, 0, 100) - CheckNoError(t, resp) + rtokens, _, err := client.GetUserAccessTokensForUser(th.BasicUser.Id, 0, 100) + require.NoError(t, err) assert.Len(t, rtokens, 2, "should have 2 tokens") for _, uat := range rtokens { @@ -4136,15 +4270,15 @@ func TestGetUserAccessTokensForUser(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + _, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) - _, resp = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - rtokens, resp := client.GetUserAccessTokensForUser(th.BasicUser.Id, 1, 1) - CheckNoError(t, resp) + rtokens, _, err := client.GetUserAccessTokensForUser(th.BasicUser.Id, 1, 1) + require.NoError(t, err) assert.Len(t, rtokens, 1, "should have 1 tokens") for _, uat := range rtokens { @@ -4163,7 +4297,8 @@ func TestGetUserAccessTokens(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - _, resp := th.Client.GetUserAccessTokens(0, 100) + _, resp, err := th.Client.GetUserAccessTokens(0, 100) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -4175,14 +4310,14 @@ func TestGetUserAccessTokens(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) - _, resp = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) - rtokens, resp := th.SystemAdminClient.GetUserAccessTokens(1, 1) - CheckNoError(t, resp) + rtokens, _, err := th.SystemAdminClient.GetUserAccessTokens(1, 1) + require.NoError(t, err) assert.Len(t, rtokens, 1, "should have 1 token") }) @@ -4195,14 +4330,14 @@ func TestGetUserAccessTokens(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - _, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) - _, resp = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") - CheckNoError(t, resp) + _, _, err = th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token 2") + require.NoError(t, err) - rtokens, resp := th.SystemAdminClient.GetUserAccessTokens(0, 2) - CheckNoError(t, resp) + rtokens, _, err := th.SystemAdminClient.GetUserAccessTokens(0, 2) + require.NoError(t, err) assert.Len(t, rtokens, 2, "should have 2 tokens") }) @@ -4217,29 +4352,30 @@ func TestSearchUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) + require.NoError(t, err) - _, resp = th.Client.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: token.Id}) + _, resp, err := th.Client.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: token.Id}) + require.Error(t, err) CheckForbiddenStatus(t, resp) - rtokens, resp := th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: th.BasicUser.Id}) - CheckNoError(t, resp) + rtokens, _, err := th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: th.BasicUser.Id}) + require.NoError(t, err) require.Len(t, rtokens, 1, "should have 1 token") - rtokens, resp = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: token.Id}) - CheckNoError(t, resp) + rtokens, _, err = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: token.Id}) + require.NoError(t, err) require.Len(t, rtokens, 1, "should have 1 token") - rtokens, resp = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: th.BasicUser.Username}) - CheckNoError(t, resp) + rtokens, _, err = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: th.BasicUser.Username}) + require.NoError(t, err) require.Len(t, rtokens, 1, "should have 1 token") - rtokens, resp = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: "not found"}) - CheckNoError(t, resp) + rtokens, _, err = th.SystemAdminClient.SearchUserAccessTokens(&model.UserAccessTokenSearch{Term: "not found"}) + require.NoError(t, err) require.Empty(t, rtokens, "should have 1 tokens") } @@ -4253,13 +4389,12 @@ func TestRevokeUserAccessToken(t *testing.T) { th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { - token, resp := client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + token, _, err := client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assertToken(t, th, token, th.BasicUser.Id) - ok, resp := client.RevokeUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = client.RevokeUserAccessToken(token.Id) + require.NoError(t, err) assertInvalidToken(t, th, token) }) @@ -4271,12 +4406,12 @@ func TestRevokeUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - token, resp := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") + require.NoError(t, err) - ok, resp := th.Client.RevokeUserAccessToken(token.Id) + resp, err := th.Client.RevokeUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - assert.False(t, ok, "should have failed") }) t.Run("revoke token for bot created by user", func(t *testing.T) { @@ -4295,30 +4430,31 @@ func TestRevokeUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("without MANAGE_BOTS permission", func(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - _, resp := th.Client.RevokeUserAccessToken(token.Id) + resp, err := th.Client.RevokeUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.RevokeUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err := th.Client.RevokeUserAccessToken(token.Id) + require.NoError(t, err) }) }) @@ -4338,28 +4474,29 @@ func TestRevokeUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("only having MANAGE_BOTS permission", func(t *testing.T) { - _, resp = th.Client.RevokeUserAccessToken(token.Id) + resp, err = th.Client.RevokeUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_OTHERS_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.RevokeUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err := th.Client.RevokeUserAccessToken(token.Id) + require.NoError(t, err) }) }) } @@ -4372,13 +4509,12 @@ func TestDisableUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assertToken(t, th, token, th.BasicUser.Id) - ok, resp := th.Client.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.DisableUserAccessToken(token.Id) + require.NoError(t, err) assertInvalidToken(t, th, token) }) @@ -4389,12 +4525,12 @@ func TestDisableUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - token, resp := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") + require.NoError(t, err) - ok, resp := th.Client.DisableUserAccessToken(token.Id) + resp, err := th.Client.DisableUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - assert.False(t, ok, "should have failed") }) t.Run("disable token for bot created by user", func(t *testing.T) { @@ -4413,30 +4549,31 @@ func TestDisableUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("without MANAGE_BOTS permission", func(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - _, resp := th.Client.DisableUserAccessToken(token.Id) + resp, err := th.Client.DisableUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err := th.Client.DisableUserAccessToken(token.Id) + require.NoError(t, err) }) }) @@ -4456,28 +4593,29 @@ func TestDisableUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) t.Run("only having MANAGE_BOTS permission", func(t *testing.T) { - _, resp = th.Client.DisableUserAccessToken(token.Id) + resp, err = th.Client.DisableUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_OTHERS_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err := th.Client.DisableUserAccessToken(token.Id) + require.NoError(t, err) }) }) } @@ -4490,19 +4628,17 @@ func TestEnableUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, "test token") + require.NoError(t, err) assertToken(t, th, token, th.BasicUser.Id) - ok, resp := th.Client.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.DisableUserAccessToken(token.Id) + require.NoError(t, err) assertInvalidToken(t, th, token) - ok, resp = th.Client.EnableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.EnableUserAccessToken(token.Id) + require.NoError(t, err) assertToken(t, th, token, th.BasicUser.Id) }) @@ -4513,16 +4649,15 @@ func TestEnableUserAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) - token, resp := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(th.BasicUser2.Id, "test token") + require.NoError(t, err) - ok, resp := th.SystemAdminClient.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.SystemAdminClient.DisableUserAccessToken(token.Id) + require.NoError(t, err) - ok, resp = th.Client.DisableUserAccessToken(token.Id) + resp, err := th.Client.DisableUserAccessToken(token.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) - assert.False(t, ok, "should have failed") }) t.Run("enable token for bot created by user", func(t *testing.T) { @@ -4541,34 +4676,34 @@ func TestEnableUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.Client.CreateBot(&model.Bot{ + createdBot, resp, err := th.Client.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) - ok, resp := th.Client.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.DisableUserAccessToken(token.Id) + require.NoError(t, err) t.Run("without MANAGE_BOTS permission", func(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - _, resp := th.Client.EnableUserAccessToken(token.Id) + resp, err2 := th.Client.EnableUserAccessToken(token.Id) + require.Error(t, err2) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.EnableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.EnableUserAccessToken(token.Id) + require.NoError(t, err) }) }) @@ -4588,32 +4723,32 @@ func TestEnableUserAccessToken(t *testing.T) { *cfg.ServiceSettings.EnableBotAccountCreation = true }) - createdBot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + createdBot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.PermanentDeleteBot(createdBot.UserId) - token, resp := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") - CheckNoError(t, resp) + token, _, err := th.SystemAdminClient.CreateUserAccessToken(createdBot.UserId, "test token") + require.NoError(t, err) - ok, resp := th.SystemAdminClient.DisableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.SystemAdminClient.DisableUserAccessToken(token.Id) + require.NoError(t, err) t.Run("only having MANAGE_BOTS permission", func(t *testing.T) { - _, resp := th.Client.EnableUserAccessToken(token.Id) + resp, err2 := th.Client.EnableUserAccessToken(token.Id) + require.Error(t, err2) CheckForbiddenStatus(t, resp) }) t.Run("with MANAGE_OTHERS_BOTS permission", func(t *testing.T) { th.AddPermissionToRole(model.PermissionManageOthersBots.Id, model.TeamUserRoleId) - ok, resp := th.Client.EnableUserAccessToken(token.Id) - CheckNoError(t, resp) - assert.True(t, ok, "should have passed") + _, err = th.Client.EnableUserAccessToken(token.Id) + require.NoError(t, err) }) }) } @@ -4627,16 +4762,17 @@ func TestUserAccessTokenInactiveUser(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) + require.NoError(t, err) th.Client.AuthToken = token.Token - _, resp = th.Client.GetMe("") - CheckNoError(t, resp) + _, _, err = th.Client.GetMe("") + require.NoError(t, err) th.App.UpdateActive(th.Context, th.BasicUser, false) - _, resp = th.Client.GetMe("") + _, resp, err := th.Client.GetMe("") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -4649,22 +4785,23 @@ func TestUserAccessTokenDisableConfig(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = true }) th.App.UpdateUserRoles(th.BasicUser.Id, model.SystemUserRoleId+" "+model.SystemUserAccessTokenRoleId, false) - token, resp := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) - CheckNoError(t, resp) + token, _, err := th.Client.CreateUserAccessToken(th.BasicUser.Id, testDescription) + require.NoError(t, err) oldSessionToken := th.Client.AuthToken th.Client.AuthToken = token.Token - _, resp = th.Client.GetMe("") - CheckNoError(t, resp) + _, _, err = th.Client.GetMe("") + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableUserAccessTokens = false }) - _, resp = th.Client.GetMe("") + _, resp, err := th.Client.GetMe("") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) th.Client.AuthToken = oldSessionToken - _, resp = th.Client.GetMe("") - CheckNoError(t, resp) + _, _, err = th.Client.GetMe("") + require.NoError(t, err) } func TestUserAccessTokenDisableConfigBotsExcluded(t *testing.T) { @@ -4676,42 +4813,43 @@ func TestUserAccessTokenDisableConfigBotsExcluded(t *testing.T) { *cfg.ServiceSettings.EnableUserAccessTokens = false }) - bot, resp := th.SystemAdminClient.CreateBot(&model.Bot{ + bot, resp, err := th.SystemAdminClient.CreateBot(&model.Bot{ Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", }) + require.NoError(t, err) CheckCreatedStatus(t, resp) - rtoken, resp := th.SystemAdminClient.CreateUserAccessToken(bot.UserId, "test token") + rtoken, _, err := th.SystemAdminClient.CreateUserAccessToken(bot.UserId, "test token") th.Client.AuthToken = rtoken.Token - CheckNoError(t, resp) + require.NoError(t, err) - _, resp = th.Client.GetMe("") - CheckNoError(t, resp) + _, _, err = th.Client.GetMe("") + require.NoError(t, err) } func TestGetUsersByStatus(t *testing.T) { th := Setup(t) defer th.TearDown() - team, err := th.App.CreateTeam(th.Context, &model.Team{ + team, appErr := th.App.CreateTeam(th.Context, &model.Team{ DisplayName: "dn_" + model.NewId(), Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen, }) - require.Nil(t, err, "failed to create team") + require.Nil(t, appErr, "failed to create team") - channel, err := th.App.CreateChannel(th.Context, &model.Channel{ + channel, appErr := th.App.CreateChannel(th.Context, &model.Channel{ DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team.Id, CreatorId: model.NewId(), }, false) - require.Nil(t, err, "failed to create channel") + require.Nil(t, appErr, "failed to create channel") createUserWithStatus := func(username string, status string) *model.User { id := model.NewId() @@ -4747,12 +4885,12 @@ func TestGetUsersByStatus(t *testing.T) { dndUser2 := createUserWithStatus("dnd2", model.StatusDnd) client := th.CreateClient() - _, resp := client.Login(onlineUser2.Username, "Password1") - require.Nil(t, resp.Error) + _, _, err := client.Login(onlineUser2.Username, "Password1") + require.NoError(t, err) t.Run("sorting by status then alphabetical", func(t *testing.T) { - usersByStatus, resp := client.GetUsersInChannelByStatus(channel.Id, 0, 8, "") - require.Nil(t, resp.Error) + usersByStatus, _, err := client.GetUsersInChannelByStatus(channel.Id, 0, 8, "") + require.NoError(t, err) expectedUsersByStatus := []*model.User{ onlineUser1, @@ -4772,22 +4910,22 @@ func TestGetUsersByStatus(t *testing.T) { }) t.Run("paging", func(t *testing.T) { - usersByStatus, resp := client.GetUsersInChannelByStatus(channel.Id, 0, 3, "") - require.Nil(t, resp.Error) + usersByStatus, _, err := client.GetUsersInChannelByStatus(channel.Id, 0, 3, "") + require.NoError(t, err) require.Len(t, usersByStatus, 3) require.Equal(t, onlineUser1.Id, usersByStatus[0].Id, "online users first") require.Equal(t, onlineUser2.Id, usersByStatus[1].Id, "online users first") require.Equal(t, awayUser1.Id, usersByStatus[2].Id, "expected to receive away users second") - usersByStatus, resp = client.GetUsersInChannelByStatus(channel.Id, 1, 3, "") - require.Nil(t, resp.Error) + usersByStatus, _, err = client.GetUsersInChannelByStatus(channel.Id, 1, 3, "") + require.NoError(t, err) require.Equal(t, awayUser2.Id, usersByStatus[0].Id, "expected to receive away users second") require.Equal(t, dndUser1.Id, usersByStatus[1].Id, "expected to receive dnd users third") require.Equal(t, dndUser2.Id, usersByStatus[2].Id, "expected to receive dnd users third") - usersByStatus, resp = client.GetUsersInChannelByStatus(channel.Id, 1, 4, "") - require.Nil(t, resp.Error) + usersByStatus, _, err = client.GetUsersInChannelByStatus(channel.Id, 1, 4, "") + require.NoError(t, err) require.Len(t, usersByStatus, 4) require.Equal(t, dndUser1.Id, usersByStatus[0].Id, "expected to receive dnd users third") @@ -4802,37 +4940,34 @@ func TestRegisterTermsOfServiceAction(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - success, resp := th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, "st_1", true) - CheckErrorMessage(t, resp, "app.terms_of_service.get.no_rows.app_error") - assert.Nil(t, success) + _, err := th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, "st_1", true) + CheckErrorID(t, err, "app.terms_of_service.get.no_rows.app_error") - termsOfService, err := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) - require.Nil(t, err) + termsOfService, appErr := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) + require.Nil(t, appErr) - success, resp = th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) - CheckNoError(t, resp) + _, err = th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) + require.NoError(t, err) - assert.True(t, *success) - _, err = th.App.GetUser(th.BasicUser.Id) - require.Nil(t, err) + _, appErr = th.App.GetUser(th.BasicUser.Id) + require.Nil(t, appErr) } func TestGetUserTermsOfService(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") - CheckErrorMessage(t, resp, "app.user_terms_of_service.get_by_user.no_rows.app_error") + _, _, err := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") + CheckErrorID(t, err, "app.user_terms_of_service.get_by_user.no_rows.app_error") - termsOfService, err := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) - require.Nil(t, err) + termsOfService, appErr := th.App.CreateTermsOfService("terms of service", th.BasicUser.Id) + require.Nil(t, appErr) - success, resp := th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) - CheckNoError(t, resp) - assert.True(t, *success) + _, err = th.Client.RegisterTermsOfServiceAction(th.BasicUser.Id, termsOfService.Id, true) + require.NoError(t, err) - userTermsOfService, resp := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") - CheckNoError(t, resp) + userTermsOfService, _, err := th.Client.GetUserTermsOfService(th.BasicUser.Id, "") + require.NoError(t, err) assert.Equal(t, th.BasicUser.Id, userTermsOfService.UserId) assert.Equal(t, termsOfService.Id, userTermsOfService.TermsOfServiceId) @@ -4843,32 +4978,32 @@ func TestLoginErrorMessage(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.Logout() - CheckNoError(t, resp) + _, err := th.Client.Logout() + require.NoError(t, err) // Email and Username enabled th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithEmail = true *cfg.EmailSettings.EnableSignInWithUsername = true }) - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email_username") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_email_username") // Email enabled th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithEmail = true *cfg.EmailSettings.EnableSignInWithUsername = false }) - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_email") // Username enabled th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithEmail = false *cfg.EmailSettings.EnableSignInWithUsername = true }) - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_username") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_username") // SAML/SSO enabled th.App.UpdateConfig(func(cfg *model.Config) { @@ -4891,56 +5026,56 @@ func TestLoginErrorMessage(t *testing.T) { *cfg.SamlSettings.PositionAttribute = "" *cfg.SamlSettings.LocaleAttribute = "" }) - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_sso") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_sso") } func TestLoginLockout(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, resp := th.Client.Logout() - CheckNoError(t, resp) + _, err := th.Client.Logout() + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.MaximumLoginAttempts = 3 }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableMultifactorAuthentication = true }) - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email_username") - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email_username") - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.login.invalid_credentials_email_username") - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") - _, resp = th.Client.Login(th.BasicUser.Email, "wrong") - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_email_username") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_email_username") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.login.invalid_credentials_email_username") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.Login(th.BasicUser.Email, "wrong") + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") //Check if lock is active - _, resp = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") // Fake user has MFA enabled - err := th.Server.Store.User().UpdateMfaActive(th.BasicUser2.Id, true) + err = th.Server.Store.User().UpdateMfaActive(th.BasicUser2.Id, true) require.NoError(t, err) - _, resp = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") - CheckErrorMessage(t, resp, "api.user.check_user_mfa.bad_code.app_error") - _, resp = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") - CheckErrorMessage(t, resp, "api.user.check_user_mfa.bad_code.app_error") - _, resp = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") - CheckErrorMessage(t, resp, "api.user.check_user_mfa.bad_code.app_error") - _, resp = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") - _, resp = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") + CheckErrorID(t, err, "api.user.check_user_mfa.bad_code.app_error") + _, _, err = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") + CheckErrorID(t, err, "api.user.check_user_mfa.bad_code.app_error") + _, _, err = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") + CheckErrorID(t, err, "api.user.check_user_mfa.bad_code.app_error") + _, _, err = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.LoginWithMFA(th.BasicUser2.Email, th.BasicUser2.Password, "000000") + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") // Fake user has MFA disabled err = th.Server.Store.User().UpdateMfaActive(th.BasicUser2.Id, false) require.NoError(t, err) //Check if lock is active - _, resp = th.Client.Login(th.BasicUser2.Email, th.BasicUser2.Password) - CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") + _, _, err = th.Client.Login(th.BasicUser2.Email, th.BasicUser2.Password) + CheckErrorID(t, err, "api.user.check_user_login_attempts.too_many.app_error") } func TestDemoteUserToGuest(t *testing.T) { @@ -4958,18 +5093,18 @@ func TestDemoteUserToGuest(t *testing.T) { user := th.BasicUser th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - _, respErr := c.GetUser(user.Id, "") - CheckNoError(t, respErr) + _, _, err := c.GetUser(user.Id, "") + require.NoError(t, err) - _, respErr = c.DemoteUserToGuest(user.Id) - CheckNoError(t, respErr) + _, err = c.DemoteUserToGuest(user.Id) + require.NoError(t, err) defer require.Nil(t, th.App.PromoteGuestToUser(th.Context, user, "")) }, "demote a user to guest") t.Run("websocket update user event", func(t *testing.T) { webSocketClient, err := th.CreateWebSocketClient() - assert.Nil(t, err) + assert.NoError(t, err) defer webSocketClient.Close() webSocketClient.Listen() @@ -4979,7 +5114,7 @@ func TestDemoteUserToGuest(t *testing.T) { require.Equal(t, model.StatusOk, resp.Status) adminWebSocketClient, err := th.CreateWebSocketSystemAdminClient() - assert.Nil(t, err) + assert.NoError(t, err) defer adminWebSocketClient.Close() adminWebSocketClient.Listen() @@ -4988,10 +5123,10 @@ func TestDemoteUserToGuest(t *testing.T) { resp = <-adminWebSocketClient.ResponseChannel require.Equal(t, model.StatusOk, resp.Status) - _, respErr := th.SystemAdminClient.GetUser(user.Id, "") - CheckNoError(t, respErr) - _, respErr = th.SystemAdminClient.DemoteUserToGuest(user.Id) - CheckNoError(t, respErr) + _, _, err = th.SystemAdminClient.GetUser(user.Id, "") + require.NoError(t, err) + _, err = th.SystemAdminClient.DemoteUserToGuest(user.Id) + require.NoError(t, err) defer th.SystemAdminClient.PromoteGuestToUser(user.Id) assertExpectedWebsocketEvent(t, webSocketClient, model.WebsocketEventUserUpdated, func(event *model.WebSocketEvent) { @@ -5023,18 +5158,18 @@ func TestPromoteGuestToUser(t *testing.T) { th.App.UpdateUserRoles(user.Id, model.SystemGuestRoleId, false) th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { - _, respErr := c.GetUser(user.Id, "") - CheckNoError(t, respErr) + _, _, err := c.GetUser(user.Id, "") + require.NoError(t, err) - _, respErr = c.PromoteGuestToUser(user.Id) - CheckNoError(t, respErr) + _, err = c.PromoteGuestToUser(user.Id) + require.NoError(t, err) defer require.Nil(t, th.App.DemoteUserToGuest(user)) }, "promete a guest to user") t.Run("websocket update user event", func(t *testing.T) { webSocketClient, err := th.CreateWebSocketClient() - assert.Nil(t, err) + assert.NoError(t, err) defer webSocketClient.Close() webSocketClient.Listen() @@ -5044,7 +5179,7 @@ func TestPromoteGuestToUser(t *testing.T) { require.Equal(t, model.StatusOk, resp.Status) adminWebSocketClient, err := th.CreateWebSocketSystemAdminClient() - assert.Nil(t, err) + assert.NoError(t, err) defer adminWebSocketClient.Close() adminWebSocketClient.Listen() @@ -5053,10 +5188,10 @@ func TestPromoteGuestToUser(t *testing.T) { resp = <-adminWebSocketClient.ResponseChannel require.Equal(t, model.StatusOk, resp.Status) - _, respErr := th.SystemAdminClient.GetUser(user.Id, "") - CheckNoError(t, respErr) - _, respErr = th.SystemAdminClient.PromoteGuestToUser(user.Id) - CheckNoError(t, respErr) + _, _, err = th.SystemAdminClient.GetUser(user.Id, "") + require.NoError(t, err) + _, err = th.SystemAdminClient.PromoteGuestToUser(user.Id) + require.NoError(t, err) defer th.SystemAdminClient.DemoteUserToGuest(user.Id) assertExpectedWebsocketEvent(t, webSocketClient, model.WebsocketEventUserUpdated, func(event *model.WebSocketEvent) { @@ -5079,25 +5214,25 @@ func TestVerifyUserEmailWithoutToken(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { email := th.GenerateTestEmail() user := model.User{Email: email, Nickname: "Darth Vader", Password: "hello1", Username: GenerateTestUsername(), Roles: model.SystemUserRoleId} - ruser, _ := th.Client.CreateUser(&user) + ruser, _, _ := th.Client.CreateUser(&user) - vuser, resp := client.VerifyUserEmailWithoutToken(ruser.Id) - require.Nil(t, resp.Error) + vuser, _, err := client.VerifyUserEmailWithoutToken(ruser.Id) + require.NoError(t, err) require.Equal(t, ruser.Id, vuser.Id) }, "Should verify a new user") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - vuser, resp := client.VerifyUserEmailWithoutToken("randomId") - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "api.context.invalid_url_param.app_error") + vuser, _, err := client.VerifyUserEmailWithoutToken("randomId") + require.Error(t, err) + CheckErrorID(t, err, "api.context.invalid_url_param.app_error") require.Nil(t, vuser) }, "Should not be able to find user") t.Run("Should not be able to verify user due to permissions", func(t *testing.T) { user := th.CreateUser() - vuser, resp := th.Client.VerifyUserEmailWithoutToken(user.Id) - require.NotNil(t, resp.Error) - CheckErrorMessage(t, resp, "api.context.permissions.app_error") + vuser, _, err := th.Client.VerifyUserEmailWithoutToken(user.Id) + require.Error(t, err) + CheckErrorID(t, err, "api.context.permissions.app_error") require.Nil(t, vuser) }) } @@ -5179,24 +5314,24 @@ func TestGetKnownUsers(t *testing.T) { th.App.AddUserToChannel(u4, c3, false) t.Run("get know users sharing no channels", func(t *testing.T) { - _, _ = th.Client.Login(u4.Email, u4.Password) - userIds, resp := th.Client.GetKnownUsers() - CheckNoError(t, resp) + _, _, _ = th.Client.Login(u4.Email, u4.Password) + userIds, _, err := th.Client.GetKnownUsers() + require.NoError(t, err) assert.Empty(t, userIds) }) t.Run("get know users sharing one channel", func(t *testing.T) { - _, _ = th.Client.Login(u3.Email, u3.Password) - userIds, resp := th.Client.GetKnownUsers() - CheckNoError(t, resp) + _, _, _ = th.Client.Login(u3.Email, u3.Password) + userIds, _, err := th.Client.GetKnownUsers() + require.NoError(t, err) assert.Len(t, userIds, 1) assert.Equal(t, userIds[0], u1.Id) }) t.Run("get know users sharing multiple channels", func(t *testing.T) { - _, _ = th.Client.Login(u1.Email, u1.Password) - userIds, resp := th.Client.GetKnownUsers() - CheckNoError(t, resp) + _, _, _ = th.Client.Login(u1.Email, u1.Password) + userIds, _, err := th.Client.GetKnownUsers() + require.NoError(t, err) assert.Len(t, userIds, 2) assert.ElementsMatch(t, userIds, []string{u2.Id, u3.Id}) }) @@ -5212,32 +5347,34 @@ func TestPublishUserTyping(t *testing.T) { } t.Run("should return ok for non-system admin when triggering typing event for own user", func(t *testing.T) { - _, resp := th.Client.PublishUserTyping(th.BasicUser.Id, tr) - CheckNoError(t, resp) + _, err := th.Client.PublishUserTyping(th.BasicUser.Id, tr) + require.NoError(t, err) }) t.Run("should return ok for system admin when triggering typing event for own user", func(t *testing.T) { th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) th.AddUserToChannel(th.SystemAdminUser, th.BasicChannel) - _, resp := th.SystemAdminClient.PublishUserTyping(th.SystemAdminUser.Id, tr) - CheckNoError(t, resp) + _, err := th.SystemAdminClient.PublishUserTyping(th.SystemAdminUser.Id, tr) + require.NoError(t, err) }) t.Run("should return forbidden for non-system admin when triggering a typing event for a different user", func(t *testing.T) { - _, resp := th.Client.PublishUserTyping(th.BasicUser2.Id, tr) + resp, err := th.Client.PublishUserTyping(th.BasicUser2.Id, tr) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) t.Run("should return bad request when triggering a typing event for an invalid user id", func(t *testing.T) { - _, resp := th.Client.PublishUserTyping("invalid", tr) - CheckErrorMessage(t, resp, "api.context.invalid_url_param.app_error") + resp, err := th.Client.PublishUserTyping("invalid", tr) + require.Error(t, err) + CheckErrorID(t, err, "api.context.invalid_url_param.app_error") CheckBadRequestStatus(t, resp) }) t.Run("should send typing event via websocket when triggering a typing event for a user with a common channel", func(t *testing.T) { webSocketClient, err := th.CreateWebSocketClient() - assert.Nil(t, err) + assert.NoError(t, err) defer webSocketClient.Close() webSocketClient.Listen() @@ -5246,8 +5383,8 @@ func TestPublishUserTyping(t *testing.T) { wsResp := <-webSocketClient.ResponseChannel require.Equal(t, model.StatusOk, wsResp.Status) - _, resp := th.SystemAdminClient.PublishUserTyping(th.BasicUser2.Id, tr) - CheckNoError(t, resp) + _, err = th.SystemAdminClient.PublishUserTyping(th.BasicUser2.Id, tr) + require.NoError(t, err) assertExpectedWebsocketEvent(t, webSocketClient, model.WebsocketEventTyping, func(resp *model.WebSocketEvent) { assert.Equal(t, th.BasicChannel.Id, resp.GetBroadcast().ChannelId) @@ -5265,14 +5402,16 @@ func TestPublishUserTyping(t *testing.T) { th.Server.Busy.Set(time.Second * 10) t.Run("should return service unavailable for non-system admin user when triggering a typing event and server busy", func(t *testing.T) { - _, resp := th.Client.PublishUserTyping("invalid", tr) - CheckErrorMessage(t, resp, "api.context.server_busy.app_error") + resp, err := th.Client.PublishUserTyping("invalid", tr) + require.Error(t, err) + CheckErrorID(t, err, "api.context.server_busy.app_error") CheckServiceUnavailableStatus(t, resp) }) t.Run("should return service unavailable for system admin user when triggering a typing event and server busy", func(t *testing.T) { - _, resp := th.SystemAdminClient.PublishUserTyping(th.SystemAdminUser.Id, tr) - CheckErrorMessage(t, resp, "api.context.server_busy.app_error") + resp, err := th.SystemAdminClient.PublishUserTyping(th.SystemAdminUser.Id, tr) + require.Error(t, err) + CheckErrorID(t, err, "api.context.server_busy.app_error") CheckServiceUnavailableStatus(t, resp) }) } @@ -5281,24 +5420,25 @@ func TestConvertUserToBot(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - bot, resp := th.Client.ConvertUserToBot(th.BasicUser.Id) + bot, resp, err := th.Client.ConvertUserToBot(th.BasicUser.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) require.Nil(t, bot) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { user := model.User{Email: th.GenerateTestEmail(), Username: GenerateTestUsername(), Password: "password"} - ruser, resp := client.CreateUser(&user) - CheckNoError(t, resp) + ruser, resp, err := client.CreateUser(&user) + require.NoError(t, err) CheckCreatedStatus(t, resp) - bot, resp = client.ConvertUserToBot(ruser.Id) - CheckNoError(t, resp) + bot, _, err = client.ConvertUserToBot(ruser.Id) + require.NoError(t, err) require.NotNil(t, bot) require.Equal(t, bot.UserId, ruser.Id) - bot, resp = client.GetBot(bot.UserId, "") - CheckNoError(t, resp) + bot, _, err = client.GetBot(bot.UserId, "") + require.NoError(t, err) require.NotNil(t, bot) }) } @@ -5307,12 +5447,14 @@ func TestMigrateAuthToLDAP(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, err := th.Client.MigrateAuthToLdap("email", "a", false) - CheckForbiddenStatus(t, err) + resp, err := th.Client.MigrateAuthToLdap("email", "a", false) + require.Error(t, err) + CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, err = client.MigrateAuthToLdap("email", "a", false) - CheckNotImplementedStatus(t, err) + resp, err = client.MigrateAuthToLdap("email", "a", false) + require.Error(t, err) + CheckNotImplementedStatus(t, resp) }) } @@ -5320,12 +5462,14 @@ func TestMigrateAuthToSAML(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - _, err := th.Client.MigrateAuthToSaml("email", map[string]string{"1": "a"}, true) - CheckForbiddenStatus(t, err) + resp, err := th.Client.MigrateAuthToSaml("email", map[string]string{"1": "a"}, true) + require.Error(t, err) + CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - _, err = client.MigrateAuthToSaml("email", map[string]string{"1": "a"}, true) - CheckNotImplementedStatus(t, err) + resp, err = client.MigrateAuthToSaml("email", map[string]string{"1": "a"}, true) + require.Error(t, err) + CheckNotImplementedStatus(t, resp) }) } func TestUpdatePassword(t *testing.T) { @@ -5333,7 +5477,8 @@ func TestUpdatePassword(t *testing.T) { defer th.TearDown() t.Run("Forbidden when request performed by system user on a system admin", func(t *testing.T) { - res := th.Client.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") + res, err := th.Client.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") + require.Error(t, err) CheckForbiddenStatus(t, res) }) @@ -5341,15 +5486,16 @@ func TestUpdatePassword(t *testing.T) { th.AddPermissionToRole(model.PermissionSysconsoleWriteUserManagementUsers.Id, model.SystemUserRoleId) defer th.RemovePermissionFromRole(model.PermissionSysconsoleWriteUserManagementUsers.Id, model.SystemUserRoleId) - res := th.Client.UpdatePassword(th.TeamAdminUser.Id, "Pa$$word11", "foobar") + res, _ := th.Client.UpdatePassword(th.TeamAdminUser.Id, "Pa$$word11", "foobar") CheckOKStatus(t, res) - res = th.Client.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") + res, err := th.Client.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") + require.Error(t, err) CheckForbiddenStatus(t, res) }) t.Run("OK when request performed by system admin, even if requested user is system admin", func(t *testing.T) { - res := th.SystemAdminClient.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") + res, _ := th.SystemAdminClient.UpdatePassword(th.SystemAdminUser.Id, "Pa$$word11", "foobar") CheckOKStatus(t, res) }) } @@ -5365,54 +5511,54 @@ func TestGetThreadsForUser(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) t.Run("empty", func(t *testing.T) { - Client := th.Client + client := th.Client - _, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + _, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) CheckCreatedStatus(t, resp) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) - require.Nil(t, resp.Error) + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) + require.NoError(t, err) require.Len(t, uss.Threads, 0) }) t.Run("no params, 1 thread", func(t *testing.T) { - Client := th.Client + client := th.Client - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) - require.Nil(t, resp.Error) + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) + require.NoError(t, err) require.Len(t, uss.Threads, 1) require.Equal(t, uss.Threads[0].PostId, rpost.Id) require.Equal(t, uss.Threads[0].ReplyCount, int64(1)) }) t.Run("extended, 1 thread", func(t *testing.T) { - Client := th.Client + client := th.Client - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Extended: true, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 1) require.Equal(t, uss.Threads[0].PostId, rpost.Id) require.Equal(t, uss.Threads[0].ReplyCount, int64(1)) @@ -5420,65 +5566,64 @@ func TestGetThreadsForUser(t *testing.T) { }) t.Run("deleted, 1 thread", func(t *testing.T) { - Client := th.Client + client := th.Client - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 1) require.Equal(t, uss.Threads[0].PostId, rpost.Id) require.Equal(t, uss.Threads[0].ReplyCount, int64(1)) require.Equal(t, uss.Threads[0].Participants[0].Id, th.BasicUser.Id) - res, resp2 := th.Client.DeletePost(rpost.Id) - require.True(t, res) - require.Nil(t, resp2.Error) + _, err = th.Client.DeletePost(rpost.Id) + require.NoError(t, err) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 0) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: true, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 1) require.Greater(t, uss.Threads[0].Post.DeleteAt, int64(0)) }) t.Run("paged, 30 threads", func(t *testing.T) { - Client := th.Client + client := th.Client var rootIds []*model.Post for i := 0; i < 30; i++ { - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) CheckCreatedStatus(t, resp) rootIds = append(rootIds, rpost) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) } defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 30) require.Len(t, rootIds, 30) require.Equal(t, uss.Threads[0].PostId, rootIds[29].Id) @@ -5487,13 +5632,13 @@ func TestGetThreadsForUser(t *testing.T) { }) t.Run("paged, 10 threads before/after", func(t *testing.T) { - Client := th.Client + client := th.Client var rootIds []*model.Post for i := 0; i < 30; i++ { - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: fmt.Sprintf("testMsg-%d", i)}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: fmt.Sprintf("testMsg-%d", i)}) rootIds = append(rootIds, rpost) - postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: fmt.Sprintf("testReply-%d", i), RootId: rpost.Id}) + postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: fmt.Sprintf("testReply-%d", i), RootId: rpost.Id}) } rootId := rootIds[15].Id // middle point rootIdBefore := rootIds[14].Id @@ -5501,64 +5646,64 @@ func TestGetThreadsForUser(t *testing.T) { defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, PageSize: 10, Before: rootId, }) - require.Nil(t, resp.Error) + require.NoError(t, err) require.Len(t, uss.Threads, 10) require.Equal(t, rootIdBefore, uss.Threads[0].PostId) - uss2, resp2 := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss2, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, PageSize: 10, After: rootId, }) - require.Nil(t, resp2.Error) + require.NoError(t, err) require.Len(t, uss2.Threads, 10) require.Equal(t, rootIdAfter, uss2.Threads[0].PostId) - uss3, resp3 := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss3, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, PageSize: 10, After: rootId + "__bad", }) - require.Nil(t, resp3.Error) + require.NoError(t, err) require.NotNil(t, uss3.Threads) require.Len(t, uss3.Threads, 0) }) t.Run("editing or reacting to reply post does not make thread unread", func(t *testing.T) { - Client := th.Client + client := th.Client - rootPost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "root post"}) + rootPost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "root post"}) replyPost, _ := postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "reply post", RootId: rootPost.Id}) - uss, resp := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err := th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Equal(t, uss.TotalUnreadThreads, int64(1)) require.Equal(t, uss.Threads[0].PostId, rootPost.Id) - _, resp = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicChannel.TeamId, rootPost.Id, model.GetMillis()) - CheckNoError(t, resp) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + _, _, err = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicChannel.TeamId, rootPost.Id, model.GetMillis()) + require.NoError(t, err) + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Equal(t, uss.TotalUnreadThreads, int64(0)) // edit post editedReplyPostMessage := "edited " + replyPost.Message - _, resp = th.SystemAdminClient.PatchPost(replyPost.Id, &model.PostPatch{Message: &editedReplyPostMessage}) - CheckNoError(t, resp) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + _, _, err = th.SystemAdminClient.PatchPost(replyPost.Id, &model.PostPatch{Message: &editedReplyPostMessage}) + require.NoError(t, err) + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Equal(t, uss.TotalUnreadThreads, int64(0)) // react to post @@ -5567,12 +5712,12 @@ func TestGetThreadsForUser(t *testing.T) { PostId: replyPost.Id, EmojiName: "smile", } - _, resp = th.SystemAdminClient.SaveReaction(reaction) - CheckNoError(t, resp) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + _, _, err = th.SystemAdminClient.SaveReaction(reaction) + require.NoError(t, err) + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Equal(t, uss.TotalUnreadThreads, int64(0)) }) } @@ -5592,18 +5737,18 @@ func TestThreadSocketEvents(t *testing.T) { }) userWSClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) defer userWSClient.Close() userWSClient.Listen() - Client := th.Client + client := th.Client - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, err = th.App.CreatePostAsUser(th.Context, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", UserId: th.BasicUser2.Id, RootId: rpost.Id}, th.Context.Session().Id, false) - require.Nil(t, err) + _, appErr := th.App.CreatePostAsUser(th.Context, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", UserId: th.BasicUser2.Id, RootId: rpost.Id}, th.Context.Session().Id, false) + require.Nil(t, appErr) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser2.Id) @@ -5615,8 +5760,8 @@ func TestThreadSocketEvents(t *testing.T) { case ev := <-userWSClient.EventChannel: if ev.EventType() == model.WebsocketEventThreadUpdated { caught = true - thread, err := model.ThreadResponseFromJson(ev.GetData()["thread"].(string)) - require.NoError(t, err) + thread, err2 := model.ThreadResponseFromJson(ev.GetData()["thread"].(string)) + require.NoError(t, err2) for _, p := range thread.Participants { if p.Id != th.BasicUser.Id && p.Id != th.BasicUser2.Id { require.Fail(t, "invalid participants") @@ -5631,8 +5776,8 @@ func TestThreadSocketEvents(t *testing.T) { require.Truef(t, caught, "User should have received %s event", model.WebsocketEventThreadUpdated) }) - resp = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, false) - CheckNoError(t, resp) + resp, err = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, false) + require.NoError(t, err) CheckOKStatus(t, resp) t.Run("Listed for follow event", func(t *testing.T) { @@ -5654,8 +5799,8 @@ func TestThreadSocketEvents(t *testing.T) { require.Truef(t, caught, "User should have received %s event", model.WebsocketEventThreadFollowChanged) }) - _, resp = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, 123) - CheckNoError(t, resp) + _, resp, err = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, 123) + require.NoError(t, err) CheckOKStatus(t, resp) t.Run("Listed for read event", func(t *testing.T) { @@ -5684,41 +5829,41 @@ func TestFollowThreads(t *testing.T) { defer th.TearDown() t.Run("1 thread", func(t *testing.T) { - Client := th.Client + client := th.Client - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) var uss *model.Threads - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss.Threads, 1) - resp = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, false) - CheckNoError(t, resp) + resp, err = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, false) + require.NoError(t, err) CheckOKStatus(t, resp) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss.Threads, 0) - resp = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, true) - CheckNoError(t, resp) + resp, err = th.Client.UpdateThreadFollowForUser(th.BasicUser.Id, th.BasicTeam.Id, rpost.Id, true) + require.NoError(t, err) CheckOKStatus(t, resp) - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss.Threads, 1) require.GreaterOrEqual(t, uss.Threads[0].LastViewedAt, uss.Threads[0].LastReplyAt) @@ -5730,8 +5875,8 @@ func checkThreadListReplies(t *testing.T, th *TestHelper, client *model.Client4, if options != nil { opts = *options } - u, r := client.GetUserThreads(userId, th.BasicTeam.Id, opts) - CheckNoError(t, r) + u, resp, err := client.GetUserThreads(userId, th.BasicTeam.Id, opts) + require.NoError(t, err) require.Len(t, u.Threads, expectedThreads) count := int64(0) @@ -5745,12 +5890,12 @@ func checkThreadListReplies(t *testing.T, th *TestHelper, client *model.Client4, require.EqualValues(t, expectedReplies, sum, "expectedReplies don't match") require.Equal(t, count, u.TotalUnreadThreads, "TotalUnreadThreads don't match") - return u, r + return u, resp } func postAndCheck(t *testing.T, client *model.Client4, post *model.Post) (*model.Post, *model.Response) { - p, resp := client.CreatePost(post) - CheckNoError(t, resp) + p, resp, err := client.CreatePost(post) + require.NoError(t, err) CheckCreatedStatus(t, resp) return p, resp } @@ -5765,12 +5910,12 @@ func TestMaintainUnreadRepliesInThread(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.SystemAdminUser.Id) // create a post by regular user - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) // reply with another postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) @@ -5778,7 +5923,7 @@ func TestMaintainUnreadRepliesInThread(t *testing.T) { checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 1, 1, nil) // add another reply by regular user - postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply2", RootId: rpost.Id}) + postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply2", RootId: rpost.Id}) // replying to the thread clears reply count, so it should be 0 checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 0, 1, nil) @@ -5787,24 +5932,24 @@ func TestMaintainUnreadRepliesInThread(t *testing.T) { checkThreadListReplies(t, th, th.SystemAdminClient, th.SystemAdminUser.Id, 1, 1, nil) // mark all as read for user - resp := th.Client.UpdateThreadsReadForUser(th.BasicUser.Id, th.BasicTeam.Id) - CheckNoError(t, resp) + resp, err := th.Client.UpdateThreadsReadForUser(th.BasicUser.Id, th.BasicTeam.Id) + require.NoError(t, err) CheckOKStatus(t, resp) // reply count should be 0 checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 0, 1, nil) // mark other user's read state - _, resp = th.SystemAdminClient.UpdateThreadReadForUser(th.SystemAdminUser.Id, th.BasicTeam.Id, rpost.Id, model.GetMillis()) - CheckNoError(t, resp) + _, resp, err = th.SystemAdminClient.UpdateThreadReadForUser(th.SystemAdminUser.Id, th.BasicTeam.Id, rpost.Id, model.GetMillis()) + require.NoError(t, err) CheckOKStatus(t, resp) // get unread only, should return nothing checkThreadListReplies(t, th, th.SystemAdminClient, th.SystemAdminUser.Id, 0, 0, &model.GetUserThreadsOpts{Unread: true}) // restore unread to an old date - _, resp = th.SystemAdminClient.UpdateThreadReadForUser(th.SystemAdminUser.Id, th.BasicTeam.Id, rpost.Id, 123) - CheckNoError(t, resp) + _, resp, err = th.SystemAdminClient.UpdateThreadReadForUser(th.SystemAdminUser.Id, th.BasicTeam.Id, rpost.Id, 123) + require.NoError(t, err) CheckOKStatus(t, resp) // should have 2 unread replies now @@ -5822,17 +5967,17 @@ func TestThreadCounts(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.SystemAdminUser.Id) // create a post by regular user - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) // reply with another postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) // create another post by regular user - rpost2, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsg1"}) + rpost2, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsg1"}) // reply with another 2 times postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testReply2", RootId: rpost2.Id}) postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testReply22", RootId: rpost2.Id}) @@ -5865,37 +6010,37 @@ func TestSingleThreadGet(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.SystemAdminUser.Id) // create a post by regular user - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) // reply with another postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) // create another thread to check that we are not returning it by mistake - rpost2, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsg2"}) + rpost2, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsg2"}) postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testReply", RootId: rpost2.Id}) // regular user should have two threads with 3 replies total threads, _ := checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 2, 2, nil) - tr, resp := th.Client.GetUserThread(th.BasicUser.Id, th.BasicTeam.Id, threads.Threads[0].PostId, false) - CheckNoError(t, resp) + tr, _, err := th.Client.GetUserThread(th.BasicUser.Id, th.BasicTeam.Id, threads.Threads[0].PostId, false) + require.NoError(t, err) require.NotNil(t, tr) require.Equal(t, threads.Threads[0].PostId, tr.PostId) require.Empty(t, tr.Participants[0].Username) - tr, resp = th.Client.GetUserThread(th.BasicUser.Id, th.BasicTeam.Id, threads.Threads[0].PostId, true) - CheckNoError(t, resp) + tr, _, err = th.Client.GetUserThread(th.BasicUser.Id, th.BasicTeam.Id, threads.Threads[0].PostId, true) + require.NoError(t, err) require.NotEmpty(t, tr.Participants[0].Username) } func TestMaintainUnreadMentionsInThread(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true") defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS") th.App.UpdateConfig(func(cfg *model.Config) { @@ -5903,10 +6048,10 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) { *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) checkThreadList := func(client *model.Client4, userId string, expectedMentions, expectedThreads int) (*model.Threads, *model.Response) { - uss, resp := client.GetUserThreads(userId, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, resp, err := client.GetUserThreads(userId, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss.Threads, expectedThreads) sum := int64(0) @@ -5923,7 +6068,7 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) { defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.SystemAdminUser.Id) // create regular post - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) // create reply and mention the original poster and another user postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply @" + th.BasicUser.Username + " and @" + th.BasicUser2.Username, RootId: rpost.Id}) @@ -5933,19 +6078,19 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) { checkThreadList(th.SystemAdminClient, th.BasicUser2.Id, 1, 1) // test self mention, shouldn't increase mention count - postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply @" + th.BasicUser.Username, RootId: rpost.Id}) + postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply @" + th.BasicUser.Username, RootId: rpost.Id}) // count shouldn't increase checkThreadList(th.Client, th.BasicUser.Id, 1, 1) // test DM dm := th.CreateDmChannel(th.SystemAdminUser) - dm_root_post, _ := postAndCheck(t, Client, &model.Post{ChannelId: dm.Id, Message: "hi @" + th.SystemAdminUser.Username}) + dm_root_post, _ := postAndCheck(t, client, &model.Post{ChannelId: dm.Id, Message: "hi @" + th.SystemAdminUser.Username}) // no changes checkThreadList(th.Client, th.BasicUser.Id, 1, 1) // post reply by the same user - postAndCheck(t, Client, &model.Post{ChannelId: dm.Id, Message: "how are you", RootId: dm_root_post.Id}) + postAndCheck(t, client, &model.Post{ChannelId: dm.Id, Message: "how are you", RootId: dm_root_post.Id}) // thread created checkThreadList(th.Client, th.BasicUser.Id, 1, 2) @@ -5966,32 +6111,32 @@ func TestReadThreads(t *testing.T) { *cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client t.Run("all threads", func(t *testing.T) { - rpost, resp := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) - CheckNoError(t, resp) + rpost, resp, err := client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg"}) + require.NoError(t, err) + CheckCreatedStatus(t, resp) + _, resp, err = client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) + require.NoError(t, err) CheckCreatedStatus(t, resp) - _, resp2 := Client.CreatePost(&model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply", RootId: rpost.Id}) - CheckNoError(t, resp2) - CheckCreatedStatus(t, resp2) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) var uss, uss2 *model.Threads - uss, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss.Threads, 1) - resp = th.Client.UpdateThreadsReadForUser(th.BasicUser.Id, th.BasicTeam.Id) - CheckNoError(t, resp) + resp, err = th.Client.UpdateThreadsReadForUser(th.BasicUser.Id, th.BasicTeam.Id) + require.NoError(t, err) CheckOKStatus(t, resp) - uss2, resp = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ + uss2, _, err = th.Client.GetUserThreads(th.BasicUser.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{ Deleted: false, }) - CheckNoError(t, resp) + require.NoError(t, err) require.Len(t, uss2.Threads, 1) require.Greater(t, uss2.Threads[0].LastViewedAt, uss.Threads[0].LastViewedAt) }) @@ -6000,24 +6145,24 @@ func TestReadThreads(t *testing.T) { defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.BasicUser.Id) defer th.App.Srv().Store.Post().PermanentDeleteByUser(th.SystemAdminUser.Id) - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsgC1"}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsgC1"}) postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReplyC1", RootId: rpost.Id}) - rrpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsgC2"}) + rrpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testMsgC2"}) postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel2.Id, Message: "testReplyC2", RootId: rrpost.Id}) uss, _ := checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 2, 2, nil) - _, resp := th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rrpost.Id, model.GetMillis()+10) - CheckNoError(t, resp) + _, resp, err := th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rrpost.Id, model.GetMillis()+10) + require.NoError(t, err) CheckOKStatus(t, resp) uss2, _ := checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 1, 2, nil) require.Greater(t, uss2.Threads[0].LastViewedAt, uss.Threads[0].LastViewedAt) timestamp := model.GetMillis() - _, resp = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rrpost.Id, timestamp) - CheckNoError(t, resp) + _, resp, err = th.Client.UpdateThreadReadForUser(th.BasicUser.Id, th.BasicTeam.Id, rrpost.Id, timestamp) + require.NoError(t, err) CheckOKStatus(t, resp) uss3, _ := checkThreadListReplies(t, th, th.Client, th.BasicUser.Id, 1, 2, nil) @@ -6034,7 +6179,7 @@ func TestMarkThreadUnreadMentionCount(t *testing.T) { *cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn }) - Client := th.Client + client := th.Client channel := th.BasicChannel user := th.BasicUser @@ -6044,23 +6189,23 @@ func TestMarkThreadUnreadMentionCount(t *testing.T) { appErr = th.App.JoinChannel(th.Context, channel, user2.Id) require.Nil(t, appErr) - rpost, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg @" + th.BasicUser2.Username}) - reply, _ := postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply1", RootId: rpost.Id}) - postAndCheck(t, Client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply2", RootId: rpost.Id}) + rpost, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testMsg @" + th.BasicUser2.Username}) + reply, _ := postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply1", RootId: rpost.Id}) + postAndCheck(t, client, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply2", RootId: rpost.Id}) th.SystemAdminClient.UpdateThreadReadForUser(th.BasicUser2.Id, th.BasicTeam.Id, rpost.Id, model.GetMillis()) - u, _ := th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) + u, _, _ := th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) require.EqualValues(t, 0, u.TotalUnreadMentions) th.SystemAdminClient.UpdateThreadReadForUser(th.BasicUser2.Id, th.BasicTeam.Id, rpost.Id, rpost.CreateAt) - u, _ = th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) + u, _, _ = th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) require.EqualValues(t, 1, u.TotalUnreadMentions) th.SystemAdminClient.UpdateThreadReadForUser(th.BasicUser2.Id, th.BasicTeam.Id, rpost.Id, reply.CreateAt) - u, _ = th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) + u, _, _ = th.SystemAdminClient.GetUserThreads(th.BasicUser2.Id, th.BasicTeam.Id, model.GetUserThreadsOpts{}) require.EqualValues(t, 0, u.TotalUnreadMentions) } @@ -6170,13 +6315,12 @@ func TestSetProfileImageWithProviderAttributes(t *testing.T) { *cfg.LdapSettings.PictureAttribute = "" } }) - ok, resp := client.SetProfileImage(user.Id, data) + resp, err2 := client.SetProfileImage(user.Id, data) if testCase.shouldPass { - require.True(t, ok) - CheckNoError(t, resp) + require.NoError(t, err2) } else { - require.False(t, ok) - checkHTTPStatus(t, resp, http.StatusConflict, true) + require.Error(t, err2) + checkHTTPStatus(t, resp, http.StatusConflict) } }) } diff --git a/api4/user_viewmembers_test.go b/api4/user_viewmembers_test.go index d59e4945c7..f8abae4ced 100644 --- a/api4/user_viewmembers_test.go +++ b/api4/user_viewmembers_test.go @@ -16,31 +16,31 @@ func TestApiResctrictedViewMembers(t *testing.T) { defer th.TearDown() // Create first account for system admin - _, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user0", Password: "test-password-0", Username: "test-user-0", Roles: model.SystemUserRoleId}) - require.Nil(t, err) + _, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user0", Password: "test-password-0", Username: "test-user-0", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) - user1, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user1", Password: "test-password-1", Username: "test-user-1", Roles: model.SystemUserRoleId}) - require.Nil(t, err) - user2, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user2", Password: "test-password-2", Username: "test-user-2", Roles: model.SystemUserRoleId}) - require.Nil(t, err) - user3, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user3", Password: "test-password-3", Username: "test-user-3", Roles: model.SystemUserRoleId}) - require.Nil(t, err) - user4, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user4", Password: "test-password-4", Username: "test-user-4", Roles: model.SystemUserRoleId}) - require.Nil(t, err) - user5, err := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user5", Password: "test-password-5", Username: "test-user-5", Roles: model.SystemUserRoleId}) - require.Nil(t, err) + user1, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user1", Password: "test-password-1", Username: "test-user-1", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) + user2, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user2", Password: "test-password-2", Username: "test-user-2", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) + user3, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user3", Password: "test-password-3", Username: "test-user-3", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) + user4, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user4", Password: "test-password-4", Username: "test-user-4", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) + user5, appErr := th.App.CreateUser(th.Context, &model.User{Email: th.GenerateTestEmail(), Nickname: "test user5", Password: "test-password-5", Username: "test-user-5", Roles: model.SystemUserRoleId}) + require.Nil(t, appErr) - team1, err := th.App.CreateTeam(th.Context, &model.Team{DisplayName: "dn_" + model.NewId(), Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen}) - require.Nil(t, err) - team2, err := th.App.CreateTeam(th.Context, &model.Team{DisplayName: "dn_" + model.NewId(), Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen}) - require.Nil(t, err) + team1, appErr := th.App.CreateTeam(th.Context, &model.Team{DisplayName: "dn_" + model.NewId(), Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen}) + require.Nil(t, appErr) + team2, appErr := th.App.CreateTeam(th.Context, &model.Team{DisplayName: "dn_" + model.NewId(), Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TeamOpen}) + require.Nil(t, appErr) - channel1, err := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team1.Id, CreatorId: model.NewId()}, false) - require.Nil(t, err) - channel2, err := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team1.Id, CreatorId: model.NewId()}, false) - require.Nil(t, err) - channel3, err := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team2.Id, CreatorId: model.NewId()}, false) - require.Nil(t, err) + channel1, appErr := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team1.Id, CreatorId: model.NewId()}, false) + require.Nil(t, appErr) + channel2, appErr := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team1.Id, CreatorId: model.NewId()}, false) + require.Nil(t, appErr) + channel3, appErr := th.App.CreateChannel(th.Context, &model.Channel{DisplayName: "dn_" + model.NewId(), Name: "name_" + model.NewId(), Type: model.ChannelTypeOpen, TeamId: team2.Id, CreatorId: model.NewId()}, false) + require.Nil(t, appErr) th.LinkUserToTeam(user1, team1) th.LinkUserToTeam(user2, team1) @@ -60,8 +60,8 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.App.SetStatusOnline(user4.Id, true) th.App.SetStatusOnline(user5.Id, true) - _, resp := th.Client.Login(user1.Username, "test-password-1") - CheckNoError(t, resp) + _, _, err := th.Client.Login(user1.Username, "test-password-1") + require.NoError(t, err) t.Run("getUser", func(t *testing.T) { testCases := []struct { @@ -134,12 +134,11 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.AddPermissionToRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) } - _, resp := th.Client.GetUser(tc.UserId, "") - require.Nil(t, err) + _, _, err := th.Client.GetUser(tc.UserId, "") if tc.ExpectedError != "" { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } else { - CheckNoError(t, resp) + require.NoError(t, err) } }) } @@ -216,12 +215,11 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.AddPermissionToRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) } - _, resp := th.Client.GetUserByUsername(tc.Username, "") - require.Nil(t, err) + _, _, err := th.Client.GetUserByUsername(tc.Username, "") if tc.ExpectedError != "" { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } else { - CheckNoError(t, resp) + require.NoError(t, err) } }) } @@ -298,12 +296,11 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.AddPermissionToRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) } - _, resp := th.Client.GetUserByEmail(tc.Email, "") - require.Nil(t, err) + _, _, err := th.Client.GetUserByEmail(tc.Email, "") if tc.ExpectedError != "" { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } else { - CheckNoError(t, resp) + require.NoError(t, err) } }) } @@ -380,12 +377,11 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.AddPermissionToRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) } - _, resp := th.Client.GetDefaultProfileImage(tc.UserId) - require.Nil(t, err) + _, _, err := th.Client.GetDefaultProfileImage(tc.UserId) if tc.ExpectedError != "" { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } else { - CheckNoError(t, resp) + require.NoError(t, err) } }) } @@ -462,12 +458,11 @@ func TestApiResctrictedViewMembers(t *testing.T) { th.AddPermissionToRole(model.PermissionViewMembers.Id, model.SystemUserRoleId) } - _, resp := th.Client.GetProfileImage(tc.UserId, "") - require.Nil(t, err) + _, _, err := th.Client.GetProfileImage(tc.UserId, "") if tc.ExpectedError != "" { - CheckErrorMessage(t, resp, tc.ExpectedError) + CheckErrorID(t, err, tc.ExpectedError) } else { - CheckNoError(t, resp) + require.NoError(t, err) } }) } diff --git a/api4/webhook_test.go b/api4/webhook_test.go index 468338a4f0..b588f3d6d0 100644 --- a/api4/webhook_test.go +++ b/api4/webhook_test.go @@ -15,7 +15,7 @@ import ( func TestCreateIncomingWebhook(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true @@ -32,43 +32,45 @@ func TestCreateIncomingWebhook(t *testing.T) { hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) require.Equal(t, hook.ChannelId, rhook.ChannelId, "channel ids didn't match") require.Equal(t, th.SystemAdminUser.Id, rhook.UserId, "user ids didn't match") require.Equal(t, th.BasicTeam.Id, rhook.TeamId, "team ids didn't match") hook.ChannelId = "junk" - _, resp = th.SystemAdminClient.CreateIncomingWebhook(hook) + _, resp, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.Error(t, err) CheckNotFoundStatus(t, resp) hook.ChannelId = th.BasicChannel.Id th.LoginTeamAdmin() - _, resp = Client.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + _, _, err = client.CreateIncomingWebhook(hook) + require.NoError(t, err) th.LoginBasic() - _, resp = Client.CreateIncomingWebhook(hook) + _, resp, err = client.CreateIncomingWebhook(hook) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionManageIncomingWebhooks.Id, model.TeamUserRoleId) - _, resp = Client.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + _, _, err = client.CreateIncomingWebhook(hook) + require.NoError(t, err) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = false }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = false }) - _, resp = Client.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + _, _, err = client.CreateIncomingWebhook(hook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { hook.UserId = th.BasicUser2.Id defer func() { hook.UserId = "" }() - newHook, response := client.CreateIncomingWebhook(hook) - CheckNoError(t, response) + newHook, _, err2 := client.CreateIncomingWebhook(hook) + require.NoError(t, err2) require.Equal(t, th.BasicUser2.Id, newHook.UserId) }, "Create an incoming webhook for a different user") @@ -76,7 +78,8 @@ func TestCreateIncomingWebhook(t *testing.T) { hook.UserId = "invalid-user" defer func() { hook.UserId = "" }() - _, response := client.CreateIncomingWebhook(hook) + _, response, err2 := client.CreateIncomingWebhook(hook) + require.Error(t, err2) CheckNotFoundStatus(t, response) }, "Create an incoming webhook for an invalid user") @@ -84,19 +87,22 @@ func TestCreateIncomingWebhook(t *testing.T) { hook.UserId = th.BasicUser2.Id defer func() { hook.UserId = "" }() - _, response := Client.CreateIncomingWebhook(hook) + _, response, err2 := client.CreateIncomingWebhook(hook) + require.Error(t, err2) CheckForbiddenStatus(t, response) }) t.Run("Create an incoming webhook in local mode without providing user", func(t *testing.T) { hook.UserId = "" - _, response := th.LocalClient.CreateIncomingWebhook(hook) + _, response, err2 := th.LocalClient.CreateIncomingWebhook(hook) + require.Error(t, err2) CheckBadRequestStatus(t, response) }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = false }) - _, resp = Client.CreateIncomingWebhook(hook) + _, resp, err = client.CreateIncomingWebhook(hook) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } @@ -116,8 +122,8 @@ func TestCreateIncomingWebhook_BypassTeamPermissions(t *testing.T) { hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp := th.Client.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.Client.CreateIncomingWebhook(hook) + require.NoError(t, err) require.Equal(t, rhook.ChannelId, hook.ChannelId) require.Equal(t, rhook.UserId, th.BasicUser.Id) @@ -130,14 +136,15 @@ func TestCreateIncomingWebhook_BypassTeamPermissions(t *testing.T) { channel := th.CreateChannelWithClientAndTeam(th.SystemAdminClient, model.ChannelTypeOpen, team.Id) hook = &model.IncomingWebhook{ChannelId: channel.Id} - _, resp = th.Client.CreateIncomingWebhook(hook) + _, resp, err := th.Client.CreateIncomingWebhook(hook) + require.Error(t, err) CheckForbiddenStatus(t, resp) } func TestGetIncomingWebhooks(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) @@ -149,11 +156,11 @@ func TestGetIncomingWebhooks(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageIncomingWebhooks.Id, model.TeamUserRoleId) hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) - hooks, resp := th.SystemAdminClient.GetIncomingWebhooks(0, 1000, "") - CheckNoError(t, resp) + hooks, _, err := th.SystemAdminClient.GetIncomingWebhooks(0, 1000, "") + require.NoError(t, err) found := false for _, h := range hooks { @@ -165,13 +172,13 @@ func TestGetIncomingWebhooks(t *testing.T) { require.True(t, found, "missing hook") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hooks, resp = client.GetIncomingWebhooks(0, 1, "") - CheckNoError(t, resp) + hooks, _, err = client.GetIncomingWebhooks(0, 1, "") + require.NoError(t, err) require.Len(t, hooks, 1, "should only be 1 hook") - hooks, resp = client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + hooks, _, err = client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) found = false for _, h := range hooks { @@ -182,28 +189,32 @@ func TestGetIncomingWebhooks(t *testing.T) { require.True(t, found, "missing hook") - hooks, resp = client.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") - CheckNoError(t, resp) + hooks, _, err = client.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") + require.NoError(t, err) require.Empty(t, hooks, "no hooks should be returned") }) - _, resp = Client.GetIncomingWebhooks(0, 1000, "") + _, resp, err := client.GetIncomingWebhooks(0, 1000, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionManageIncomingWebhooks.Id, model.TeamUserRoleId) - _, resp = Client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + _, _, err = client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) - _, resp = Client.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") + _, resp, err = client.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - _, resp = Client.GetIncomingWebhooks(0, 1000, "") + _, resp, err = client.GetIncomingWebhooks(0, 1000, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) - Client.Logout() - _, resp = Client.GetIncomingWebhooks(0, 1000, "") + client.Logout() + _, resp, err = client.GetIncomingWebhooks(0, 1000, "") + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -224,28 +235,28 @@ func TestGetIncomingWebhooksListByUser(t *testing.T) { // Basic user webhook bHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicTeam.Id, UserId: th.BasicUser.Id} - basicHook, resp := BasicClient.CreateIncomingWebhook(bHook) - CheckNoError(t, resp) + basicHook, _, err := BasicClient.CreateIncomingWebhook(bHook) + require.NoError(t, err) - basicHooks, resp := BasicClient.GetIncomingWebhooks(0, 1000, "") - CheckNoError(t, resp) + basicHooks, _, err := BasicClient.GetIncomingWebhooks(0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(basicHooks)) assert.Equal(t, basicHook.Id, basicHooks[0].Id) // Admin User webhook aHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicTeam.Id, UserId: th.SystemAdminUser.Id} - _, resp = th.SystemAdminClient.CreateIncomingWebhook(aHook) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateIncomingWebhook(aHook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - adminHooks, rresp := client.GetIncomingWebhooks(0, 1000, "") - CheckNoError(t, rresp) + adminHooks, _, err2 := client.GetIncomingWebhooks(0, 1000, "") + require.NoError(t, err2) assert.Equal(t, 2, len(adminHooks)) }) //Re-check basic user that has no MANAGE_OTHERS permission - filteredHooks, resp := BasicClient.GetIncomingWebhooks(0, 1000, "") - CheckNoError(t, resp) + filteredHooks, _, err := BasicClient.GetIncomingWebhooks(0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(filteredHooks)) assert.Equal(t, basicHook.Id, filteredHooks[0].Id) } @@ -266,28 +277,28 @@ func TestGetIncomingWebhooksByTeam(t *testing.T) { // Basic user webhook bHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicTeam.Id, UserId: th.BasicUser.Id} - basicHook, resp := BasicClient.CreateIncomingWebhook(bHook) - CheckNoError(t, resp) + basicHook, _, err := BasicClient.CreateIncomingWebhook(bHook) + require.NoError(t, err) - basicHooks, resp := BasicClient.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + basicHooks, _, err := BasicClient.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(basicHooks)) assert.Equal(t, basicHook.Id, basicHooks[0].Id) // Admin User webhook aHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicTeam.Id, UserId: th.SystemAdminUser.Id} - _, resp = th.SystemAdminClient.CreateIncomingWebhook(aHook) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateIncomingWebhook(aHook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - adminHooks, rresp := client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, rresp) + adminHooks, _, err2 := client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err2) assert.Equal(t, 2, len(adminHooks)) }) //Re-check basic user that has no MANAGE_OTHERS permission - filteredHooks, resp := BasicClient.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + filteredHooks, _, err := BasicClient.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(filteredHooks)) assert.Equal(t, basicHook.Id, filteredHooks[0].Id) } @@ -299,27 +310,31 @@ func TestGetIncomingWebhook(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hook, resp = client.GetIncomingWebhook(rhook.Id, "") + _, resp, err := client.GetIncomingWebhook(rhook.Id, "") + require.NoError(t, err) CheckOKStatus(t, resp) }, "WhenHookExists") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hook, resp = client.GetIncomingWebhook(model.NewId(), "") + _, resp, err := client.GetIncomingWebhook(model.NewId(), "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "WhenHookDoesNotExist") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hook, resp = client.GetIncomingWebhook("abc", "") + _, resp, err := client.GetIncomingWebhook("abc", "") + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "WhenInvalidHookID") t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { th.LoginBasic() - _, resp = th.Client.GetIncomingWebhook(rhook.Id, "") + _, resp, err := th.Client.GetIncomingWebhook(rhook.Id, "") + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -330,46 +345,47 @@ func TestDeleteIncomingWebhook(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) - var resp *model.Response - var rhook *model.IncomingWebhook - var hook *model.IncomingWebhook - var status bool + //var rhook *model.IncomingWebhook + //var hook *model.IncomingWebhook th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - status, resp = client.DeleteIncomingWebhook("abc") + resp, err := client.DeleteIncomingWebhook("abc") + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "WhenInvalidHookID") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - status, resp = client.DeleteIncomingWebhook(model.NewId()) + resp, err := client.DeleteIncomingWebhook(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "WhenHookDoesNotExist") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hook = &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} + hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} // This request is performed by a system admin in both local // and sysadmin cases as it's not currently possible to create // a webhook via local mode - rhook, resp = th.SystemAdminClient.CreateIncomingWebhook(hook) - CheckNoError(t, resp) - - status, resp = client.DeleteIncomingWebhook(rhook.Id) - require.True(t, status, "Delete should have succeeded") + rhook, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) + resp, err := client.DeleteIncomingWebhook(rhook.Id) + require.NoError(t, err) CheckOKStatus(t, resp) // Get now should not return this deleted hook - _, resp = client.GetIncomingWebhook(rhook.Id, "") + _, resp, err = client.GetIncomingWebhook(rhook.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "WhenHookExists") t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { - hook = &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp = th.SystemAdminClient.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} + rhook, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) th.LoginBasic() - _, resp = th.Client.DeleteIncomingWebhook(rhook.Id) + resp, err := th.Client.DeleteIncomingWebhook(rhook.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } @@ -377,7 +393,7 @@ func TestDeleteIncomingWebhook(t *testing.T) { func TestCreateOutgoingWebhook(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) @@ -390,37 +406,39 @@ func TestCreateOutgoingWebhook(t *testing.T) { hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, Username: "some-user-name", IconURL: "http://some-icon-url/"} - rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) assert.Equal(t, hook.ChannelId, rhook.ChannelId, "channel ids didn't match") assert.Equal(t, th.SystemAdminUser.Id, rhook.CreatorId, "user ids didn't match") assert.Equal(t, th.BasicChannel.TeamId, rhook.TeamId, "team ids didn't match") hook.ChannelId = "junk" - _, resp = th.SystemAdminClient.CreateOutgoingWebhook(hook) + _, resp, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.Error(t, err) CheckNotFoundStatus(t, resp) hook.ChannelId = th.BasicChannel.Id th.LoginTeamAdmin() - _, resp = Client.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + _, _, err = client.CreateOutgoingWebhook(hook) + require.NoError(t, err) th.LoginBasic() - _, resp = Client.CreateOutgoingWebhook(hook) + _, resp, err = client.CreateOutgoingWebhook(hook) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionManageOutgoingWebhooks.Id, model.TeamUserRoleId) - _, resp = Client.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + _, _, err = client.CreateOutgoingWebhook(hook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { hook.CreatorId = th.BasicUser2.Id defer func() { hook.CreatorId = "" }() - newHook, response := client.CreateOutgoingWebhook(hook) - CheckNoError(t, response) + newHook, _, err2 := client.CreateOutgoingWebhook(hook) + require.NoError(t, err2) require.Equal(t, th.BasicUser2.Id, newHook.CreatorId) }, "Create an outgoing webhook for a different user") @@ -428,7 +446,8 @@ func TestCreateOutgoingWebhook(t *testing.T) { hook.CreatorId = "invalid-user" defer func() { hook.CreatorId = "" }() - _, response := client.CreateOutgoingWebhook(hook) + _, response, err2 := client.CreateOutgoingWebhook(hook) + require.Error(t, err2) CheckNotFoundStatus(t, response) }, "Create an incoming webhook for an invalid user") @@ -436,19 +455,22 @@ func TestCreateOutgoingWebhook(t *testing.T) { hook.CreatorId = th.BasicUser2.Id defer func() { hook.CreatorId = "" }() - _, response := Client.CreateOutgoingWebhook(hook) + _, response, err2 := client.CreateOutgoingWebhook(hook) + require.Error(t, err2) CheckForbiddenStatus(t, response) }) t.Run("Create an outgoing webhook in local mode without providing user", func(t *testing.T) { hook.CreatorId = "" - _, response := th.LocalClient.CreateOutgoingWebhook(hook) + _, response, err2 := th.LocalClient.CreateOutgoingWebhook(hook) + require.Error(t, err2) CheckBadRequestStatus(t, response) }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) - _, resp = Client.CreateOutgoingWebhook(hook) + _, resp, err = client.CreateOutgoingWebhook(hook) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } @@ -465,12 +487,12 @@ func TestGetOutgoingWebhooks(t *testing.T) { th.RemovePermissionFromRole(model.PermissionManageOutgoingWebhooks.Id, model.TeamUserRoleId) hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err2 := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err2) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hooks, rresp := client.GetOutgoingWebhooks(0, 1000, "") - CheckNoError(t, rresp) + hooks, _, err := client.GetOutgoingWebhooks(0, 1000, "") + require.NoError(t, err) found := false for _, h := range hooks { @@ -481,13 +503,13 @@ func TestGetOutgoingWebhooks(t *testing.T) { require.True(t, found, "missing hook") - hooks, rresp = client.GetOutgoingWebhooks(0, 1, "") - CheckNoError(t, rresp) + hooks, _, err = client.GetOutgoingWebhooks(0, 1, "") + require.NoError(t, err) require.Len(t, hooks, 1, "should only be 1 hook") - hooks, rresp = client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, rresp) + hooks, _, err = client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) found = false for _, h := range hooks { @@ -498,13 +520,13 @@ func TestGetOutgoingWebhooks(t *testing.T) { require.True(t, found, "missing hook") - hooks, rresp = client.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") - CheckNoError(t, rresp) + hooks, _, err = client.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") + require.NoError(t, err) require.Empty(t, hooks, "no hooks should be returned") - hooks, rresp = client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") - CheckNoError(t, rresp) + hooks, _, err = client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") + require.NoError(t, err) found = false for _, h := range hooks { @@ -515,32 +537,38 @@ func TestGetOutgoingWebhooks(t *testing.T) { require.True(t, found, "missing hook") - _, rresp = client.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") - CheckForbiddenStatus(t, rresp) + _, resp, err := client.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") + require.Error(t, err) + CheckForbiddenStatus(t, resp) }) - _, resp = th.Client.GetOutgoingWebhooks(0, 1000, "") + _, resp, err2 := th.Client.GetOutgoingWebhooks(0, 1000, "") + require.Error(t, err2) CheckForbiddenStatus(t, resp) th.AddPermissionToRole(model.PermissionManageOutgoingWebhooks.Id, model.TeamUserRoleId) - _, resp = th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + _, _, err2 = th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err2) - _, resp = th.Client.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") + _, resp, err2 = th.Client.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") + require.Error(t, err2) CheckForbiddenStatus(t, resp) - _, resp = th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") - CheckNoError(t, resp) + _, _, err2 = th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") + require.NoError(t, err2) - _, resp = th.Client.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") + _, resp, err2 = th.Client.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") + require.Error(t, err2) CheckForbiddenStatus(t, resp) - _, resp = th.Client.GetOutgoingWebhooks(0, 1000, "") + _, resp, err2 = th.Client.GetOutgoingWebhooks(0, 1000, "") + require.Error(t, err2) CheckForbiddenStatus(t, resp) th.Client.Logout() - _, resp = th.Client.GetOutgoingWebhooks(0, 1000, "") + _, resp, err2 = th.Client.GetOutgoingWebhooks(0, 1000, "") + require.Error(t, err2) CheckUnauthorizedStatus(t, resp) } @@ -559,28 +587,28 @@ func TestGetOutgoingWebhooksByTeam(t *testing.T) { // Basic user webhook bHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - basicHook, resp := th.Client.CreateOutgoingWebhook(bHook) - CheckNoError(t, resp) + basicHook, _, err := th.Client.CreateOutgoingWebhook(bHook) + require.NoError(t, err) - basicHooks, resp := th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + basicHooks, _, err := th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(basicHooks)) assert.Equal(t, basicHook.Id, basicHooks[0].Id) // Admin User webhook aHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - _, resp = th.SystemAdminClient.CreateOutgoingWebhook(aHook) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateOutgoingWebhook(aHook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - adminHooks, rresp := client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, rresp) + adminHooks, _, err2 := client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err2) assert.Equal(t, 2, len(adminHooks)) }) //Re-check basic user that has no MANAGE_OTHERS permission - filteredHooks, resp := th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") - CheckNoError(t, resp) + filteredHooks, _, err := th.Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(filteredHooks)) assert.Equal(t, basicHook.Id, filteredHooks[0].Id) } @@ -600,28 +628,28 @@ func TestGetOutgoingWebhooksByChannel(t *testing.T) { // Basic user webhook bHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - basicHook, resp := th.Client.CreateOutgoingWebhook(bHook) - CheckNoError(t, resp) + basicHook, _, err := th.Client.CreateOutgoingWebhook(bHook) + require.NoError(t, err) - basicHooks, resp := th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") - CheckNoError(t, resp) + basicHooks, _, err := th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(basicHooks)) assert.Equal(t, basicHook.Id, basicHooks[0].Id) // Admin User webhook aHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - _, resp = th.SystemAdminClient.CreateOutgoingWebhook(aHook) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateOutgoingWebhook(aHook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - adminHooks, rresp := client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") - CheckNoError(t, rresp) + adminHooks, _, err2 := client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") + require.NoError(t, err2) assert.Equal(t, 2, len(adminHooks)) }) //Re-check basic user that has no MANAGE_OTHERS permission - filteredHooks, resp := th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") - CheckNoError(t, resp) + filteredHooks, _, err := th.Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(filteredHooks)) assert.Equal(t, basicHook.Id, filteredHooks[0].Id) } @@ -642,28 +670,28 @@ func TestGetOutgoingWebhooksListByUser(t *testing.T) { // Basic user webhook bHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - basicHook, resp := th.Client.CreateOutgoingWebhook(bHook) - CheckNoError(t, resp) + basicHook, _, err := th.Client.CreateOutgoingWebhook(bHook) + require.NoError(t, err) - basicHooks, resp := th.Client.GetOutgoingWebhooks(0, 1000, "") - CheckNoError(t, resp) + basicHooks, _, err := th.Client.GetOutgoingWebhooks(0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(basicHooks)) assert.Equal(t, basicHook.Id, basicHooks[0].Id) // Admin User webhook aHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - _, resp = th.SystemAdminClient.CreateOutgoingWebhook(aHook) - CheckNoError(t, resp) + _, _, err = th.SystemAdminClient.CreateOutgoingWebhook(aHook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - adminHooks, rresp := client.GetOutgoingWebhooks(0, 1000, "") - CheckNoError(t, rresp) + adminHooks, _, err2 := client.GetOutgoingWebhooks(0, 1000, "") + require.NoError(t, err2) assert.Equal(t, 2, len(adminHooks)) }) //Re-check basic user that has no MANAGE_OTHERS permission - filteredHooks, resp := th.Client.GetOutgoingWebhooks(0, 1000, "") - CheckNoError(t, resp) + filteredHooks, _, err := th.Client.GetOutgoingWebhooks(0, 1000, "") + require.NoError(t, err) assert.Equal(t, 1, len(filteredHooks)) assert.Equal(t, basicHook.Id, filteredHooks[0].Id) } @@ -676,26 +704,29 @@ func TestGetOutgoingWebhook(t *testing.T) { hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - getHook, rresp := client.GetOutgoingWebhook(rhook.Id) - CheckNoError(t, rresp) + getHook, _, err2 := client.GetOutgoingWebhook(rhook.Id) + require.NoError(t, err2) require.Equal(t, getHook.Id, rhook.Id, "failed to retrieve the correct outgoing hook") }) - _, resp = th.Client.GetOutgoingWebhook(rhook.Id) + _, resp, err := th.Client.GetOutgoingWebhook(rhook.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { nonExistentHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id} - _, resp = client.GetOutgoingWebhook(nonExistentHook.Id) + _, resp, err = client.GetOutgoingWebhook(nonExistentHook.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) nonExistentHook.Id = model.NewId() - _, resp = client.GetOutgoingWebhook(nonExistentHook.Id) + _, resp, err = client.GetOutgoingWebhook(nonExistentHook.Id) + require.Error(t, err) CheckNotFoundStatus(t, resp) }) } @@ -715,7 +746,6 @@ func TestUpdateIncomingHook(t *testing.T) { hook1 := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - var resp *model.Response var createdHook *model.IncomingWebhook th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = false }) @@ -725,8 +755,9 @@ func TestUpdateIncomingHook(t *testing.T) { // webhook creations are allways performed by a sysadmin // because it's not currently possible to create a webhook via // local mode - createdHook, resp = th.SystemAdminClient.CreateIncomingWebhook(hook1) - CheckNoError(t, resp) + var err error + createdHook, _, err = th.SystemAdminClient.CreateIncomingWebhook(hook1) + require.NoError(t, err) createdHook.DisplayName = "hook2" createdHook.Description = "description" @@ -734,8 +765,8 @@ func TestUpdateIncomingHook(t *testing.T) { createdHook.Username = "username" createdHook.IconURL = "icon" - updatedHook, rresp := client.UpdateIncomingWebhook(createdHook) - CheckNoError(t, rresp) + updatedHook, _, err := client.UpdateIncomingWebhook(createdHook) + require.NoError(t, err) require.NotNil(t, updatedHook, "should not be nil") require.Exactly(t, "hook2", updatedHook.DisplayName, "Hook name is not updated") @@ -752,8 +783,9 @@ func TestUpdateIncomingHook(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = true }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - createdHook, resp = th.SystemAdminClient.CreateIncomingWebhook(hook1) - CheckNoError(t, resp) + var err error + createdHook, _, err = th.SystemAdminClient.CreateIncomingWebhook(hook1) + require.NoError(t, err) createdHook.DisplayName = "hook2" createdHook.Description = "description" @@ -761,8 +793,8 @@ func TestUpdateIncomingHook(t *testing.T) { createdHook.Username = "username" createdHook.IconURL = "icon" - updatedHook, resp := client.UpdateIncomingWebhook(createdHook) - CheckNoError(t, resp) + updatedHook, _, err := client.UpdateIncomingWebhook(createdHook) + require.NoError(t, err) require.NotNil(t, updatedHook, "should not be nil") require.Exactly(t, "hook2", updatedHook.DisplayName, "Hook name is not updated") @@ -778,13 +810,13 @@ func TestUpdateIncomingHook(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { hook2 := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, CreateAt: 100} - createdHook2, resp := th.SystemAdminClient.CreateIncomingWebhook(hook2) - CheckNoError(t, resp) + createdHook2, _, err := th.SystemAdminClient.CreateIncomingWebhook(hook2) + require.NoError(t, err) createdHook2.DisplayName = "Name2" - updatedHook, resp := client.UpdateIncomingWebhook(createdHook2) - CheckNoError(t, resp) + updatedHook, _, err := client.UpdateIncomingWebhook(createdHook2) + require.NoError(t, err) require.NotNil(t, updatedHook) assert.Equal(t, createdHook2.CreateAt, updatedHook.CreateAt) }, "RetainCreateAt") @@ -792,8 +824,8 @@ func TestUpdateIncomingHook(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { createdHook.DisplayName = "Name3" - updatedHook, resp := client.UpdateIncomingWebhook(createdHook) - CheckNoError(t, resp) + updatedHook, _, err := client.UpdateIncomingWebhook(createdHook) + require.NoError(t, err) require.NotNil(t, updatedHook, "should not be nil") require.NotEqual(t, createdHook.UpdateAt, updatedHook.UpdateAt, "failed - hook updateAt is not updated") }, "ModifyUpdateAt") @@ -801,16 +833,19 @@ func TestUpdateIncomingHook(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { nonExistentHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - _, resp := client.UpdateIncomingWebhook(nonExistentHook) + _, resp, err := client.UpdateIncomingWebhook(nonExistentHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) nonExistentHook.Id = model.NewId() - _, resp = client.UpdateIncomingWebhook(nonExistentHook) + _, resp, err = client.UpdateIncomingWebhook(nonExistentHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "UpdateNonExistentHook") t.Run("UserIsNotAdminOfTeam", func(t *testing.T) { - _, resp := th.Client.UpdateIncomingWebhook(createdHook) + _, resp, err := th.Client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) @@ -823,16 +858,17 @@ func TestUpdateIncomingHook(t *testing.T) { t.Run("UpdateHookOfSameUser", func(t *testing.T) { sameUserHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - sameUserHook, resp := th.Client.CreateIncomingWebhook(sameUserHook) - CheckNoError(t, resp) + sameUserHook, _, err := th.Client.CreateIncomingWebhook(sameUserHook) + require.NoError(t, err) sameUserHook.UserId = th.BasicUser2.Id - _, resp = th.Client.UpdateIncomingWebhook(sameUserHook) - CheckNoError(t, resp) + _, _, err = th.Client.UpdateIncomingWebhook(sameUserHook) + require.NoError(t, err) }) t.Run("UpdateHookOfDifferentUser", func(t *testing.T) { - _, resp := th.Client.UpdateIncomingWebhook(createdHook) + _, resp, err := th.Client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) }) @@ -844,16 +880,17 @@ func TestUpdateIncomingHook(t *testing.T) { th.UpdateUserToTeamAdmin(th.BasicUser2, th.BasicTeam) th.LoginBasic2() t.Run("UpdateByDifferentUser", func(t *testing.T) { - updatedHook, resp := th.Client.UpdateIncomingWebhook(createdHook) - CheckNoError(t, resp) + updatedHook, _, err := th.Client.UpdateIncomingWebhook(createdHook) + require.NoError(t, err) require.NotEqual(t, th.BasicUser2.Id, updatedHook.UserId, "Hook's creator userId is not retained") }) t.Run("IncomingHooksDisabled", func(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = false }) - _, resp := th.Client.UpdateIncomingWebhook(createdHook) + _, resp, err := th.Client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckNotImplementedStatus(t, resp) - CheckErrorMessage(t, resp, "api.incoming_webhook.disabled.app_error") + CheckErrorID(t, err, "api.incoming_webhook.disabled.app_error") }) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) @@ -864,13 +901,15 @@ func TestUpdateIncomingHook(t *testing.T) { th.LoginBasic() createdHook.ChannelId = privateChannel.Id - _, resp := th.Client.UpdateIncomingWebhook(createdHook) + _, resp, err := th.Client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { createdHook.ChannelId = "junk" - _, resp := client.UpdateIncomingWebhook(createdHook) + _, resp, err := client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "UpdateToNonExistentChannel") @@ -880,7 +919,8 @@ func TestUpdateIncomingHook(t *testing.T) { th.Client.Logout() th.Client.Login(user.Id, user.Password) t.Run("UpdateToADifferentTeam", func(t *testing.T) { - _, resp := th.Client.UpdateIncomingWebhook(createdHook) + _, resp, err := th.Client.UpdateIncomingWebhook(createdHook) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -901,8 +941,8 @@ func TestUpdateIncomingWebhook_BypassTeamPermissions(t *testing.T) { hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} - rhook, resp := th.Client.CreateIncomingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.Client.CreateIncomingWebhook(hook) + require.NoError(t, err) require.Equal(t, rhook.ChannelId, hook.ChannelId) require.Equal(t, rhook.UserId, th.BasicUser.Id) @@ -915,37 +955,41 @@ func TestUpdateIncomingWebhook_BypassTeamPermissions(t *testing.T) { channel := th.CreateChannelWithClientAndTeam(th.SystemAdminClient, model.ChannelTypeOpen, team.Id) hook2 := &model.IncomingWebhook{Id: rhook.Id, ChannelId: channel.Id} - _, resp = th.Client.UpdateIncomingWebhook(hook2) + _, resp, err := th.Client.UpdateIncomingWebhook(hook2) + require.Error(t, err) CheckBadRequestStatus(t, resp) } func TestRegenOutgoingHookToken(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} - rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) - _, resp = th.SystemAdminClient.RegenOutgoingHookToken("junk") + _, resp, err := th.SystemAdminClient.RegenOutgoingHookToken("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) //investigate why is act weird on jenkins - // _, resp = th.SystemAdminClient.RegenOutgoingHookToken("") + // _, resp,_ = th.SystemAdminClient.RegenOutgoingHookToken("") // CheckNotFoundStatus(t, resp) - regenHookToken, resp := th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) - CheckNoError(t, resp) + regenHookToken, _, err := th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) + require.NoError(t, err) require.NotEqual(t, rhook.Token, regenHookToken.Token, "regen didn't work properly") - _, resp = Client.RegenOutgoingHookToken(rhook.Id) + _, resp, err = client.RegenOutgoingHookToken(rhook.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) - _, resp = th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) + _, resp, err = th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) + require.Error(t, err) CheckNotImplementedStatus(t, resp) } @@ -965,34 +1009,35 @@ func TestUpdateOutgoingHook(t *testing.T) { CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"cats"}} th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rcreatedHook, webookResp := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) - CheckNoError(t, webookResp) + rcreatedHook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) + require.NoError(t, err) defer func() { - _, resp := client.DeleteOutgoingWebhook(rcreatedHook.Id) - CheckNoError(t, resp) + _, err = client.DeleteOutgoingWebhook(rcreatedHook.Id) + require.NoError(t, err) }() rcreatedHook.DisplayName = "Cats" rcreatedHook.Description = "Get me some cats" - updatedHook, resp := client.UpdateOutgoingWebhook(rcreatedHook) - CheckNoError(t, resp) + updatedHook, _, err := client.UpdateOutgoingWebhook(rcreatedHook) + require.NoError(t, err) require.Exactly(t, "Cats", updatedHook.DisplayName, "did not update") require.Exactly(t, "Get me some cats", updatedHook.Description, "did not update") }, "UpdateOutgoingWebhook") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rcreatedHook, webookResp := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) - CheckNoError(t, webookResp) + rcreatedHook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) + require.NoError(t, err) defer func() { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) - _, resp := client.DeleteOutgoingWebhook(rcreatedHook.Id) - CheckNoError(t, resp) + _, err = client.DeleteOutgoingWebhook(rcreatedHook.Id) + require.NoError(t, err) }() th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) - _, resp := client.UpdateOutgoingWebhook(rcreatedHook) + _, resp, err := client.UpdateOutgoingWebhook(rcreatedHook) + require.Error(t, err) CheckNotImplementedStatus(t, resp) }, "OutgoingHooksDisabled") @@ -1001,31 +1046,31 @@ func TestUpdateOutgoingHook(t *testing.T) { hook2 := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats"}} - createdHook2, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook2) - CheckNoError(t, resp) + createdHook2, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook2) + require.NoError(t, err) defer func() { - _, rresp := client.DeleteOutgoingWebhook(createdHook2.Id) - CheckNoError(t, rresp) + _, err = client.DeleteOutgoingWebhook(createdHook2.Id) + require.NoError(t, err) }() createdHook2.DisplayName = "Name2" - updatedHook2, resp := client.UpdateOutgoingWebhook(createdHook2) - CheckNoError(t, resp) + updatedHook2, _, err := client.UpdateOutgoingWebhook(createdHook2) + require.NoError(t, err) require.Equal(t, createdHook2.CreateAt, updatedHook2.CreateAt, "failed - hook create at should not be changed") }, "RetainCreateAt") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - rcreatedHook, resp := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) - CheckNoError(t, resp) + rcreatedHook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) + require.NoError(t, err) defer func() { - _, rresp := client.DeleteOutgoingWebhook(rcreatedHook.Id) - CheckNoError(t, rresp) + _, err = client.DeleteOutgoingWebhook(rcreatedHook.Id) + require.NoError(t, err) }() rcreatedHook.DisplayName = "Name3" - updatedHook2, resp := client.UpdateOutgoingWebhook(rcreatedHook) - CheckNoError(t, resp) + updatedHook2, _, err := client.UpdateOutgoingWebhook(rcreatedHook) + require.NoError(t, err) require.NotEqual(t, createdHook.UpdateAt, updatedHook2.UpdateAt, "failed - hook updateAt is not updated") }, "ModifyUpdateAt") @@ -1034,30 +1079,34 @@ func TestUpdateOutgoingHook(t *testing.T) { nonExistentHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats"}} - _, resp := client.UpdateOutgoingWebhook(nonExistentHook) + _, resp, err := client.UpdateOutgoingWebhook(nonExistentHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) nonExistentHook.Id = model.NewId() - _, resp = client.UpdateOutgoingWebhook(nonExistentHook) + _, resp, err = client.UpdateOutgoingWebhook(nonExistentHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "UpdateNonExistentHook") - createdHook, resp := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) - CheckNoError(t, resp) + createdHook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) + require.NoError(t, err) t.Run("UserIsNotAdminOfTeam", func(t *testing.T) { - _, rresp := th.Client.UpdateOutgoingWebhook(createdHook) - CheckForbiddenStatus(t, rresp) + _, resp, err2 := th.Client.UpdateOutgoingWebhook(createdHook) + require.Error(t, err2) + CheckForbiddenStatus(t, resp) }) th.AddPermissionToRole(model.PermissionManageOutgoingWebhooks.Id, model.TeamUserRoleId) hook2 := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats2"}} - createdHook2, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook2) - CheckNoError(t, resp) + createdHook2, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook2) + require.NoError(t, err) - _, resp = th.Client.UpdateOutgoingWebhook(createdHook2) + _, resp, err := th.Client.UpdateOutgoingWebhook(createdHook2) + require.Error(t, err) CheckForbiddenStatus(t, resp) th.RemovePermissionFromRole(model.PermissionManageOutgoingWebhooks.Id, model.TeamUserRoleId) @@ -1068,8 +1117,8 @@ func TestUpdateOutgoingHook(t *testing.T) { th.LoginBasic2() t.Run("RetainHookCreator", func(t *testing.T) { createdHook.DisplayName = "Basic user 2" - updatedHook, rresp := th.Client.UpdateOutgoingWebhook(createdHook) - CheckNoError(t, rresp) + updatedHook, _, err2 := th.Client.UpdateOutgoingWebhook(createdHook) + require.NoError(t, err2) require.Exactly(t, "Basic user 2", updatedHook.DisplayName, "should apply the change") require.Equal(t, th.SystemAdminUser.Id, updatedHook.CreatorId, "hook creator should not be changed") @@ -1078,25 +1127,26 @@ func TestUpdateOutgoingHook(t *testing.T) { th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { firstHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://someurl"}, TriggerWords: []string{"first"}} - firstHook, resp = th.SystemAdminClient.CreateOutgoingWebhook(firstHook) - CheckNoError(t, resp) + firstHook, _, err = th.SystemAdminClient.CreateOutgoingWebhook(firstHook) + require.NoError(t, err) baseHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://someurl"}, TriggerWords: []string{"base"}} - baseHook, resp = th.SystemAdminClient.CreateOutgoingWebhook(baseHook) - CheckNoError(t, resp) + baseHook, _, err = th.SystemAdminClient.CreateOutgoingWebhook(baseHook) + require.NoError(t, err) defer func() { - _, resp := client.DeleteOutgoingWebhook(firstHook.Id) - CheckNoError(t, resp) - _, resp = client.DeleteOutgoingWebhook(baseHook.Id) - CheckNoError(t, resp) + _, err = client.DeleteOutgoingWebhook(firstHook.Id) + require.NoError(t, err) + _, err = client.DeleteOutgoingWebhook(baseHook.Id) + require.NoError(t, err) }() t.Run("OnSameChannel", func(t *testing.T) { baseHook.TriggerWords = []string{"first"} - _, resp := client.UpdateOutgoingWebhook(baseHook) + _, resp, err2 := client.UpdateOutgoingWebhook(baseHook) + require.Error(t, err2) CheckBadRequestStatus(t, resp) }) @@ -1104,15 +1154,16 @@ func TestUpdateOutgoingHook(t *testing.T) { baseHook.TriggerWords = []string{"first"} baseHook.ChannelId = th.BasicChannel2.Id - _, resp := client.UpdateOutgoingWebhook(baseHook) - CheckNoError(t, resp) + _, _, err = client.UpdateOutgoingWebhook(baseHook) + require.NoError(t, err) }) }, "UpdateToExistingTriggerWordAndCallback") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { createdHook.ChannelId = "junk" - _, resp := client.UpdateOutgoingWebhook(createdHook) + _, resp, err := client.UpdateOutgoingWebhook(createdHook) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "UpdateToNonExistentChannel") @@ -1120,7 +1171,8 @@ func TestUpdateOutgoingHook(t *testing.T) { privateChannel := th.CreatePrivateChannel() createdHook.ChannelId = privateChannel.Id - _, resp := client.UpdateOutgoingWebhook(createdHook) + _, resp, err := client.UpdateOutgoingWebhook(createdHook) + require.Error(t, err) CheckForbiddenStatus(t, resp) }, "UpdateToPrivateChannel") @@ -1128,7 +1180,8 @@ func TestUpdateOutgoingHook(t *testing.T) { createdHook.ChannelId = "" createdHook.TriggerWords = nil - _, resp := client.UpdateOutgoingWebhook(createdHook) + _, resp, err := client.UpdateOutgoingWebhook(createdHook) + require.Error(t, err) CheckInternalErrorStatus(t, resp) }, "UpdateToBlankTriggerWordAndChannel") @@ -1138,7 +1191,8 @@ func TestUpdateOutgoingHook(t *testing.T) { th.Client.Logout() th.Client.Login(user.Id, user.Password) t.Run("UpdateToADifferentTeam", func(t *testing.T) { - _, resp := th.Client.UpdateOutgoingWebhook(createdHook) + _, resp, err := th.Client.UpdateOutgoingWebhook(createdHook) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) }) } @@ -1158,8 +1212,8 @@ func TestUpdateOutgoingWebhook_BypassTeamPermissions(t *testing.T) { hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats2"}} - rhook, resp := th.Client.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.Client.CreateOutgoingWebhook(hook) + require.NoError(t, err) require.Equal(t, rhook.ChannelId, hook.ChannelId) require.Equal(t, rhook.TeamId, th.BasicTeam.Id) @@ -1171,7 +1225,8 @@ func TestUpdateOutgoingWebhook_BypassTeamPermissions(t *testing.T) { channel := th.CreateChannelWithClientAndTeam(th.SystemAdminClient, model.ChannelTypeOpen, team.Id) hook2 := &model.OutgoingWebhook{Id: rhook.Id, ChannelId: channel.Id} - _, resp = th.Client.UpdateOutgoingWebhook(hook2) + _, resp, err := th.Client.UpdateOutgoingWebhook(hook2) + require.Error(t, err) CheckForbiddenStatus(t, resp) } @@ -1181,45 +1236,43 @@ func TestDeleteOutgoingHook(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) - var resp *model.Response - var rhook *model.OutgoingWebhook - var hook *model.OutgoingWebhook - var status bool - th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - status, resp = client.DeleteOutgoingWebhook("abc") + resp, err := client.DeleteOutgoingWebhook("abc") + require.Error(t, err) CheckBadRequestStatus(t, resp) }, "WhenInvalidHookID") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - status, resp = client.DeleteOutgoingWebhook(model.NewId()) + resp, err := client.DeleteOutgoingWebhook(model.NewId()) + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "WhenHookDoesNotExist") th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { - hook = &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, + hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"cats"}} - rhook, resp = th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) - status, resp = client.DeleteOutgoingWebhook(rhook.Id) - - require.True(t, status, "Delete should have succeeded") + resp, err := client.DeleteOutgoingWebhook(rhook.Id) + require.NoError(t, err) CheckOKStatus(t, resp) // Get now should not return this deleted hook - _, resp = client.GetIncomingWebhook(rhook.Id, "") + _, resp, err = client.GetIncomingWebhook(rhook.Id, "") + require.Error(t, err) CheckNotFoundStatus(t, resp) }, "WhenHookExists") t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { - hook = &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, + hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"dogs"}} - rhook, resp = th.SystemAdminClient.CreateOutgoingWebhook(hook) - CheckNoError(t, resp) + rhook, _, err := th.SystemAdminClient.CreateOutgoingWebhook(hook) + require.NoError(t, err) th.LoginBasic() - _, resp = th.Client.DeleteOutgoingWebhook(rhook.Id) + resp, err := th.Client.DeleteOutgoingWebhook(rhook.Id) + require.Error(t, err) CheckForbiddenStatus(t, resp) }) } diff --git a/api4/websocket_norace_test.go b/api4/websocket_norace_test.go index 46e6bc843c..5bcbad50fe 100644 --- a/api4/websocket_norace_test.go +++ b/api4/websocket_norace_test.go @@ -21,15 +21,15 @@ func TestWebSocket(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) defer WebSocketClient.Close() time.Sleep(300 * time.Millisecond) // Test closing and reconnecting WebSocketClient.Close() - err = WebSocketClient.Connect() - require.Nil(t, err) + appErr := WebSocketClient.Connect() + require.Nil(t, appErr) WebSocketClient.Listen() diff --git a/api4/websocket_test.go b/api4/websocket_test.go index 45ca02fba0..cb2d5860df 100644 --- a/api4/websocket_test.go +++ b/api4/websocket_test.go @@ -30,7 +30,7 @@ func TestWebSocketEvent(t *testing.T) { defer th.TearDown() WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) defer WebSocketClient.Close() WebSocketClient.Listen() @@ -98,7 +98,7 @@ func TestCreateDirectChannelWithSocket(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client user2 := th.BasicUser2 users := make([]*model.User, 0) @@ -109,7 +109,7 @@ func TestCreateDirectChannelWithSocket(t *testing.T) { } WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err) + require.NoError(t, err) defer WebSocketClient.Close() WebSocketClient.Listen() @@ -138,8 +138,8 @@ func TestCreateDirectChannelWithSocket(t *testing.T) { for _, user := range users { time.Sleep(100 * time.Millisecond) - _, resp := Client.CreateDirectChannel(th.BasicUser.Id, user.Id) - require.Nil(t, resp.Error, "failed to create DM channel") + _, _, err := client.CreateDirectChannel(th.BasicUser.Id, user.Id) + require.NoError(t, err, "failed to create DM channel") } time.Sleep(5000 * time.Millisecond) @@ -203,9 +203,9 @@ func TestWebSocketStatuses(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() - Client := th.Client + client := th.Client WebSocketClient, err := th.CreateWebSocketClient() - require.Nil(t, err, err) + require.NoError(t, err) defer WebSocketClient.Close() WebSocketClient.Listen() @@ -213,26 +213,28 @@ func TestWebSocketStatuses(t *testing.T) { require.Equal(t, resp.Status, model.StatusOk, "should have responded OK to authentication challenge") team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewRandomTeamName() + "a", Email: "test@nowhere.com", Type: model.TeamOpen} - rteam, _ := Client.CreateTeam(&team) + rteam, _, _ := client.CreateTeam(&team) user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"} - ruser := Client.Must(Client.CreateUser(&user)).(*model.User) + ruser, _, err := client.CreateUser(&user) + require.NoError(t, err) th.LinkUserToTeam(ruser, rteam) - _, nErr := th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) - require.NoError(t, nErr) + _, err = th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) + require.NoError(t, err) user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"} - ruser2 := Client.Must(Client.CreateUser(&user2)).(*model.User) + ruser2, _, err := client.CreateUser(&user2) + require.NoError(t, err) th.LinkUserToTeam(ruser2, rteam) - _, nErr = th.App.Srv().Store.User().VerifyEmail(ruser2.Id, ruser2.Email) - require.NoError(t, nErr) + _, err = th.App.Srv().Store.User().VerifyEmail(ruser2.Id, ruser2.Email) + require.NoError(t, err) - Client.Login(user.Email, user.Password) + client.Login(user.Email, user.Password) th.LoginBasic2() - WebSocketClient2, err2 := th.CreateWebSocketClient() - require.Nil(t, err2, err2) + WebSocketClient2, err := th.CreateWebSocketClient() + require.NoError(t, err) time.Sleep(1000 * time.Millisecond) diff --git a/app/plugin_api_test.go b/app/plugin_api_test.go index ac899e7dfd..3d9a8f24d7 100644 --- a/app/plugin_api_test.go +++ b/app/plugin_api_test.go @@ -1709,8 +1709,8 @@ func TestPluginHTTPUpgradeWebSocket(t *testing.T) { require.NotEmpty(t, pluginID) reqURL := fmt.Sprintf("ws://localhost:%d/plugins/%s", th.Server.ListenAddr.Port, pluginID) - wsc, appErr := model.NewWebSocketClient(reqURL, "") - require.Nil(t, appErr) + wsc, err := model.NewWebSocketClient(reqURL, "") + require.NoError(t, err) require.NotNil(t, wsc) wsc.Listen() diff --git a/app/slashcommands/auto_environment.go b/app/slashcommands/auto_environment.go index f6f5ac69c5..50870decf3 100644 --- a/app/slashcommands/auto_environment.go +++ b/app/slashcommands/auto_environment.go @@ -77,14 +77,14 @@ func CreateTestEnvironmentInTeam(a *app.App, c *request.Context, client *model.C // Have every user join every channel for _, user := range users { for _, channel := range channels { - _, resp := client.LoginById(user.Id, UserPassword) - if resp.Error != nil { - return TeamEnvironment{}, resp.Error + _, _, err := client.LoginById(user.Id, UserPassword) + if err != nil { + return TeamEnvironment{}, err } - _, resp = client.AddChannelMember(channel.Id, user.Id) - if resp.Error != nil { - return TeamEnvironment{}, resp.Error + _, _, err = client.AddChannelMember(channel.Id, user.Id) + if err != nil { + return TeamEnvironment{}, err } } } @@ -93,9 +93,9 @@ func CreateTestEnvironmentInTeam(a *app.App, c *request.Context, client *model.C numImages := utils.RandIntFromRange(rangePosts) / 4 for j := 0; j < numPosts; j++ { user := users[utils.RandIntFromRange(utils.Range{Begin: 0, End: len(users) - 1})] - _, resp := client.LoginById(user.Id, UserPassword) - if resp.Error != nil { - return TeamEnvironment{}, resp.Error + _, _, err := client.LoginById(user.Id, UserPassword) + if err != nil { + return TeamEnvironment{}, err } for i, channel := range channels { diff --git a/app/slashcommands/auto_teams.go b/app/slashcommands/auto_teams.go index 86cbd75caf..4caa28840d 100644 --- a/app/slashcommands/auto_teams.go +++ b/app/slashcommands/auto_teams.go @@ -57,9 +57,9 @@ func (cfg *AutoTeamCreator) createRandomTeam() (*model.Team, error) { Type: model.TeamOpen, } - createdTeam, resp := cfg.client.CreateTeam(team) - if resp.Error != nil { - return nil, resp.Error + createdTeam, _, err := cfg.client.CreateTeam(team) + if err != nil { + return nil, err } return createdTeam, nil } diff --git a/app/slashcommands/auto_users.go b/app/slashcommands/auto_users.go index 6c003a8fdc..d100f32420 100644 --- a/app/slashcommands/auto_users.go +++ b/app/slashcommands/auto_users.go @@ -39,23 +39,23 @@ func NewAutoUserCreator(a *app.App, client *model.Client4, team *model.Team) *Au } // Basic test team and user so you always know one -func CreateBasicUser(a *app.App, client *model.Client4) *model.AppError { - found, _ := client.TeamExists(BTestTeamName, "") +func CreateBasicUser(a *app.App, client *model.Client4) error { + found, _, _ := client.TeamExists(BTestTeamName, "") if found { return nil } newteam := &model.Team{DisplayName: BTestTeamDisplayName, Name: BTestTeamName, Email: BTestTeamEmail, Type: BTestTeamType} - basicteam, resp := client.CreateTeam(newteam) - if resp.Error != nil { - return resp.Error + basicteam, _, err := client.CreateTeam(newteam) + if err != nil { + return err } newuser := &model.User{Email: BTestUserEmail, Nickname: BTestUserName, Password: BTestUserPassword} - ruser, resp := client.CreateUser(newuser) - if resp.Error != nil { - return resp.Error + ruser, _, err := client.CreateUser(newuser) + if err != nil { + return err } - _, err := a.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) + _, err = a.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) if err != nil { return model.NewAppError("CreateBasicUser", "app.user.verify_email.app_error", nil, err.Error(), http.StatusInternalServerError) } diff --git a/app/slashcommands/command_loadtest.go b/app/slashcommands/command_loadtest.go index c39ce0bbb8..75495fbea0 100644 --- a/app/slashcommands/command_loadtest.go +++ b/app/slashcommands/command_loadtest.go @@ -215,9 +215,9 @@ func (*LoadTestProvider) SetupCommand(a *app.App, c *request.Context, args *mode if err := CreateBasicUser(a, client); err != nil { return &model.CommandResponse{Text: "Failed to create testing environment", ResponseType: model.CommandResponseTypeEphemeral}, err } - _, resp := client.Login(BTestUserEmail, BTestUserPassword) - if resp.Error != nil { - return &model.CommandResponse{Text: "Failed to create testing environment", ResponseType: model.CommandResponseTypeEphemeral}, resp.Error + _, _, err := client.Login(BTestUserEmail, BTestUserPassword) + if err != nil { + return &model.CommandResponse{Text: "Failed to create testing environment", ResponseType: model.CommandResponseTypeEphemeral}, err } environment, err := CreateTestEnvironmentWithTeams( a, @@ -443,18 +443,18 @@ func (*LoadTestProvider) PostCommand(a *app.App, args *model.CommandArgs, messag } client := model.NewAPIv4Client(args.SiteURL) - _, resp := client.LoginById(user.Id, passwd) - if resp.Error != nil { - return &model.CommandResponse{Text: "Failed to login a user", ResponseType: model.CommandResponseTypeEphemeral}, resp.Error + _, _, nErr := client.LoginById(user.Id, passwd) + if nErr != nil { + return &model.CommandResponse{Text: "Failed to login a user", ResponseType: model.CommandResponseTypeEphemeral}, nErr } post := &model.Post{ ChannelId: channel.Id, Message: textMessage, } - _, resp = client.CreatePost(post) - if resp.Error != nil { - return &model.CommandResponse{Text: "Failed to create a post", ResponseType: model.CommandResponseTypeEphemeral}, resp.Error + _, _, nErr = client.CreatePost(post) + if nErr != nil { + return &model.CommandResponse{Text: "Failed to create a post", ResponseType: model.CommandResponseTypeEphemeral}, nErr } return &model.CommandResponse{Text: "Added a post to " + channel.DisplayName, ResponseType: model.CommandResponseTypeEphemeral}, nil diff --git a/cmd/mattermost/commands/channel_test.go b/cmd/mattermost/commands/channel_test.go index 662d567989..96e6847ac4 100644 --- a/cmd/mattermost/commands/channel_test.go +++ b/cmd/mattermost/commands/channel_test.go @@ -113,7 +113,8 @@ func TestListChannels(t *testing.T) { defer th.TearDown() channel := th.CreatePublicChannel() - th.Client.Must(th.Client.DeleteChannel(channel.Id)) + _, err := th.Client.DeleteChannel(channel.Id) + require.NoError(t, err) privateChannel := th.CreatePrivateChannel() output := th.CheckCommand(t, "channel", "list", th.BasicTeam.Name) @@ -124,7 +125,8 @@ func TestListChannels(t *testing.T) { require.True(t, strings.Contains(output, privateChannel.Name+" (private)"), "should have private channel") - th.Client.Must(th.Client.DeleteChannel(privateChannel.Id)) + _, err = th.Client.DeleteChannel(privateChannel.Id) + require.NoError(t, err) output = th.CheckCommand(t, "channel", "list", th.BasicTeam.Name) @@ -136,7 +138,8 @@ func TestRestoreChannel(t *testing.T) { defer th.TearDown() channel := th.CreatePublicChannel() - th.Client.Must(th.Client.DeleteChannel(channel.Id)) + _, err := th.Client.DeleteChannel(channel.Id) + require.NoError(t, err) th.CheckCommand(t, "channel", "restore", th.BasicTeam.Name+":"+channel.Name) diff --git a/cmd/mattermost/commands/command_test.go b/cmd/mattermost/commands/command_test.go index 0ce9629396..94772433e8 100644 --- a/cmd/mattermost/commands/command_test.go +++ b/cmd/mattermost/commands/command_test.go @@ -115,9 +115,8 @@ func TestCreateCommand(t *testing.T) { t.Run(testCase.Description, func(t *testing.T) { actual, _ := th.RunCommandWithOutput(t, testCase.Args...) - cmds, response := th.SystemAdminClient.ListCommands(team.Id, true) - - require.Nil(t, response.Error, "Failed to list commands") + cmds, _, err := th.SystemAdminClient.ListCommands(team.Id, true) + require.NoError(t, err, "Failed to list commands") if testCase.ExpectedErr == "" { assert.NotZero(t, len(cmds), "Failed to create command") diff --git a/cmd/mattermost/commands/team_test.go b/cmd/mattermost/commands/team_test.go index 2370dce109..70a497d947 100644 --- a/cmd/mattermost/commands/team_test.go +++ b/cmd/mattermost/commands/team_test.go @@ -22,7 +22,8 @@ func TestCreateTeam(t *testing.T) { th.CheckCommand(t, "team", "create", "--name", name, "--display_name", displayName) - found := th.SystemAdminClient.Must(th.SystemAdminClient.TeamExists(name, "")).(bool) + found, _, err := th.SystemAdminClient.TeamExists(name, "") + require.NoError(t, err) require.True(t, found, "Failed to create Team") } @@ -33,7 +34,8 @@ func TestJoinTeam(t *testing.T) { th.CheckCommand(t, "team", "add", th.BasicTeam.Name, th.BasicUser.Email) - profiles := th.SystemAdminClient.Must(th.SystemAdminClient.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "")).([]*model.User) + profiles, _, err := th.SystemAdminClient.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) found := false @@ -53,7 +55,8 @@ func TestLeaveTeam(t *testing.T) { th.CheckCommand(t, "team", "remove", th.BasicTeam.Name, th.BasicUser.Email) - profiles := th.Client.Must(th.Client.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "")).([]*model.User) + profiles, _, err := th.Client.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) found := false @@ -181,8 +184,8 @@ func TestRestoreTeams(t *testing.T) { th.CheckCommand(t, "team", "restore", name) - found := th.SystemAdminClient.Must(th.SystemAdminClient.TeamExists(name, "")).(bool) - + found, _, err := th.SystemAdminClient.TeamExists(name, "") + require.NoError(t, err) require.True(t, found) } diff --git a/cmd/mattermost/commands/user_test.go b/cmd/mattermost/commands/user_test.go index 44ad8f444d..5528ed2471 100644 --- a/cmd/mattermost/commands/user_test.go +++ b/cmd/mattermost/commands/user_test.go @@ -24,7 +24,8 @@ func TestCreateUserWithTeam(t *testing.T) { th.CheckCommand(t, "team", "add", th.BasicTeam.Id, email) - profiles := th.SystemAdminClient.Must(th.SystemAdminClient.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "")).([]*model.User) + profiles, _, err := th.SystemAdminClient.GetUsersInTeam(th.BasicTeam.Id, 0, 1000, "") + require.NoError(t, err) found := false diff --git a/cmd/mattermost/commands/webhook_test.go b/cmd/mattermost/commands/webhook_test.go index 84efa59378..803b807a3e 100644 --- a/cmd/mattermost/commands/webhook_test.go +++ b/cmd/mattermost/commands/webhook_test.go @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/mattermost/mattermost-server/v6/api4" "github.com/mattermost/mattermost-server/v6/model" ) @@ -44,13 +43,13 @@ func TestListWebhooks(t *testing.T) { dispName := "myhookinc" hook := &model.IncomingWebhook{DisplayName: dispName, ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId} - _, resp := adminClient.CreateIncomingWebhook(hook) - api4.CheckNoError(t, resp) + _, _, err := adminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) dispName2 := "myhookout" outHook := &model.OutgoingWebhook{DisplayName: dispName2, ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, Username: "some-user-name", IconURL: "http://some-icon-url/"} - _, resp = adminClient.CreateOutgoingWebhook(outHook) - api4.CheckNoError(t, resp) + _, _, err = adminClient.CreateOutgoingWebhook(outHook) + require.NoError(t, err) output := th.CheckCommand(t, "webhook", "list", th.BasicTeam.Name) @@ -91,8 +90,8 @@ func TestShowWebhook(t *testing.T) { ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, } - incomingWebhook, resp := adminClient.CreateIncomingWebhook(hook) - api4.CheckNoError(t, resp) + incomingWebhook, _, err := adminClient.CreateIncomingWebhook(hook) + require.NoError(t, err) // should return an error when no webhookid is provided require.Error(t, th.RunCommand(t, "webhook", "show")) @@ -114,8 +113,8 @@ func TestShowWebhook(t *testing.T) { Username: "some-user-name", IconURL: "http://some-icon-url/", } - outgoingWebhook, resp := adminClient.CreateOutgoingWebhook(outgoingHook) - api4.CheckNoError(t, resp) + outgoingWebhook, _, err := adminClient.CreateOutgoingWebhook(outgoingHook) + require.NoError(t, err) // valid outgoing webhook should return webhook data output = th.CheckCommand(t, "webhook", "show", outgoingWebhook.Id) @@ -424,13 +423,13 @@ func TestDeleteWebhooks(t *testing.T) { dispName := "myhookinc" inHookStruct := &model.IncomingWebhook{DisplayName: dispName, ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId} - incomingHook, resp := adminClient.CreateIncomingWebhook(inHookStruct) - api4.CheckNoError(t, resp) + incomingHook, _, err := adminClient.CreateIncomingWebhook(inHookStruct) + require.NoError(t, err) dispName2 := "myhookout" outHookStruct := &model.OutgoingWebhook{DisplayName: dispName2, ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, Username: "some-user-name", IconURL: "http://some-icon-url/"} - outgoingHook, resp := adminClient.CreateOutgoingWebhook(outHookStruct) - api4.CheckNoError(t, resp) + outgoingHook, _, err := adminClient.CreateOutgoingWebhook(outHookStruct) + require.NoError(t, err) hooksBeforeDeletion := th.CheckCommand(t, "webhook", "list", th.BasicTeam.Name) diff --git a/manualtesting/manual_testing.go b/manualtesting/manual_testing.go index 77b6d031b1..ca92b05f11 100644 --- a/manualtesting/manual_testing.go +++ b/manualtesting/manual_testing.go @@ -107,9 +107,16 @@ func manualTest(c *web.Context, w http.ResponseWriter, r *http.Request) { Nickname: username[0], Password: slashcommands.UserPassword} - user, resp := client.CreateUser(user) - if resp.Error != nil { - c.Err = resp.Error + user, _, err = client.CreateUser(user) + if err != nil { + var appErr *model.AppError + ok = errors.As(err, &appErr) + if ok { + c.Err = appErr + } else { + c.Err = model.NewAppError("manualTest", "app.user.save.app_error", nil, err.Error(), http.StatusInternalServerError) + } + return } @@ -119,9 +126,15 @@ func manualTest(c *web.Context, w http.ResponseWriter, r *http.Request) { userID = user.Id // Login as user to generate auth token - _, resp = client.LoginById(user.Id, slashcommands.UserPassword) - if resp.Error != nil { - c.Err = resp.Error + _, _, err = client.LoginById(user.Id, slashcommands.UserPassword) + if err != nil { + var appErr *model.AppError + ok = errors.As(err, &appErr) + if ok { + c.Err = appErr + } else { + c.Err = model.NewAppError("manualTest", "api.user.login.bot_login_forbidden.app_error", nil, err.Error(), http.StatusInternalServerError) + } return } diff --git a/manualtesting/test_autolink.go b/manualtesting/test_autolink.go index 7076a66070..1fe2934362 100644 --- a/manualtesting/test_autolink.go +++ b/manualtesting/test_autolink.go @@ -4,6 +4,7 @@ package manualtesting import ( + "errors" "net/http" "github.com/mattermost/mattermost-server/v6/model" @@ -23,14 +24,20 @@ https://medium.com/@slackhq/11-useful-tips-for-getting-the-most-of-slack-5dfb3d1 func testAutoLink(env TestEnvironment) *model.AppError { mlog.Info("Manual Auto Link Test") - channelID, err := getChannelID(env.Context.App, model.DefaultChannelName, env.CreatedTeamID, env.CreatedUserID) - if !err { + channelID, ok := getChannelID(env.Context.App, model.DefaultChannelName, env.CreatedTeamID, env.CreatedUserID) + if !ok { return model.NewAppError("/manualtest", "manaultesting.test_autolink.unable.app_error", nil, "", http.StatusInternalServerError) } post := &model.Post{ ChannelId: channelID, Message: linkPostText} - _, resp := env.Client.CreatePost(post) - return resp.Error + _, _, err := env.Client.CreatePost(post) + + var appErr *model.AppError + if ok = errors.As(err, &appErr); !ok { + appErr = model.NewAppError("/manualtest", "manaultesting.test_autolink.unable.app_error", nil, "", http.StatusInternalServerError) + } + + return appErr } diff --git a/model/client4.go b/model/client4.go index 19b1b9c186..5ce622d6bd 100644 --- a/model/client4.go +++ b/model/client4.go @@ -15,7 +15,6 @@ import ( "net/url" "strconv" "strings" - "time" ) const ( @@ -52,7 +51,6 @@ const ( type Response struct { StatusCode int - Error *AppError RequestId string Etag string ServerVersion string @@ -108,16 +106,6 @@ func closeBody(r *http.Response) { } } -// Must is a convenience function used for testing. -func (c *Client4) Must(result interface{}, resp *Response) interface{} { - if resp.Error != nil { - time.Sleep(time.Second) - panic(resp.Error) - } - - return result -} - func NewAPIv4Client(url string) *Client4 { url = strings.TrimRight(url, "/") return &Client4{url, url + ApiUrlSuffix, &http.Client{}, "", "", map[string]string{}, "", ""} @@ -136,25 +124,11 @@ func NewAPIv4SocketClient(socketPath string) *Client4 { return client } -func BuildErrorResponse(r *http.Response, err *AppError) *Response { - var statusCode int - var header http.Header - if r != nil { - statusCode = r.StatusCode - header = r.Header - } else { - statusCode = 0 - header = make(http.Header) - } - - return &Response{ - StatusCode: statusCode, - Error: err, - Header: header, - } -} - func BuildResponse(r *http.Response) *Response { + if r == nil { + return nil + } + return &Response{ StatusCode: r.StatusCode, RequestId: r.Header.Get(HeaderRequestId), @@ -577,54 +551,54 @@ func (c *Client4) GetPermissionsRoute() string { return "/permissions" } -func (c *Client4) DoApiGet(url string, etag string) (*http.Response, *AppError) { +func (c *Client4) DoApiGet(url string, etag string) (*http.Response, error) { return c.DoApiRequest(http.MethodGet, c.ApiUrl+url, "", etag) } -func (c *Client4) DoApiPost(url string, data string) (*http.Response, *AppError) { +func (c *Client4) DoApiPost(url string, data string) (*http.Response, error) { return c.DoApiRequest(http.MethodPost, c.ApiUrl+url, data, "") } -func (c *Client4) doApiDeleteBytes(url string, data []byte) (*http.Response, *AppError) { +func (c *Client4) doApiDeleteBytes(url string, data []byte) (*http.Response, error) { return c.doApiRequestBytes(http.MethodDelete, c.ApiUrl+url, data, "") } -func (c *Client4) doApiPatchBytes(url string, data []byte) (*http.Response, *AppError) { +func (c *Client4) doApiPatchBytes(url string, data []byte) (*http.Response, error) { return c.doApiRequestBytes(http.MethodPatch, c.ApiUrl+url, data, "") } -func (c *Client4) doApiPostBytes(url string, data []byte) (*http.Response, *AppError) { +func (c *Client4) doApiPostBytes(url string, data []byte) (*http.Response, error) { return c.doApiRequestBytes(http.MethodPost, c.ApiUrl+url, data, "") } -func (c *Client4) DoApiPut(url string, data string) (*http.Response, *AppError) { +func (c *Client4) DoApiPut(url string, data string) (*http.Response, error) { return c.DoApiRequest(http.MethodPut, c.ApiUrl+url, data, "") } -func (c *Client4) doApiPutBytes(url string, data []byte) (*http.Response, *AppError) { +func (c *Client4) doApiPutBytes(url string, data []byte) (*http.Response, error) { return c.doApiRequestBytes(http.MethodPut, c.ApiUrl+url, data, "") } -func (c *Client4) DoApiDelete(url string) (*http.Response, *AppError) { +func (c *Client4) DoApiDelete(url string) (*http.Response, error) { return c.DoApiRequest(http.MethodDelete, c.ApiUrl+url, "", "") } -func (c *Client4) DoApiRequest(method, url, data, etag string) (*http.Response, *AppError) { +func (c *Client4) DoApiRequest(method, url, data, etag string) (*http.Response, error) { return c.doApiRequestReader(method, url, strings.NewReader(data), map[string]string{HeaderEtagClient: etag}) } -func (c *Client4) DoApiRequestWithHeaders(method, url, data string, headers map[string]string) (*http.Response, *AppError) { +func (c *Client4) DoApiRequestWithHeaders(method, url, data string, headers map[string]string) (*http.Response, error) { return c.doApiRequestReader(method, url, strings.NewReader(data), headers) } -func (c *Client4) doApiRequestBytes(method, url string, data []byte, etag string) (*http.Response, *AppError) { +func (c *Client4) doApiRequestBytes(method, url string, data []byte, etag string) (*http.Response, error) { return c.doApiRequestReader(method, url, bytes.NewReader(data), map[string]string{HeaderEtagClient: etag}) } -func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers map[string]string) (*http.Response, *AppError) { +func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers map[string]string) (*http.Response, error) { rq, err := http.NewRequest(method, url, data) if err != nil { - return nil, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest) + return nil, err } for k, v := range headers { @@ -642,8 +616,8 @@ func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0) + if err != nil { + return rp, err } if rp.StatusCode == 304 { @@ -658,14 +632,14 @@ func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers return rp, nil } -func (c *Client4) DoUploadFile(url string, data []byte, contentType string) (*FileUploadResponse, *Response) { +func (c *Client4) DoUploadFile(url string, data []byte, contentType string) (*FileUploadResponse, *Response, error) { return c.doUploadFile(url, bytes.NewReader(data), contentType, 0) } -func (c *Client4) doUploadFile(url string, body io.Reader, contentType string, contentLength int64) (*FileUploadResponse, *Response) { +func (c *Client4) doUploadFile(url string, body io.Reader, contentType string, contentLength int64) (*FileUploadResponse, *Response, error) { rq, err := http.NewRequest("POST", c.ApiUrl+url, body) if err != nil { - return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if contentLength != 0 { rq.ContentLength = contentLength @@ -677,22 +651,22 @@ func (c *Client4) doUploadFile(url string, body io.Reader, contentType string, c } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)) + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } - return FileUploadResponseFromJson(rp.Body), BuildResponse(rp) + return FileUploadResponseFromJson(rp.Body), BuildResponse(rp), nil } -func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string) (*Emoji, *Response) { +func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string) (*Emoji, *Response, error) { rq, err := http.NewRequest("POST", c.ApiUrl+url, bytes.NewReader(data)) if err != nil { - return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } rq.Header.Set("Content-Type", contentType) @@ -701,22 +675,22 @@ func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string) } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)) + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } - return EmojiFromJson(rp.Body), BuildResponse(rp) + return EmojiFromJson(rp.Body), BuildResponse(rp), nil } -func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string) (map[string]string, *Response) { +func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string) (map[string]string, *Response, error) { rq, err := http.NewRequest("POST", c.ApiUrl+url, bytes.NewReader(data)) if err != nil { - return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } rq.Header.Set("Content-Type", contentType) @@ -725,35 +699,22 @@ func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, BuildErrorResponse(rp, NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0)) + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } - return MapFromJson(rp.Body), BuildResponse(rp) -} - -// CheckStatusOK is a convenience function for checking the standard OK response -// from the web service. -func CheckStatusOK(r *http.Response) bool { - m := MapFromJson(r.Body) - defer closeBody(r) - - if m != nil && m[STATUS] == StatusOk { - return true - } - - return false + return MapFromJson(rp.Body), BuildResponse(rp), nil } // Authentication Section // LoginById authenticates a user by user id and password. -func (c *Client4) LoginById(id string, password string) (*User, *Response) { +func (c *Client4) LoginById(id string, password string) (*User, *Response, error) { m := make(map[string]string) m["id"] = id m["password"] = password @@ -762,7 +723,7 @@ func (c *Client4) LoginById(id string, password string) (*User, *Response) { // Login authenticates a user by login id, which can be username, email or some sort // of SSO identifier based on server configuration, and a password. -func (c *Client4) Login(loginId string, password string) (*User, *Response) { +func (c *Client4) Login(loginId string, password string) (*User, *Response, error) { m := make(map[string]string) m["login_id"] = loginId m["password"] = password @@ -770,7 +731,7 @@ func (c *Client4) Login(loginId string, password string) (*User, *Response) { } // LoginByLdap authenticates a user by LDAP id and password. -func (c *Client4) LoginByLdap(loginId string, password string) (*User, *Response) { +func (c *Client4) LoginByLdap(loginId string, password string) (*User, *Response, error) { m := make(map[string]string) m["login_id"] = loginId m["password"] = password @@ -781,7 +742,7 @@ func (c *Client4) LoginByLdap(loginId string, password string) (*User, *Response // LoginWithDevice authenticates a user by login id (username, email or some sort // of SSO identifier based on configuration), password and attaches a device id to // the session. -func (c *Client4) LoginWithDevice(loginId string, password string, deviceId string) (*User, *Response) { +func (c *Client4) LoginWithDevice(loginId string, password string, deviceId string) (*User, *Response, error) { m := make(map[string]string) m["login_id"] = loginId m["password"] = password @@ -790,7 +751,7 @@ func (c *Client4) LoginWithDevice(loginId string, password string, deviceId stri } // LoginWithMFA logs a user in with a MFA token -func (c *Client4) LoginWithMFA(loginId, password, mfaToken string) (*User, *Response) { +func (c *Client4) LoginWithMFA(loginId, password, mfaToken string) (*User, *Response, error) { m := make(map[string]string) m["login_id"] = loginId m["password"] = password @@ -798,334 +759,332 @@ func (c *Client4) LoginWithMFA(loginId, password, mfaToken string) (*User, *Resp return c.login(m) } -func (c *Client4) login(m map[string]string) (*User, *Response) { +func (c *Client4) login(m map[string]string) (*User, *Response, error) { r, err := c.DoApiPost("/users/login", MapToJson(m)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) c.AuthToken = r.Header.Get(HeaderToken) c.AuthType = HeaderBearer - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // Logout terminates the current user's session. -func (c *Client4) Logout() (bool, *Response) { +func (c *Client4) Logout() (*Response, error) { r, err := c.DoApiPost("/users/logout", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) c.AuthToken = "" c.AuthType = HeaderBearer - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SwitchAccountType changes a user's login type from one type to another. -func (c *Client4) SwitchAccountType(switchRequest *SwitchRequest) (string, *Response) { +func (c *Client4) SwitchAccountType(switchRequest *SwitchRequest) (string, *Response, error) { buf, err := json.Marshal(switchRequest) if err != nil { - return "", BuildErrorResponse(nil, NewAppError("SwitchAccountType", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return "", BuildResponse(nil), NewAppError("SwitchAccountType", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/login/switch", buf) - if appErr != nil { - return "", BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUsersRoute()+"/login/switch", buf) + if err != nil { + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["follow_link"], BuildResponse(r) + return MapFromJson(r.Body)["follow_link"], BuildResponse(r), nil } // User Section // CreateUser creates a user in the system based on the provided user struct. -func (c *Client4) CreateUser(user *User) (*User, *Response) { - r, appErr := c.DoApiPost(c.GetUsersRoute(), user.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) CreateUser(user *User) (*User, *Response, error) { + r, err := c.DoApiPost(c.GetUsersRoute(), user.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // CreateUserWithToken creates a user in the system based on the provided tokenId. -func (c *Client4) CreateUserWithToken(user *User, tokenId string) (*User, *Response) { +func (c *Client4) CreateUserWithToken(user *User, tokenId string) (*User, *Response, error) { if tokenId == "" { - err := NewAppError("MissingHashOrData", "api.user.create_user.missing_token.app_error", nil, "", http.StatusBadRequest) - return nil, &Response{StatusCode: err.StatusCode, Error: err} + return nil, nil, NewAppError("MissingHashOrData", "api.user.create_user.missing_token.app_error", nil, "", http.StatusBadRequest) } query := fmt.Sprintf("?t=%v", tokenId) buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateUserWithToken", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateUserWithToken", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUsersRoute()+query, buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUsersRoute()+query, buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // CreateUserWithInviteId creates a user in the system based on the provided invited id. -func (c *Client4) CreateUserWithInviteId(user *User, inviteId string) (*User, *Response) { +func (c *Client4) CreateUserWithInviteId(user *User, inviteId string) (*User, *Response, error) { if inviteId == "" { - err := NewAppError("MissingInviteId", "api.user.create_user.missing_invite_id.app_error", nil, "", http.StatusBadRequest) - return nil, &Response{StatusCode: err.StatusCode, Error: err} + return nil, nil, NewAppError("MissingInviteId", "api.user.create_user.missing_invite_id.app_error", nil, "", http.StatusBadRequest) } query := fmt.Sprintf("?iid=%v", url.QueryEscape(inviteId)) buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateUserWithInviteId", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateUserWithInviteId", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUsersRoute()+query, buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUsersRoute()+query, buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // GetMe returns the logged in user. -func (c *Client4) GetMe(etag string) (*User, *Response) { +func (c *Client4) GetMe(etag string) (*User, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(Me), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // GetUser returns a user based on the provided user id string. -func (c *Client4) GetUser(userId, etag string) (*User, *Response) { +func (c *Client4) GetUser(userId, etag string) (*User, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // GetUserByUsername returns a user based on the provided user name string. -func (c *Client4) GetUserByUsername(userName, etag string) (*User, *Response) { +func (c *Client4) GetUserByUsername(userName, etag string) (*User, *Response, error) { r, err := c.DoApiGet(c.GetUserByUsernameRoute(userName), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // GetUserByEmail returns a user based on the provided user email string. -func (c *Client4) GetUserByEmail(email, etag string) (*User, *Response) { +func (c *Client4) GetUserByEmail(email, etag string) (*User, *Response, error) { r, err := c.DoApiGet(c.GetUserByEmailRoute(email), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // AutocompleteUsersInTeam returns the users on a team based on search term. -func (c *Client4) AutocompleteUsersInTeam(teamId string, username string, limit int, etag string) (*UserAutocomplete, *Response) { +func (c *Client4) AutocompleteUsersInTeam(teamId string, username string, limit int, etag string) (*UserAutocomplete, *Response, error) { query := fmt.Sprintf("?in_team=%v&name=%v&limit=%d", teamId, username, limit) r, err := c.DoApiGet(c.GetUsersRoute()+"/autocomplete"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAutocompleteFromJson(r.Body), BuildResponse(r) + return UserAutocompleteFromJson(r.Body), BuildResponse(r), nil } // AutocompleteUsersInChannel returns the users in a channel based on search term. -func (c *Client4) AutocompleteUsersInChannel(teamId string, channelId string, username string, limit int, etag string) (*UserAutocomplete, *Response) { +func (c *Client4) AutocompleteUsersInChannel(teamId string, channelId string, username string, limit int, etag string) (*UserAutocomplete, *Response, error) { query := fmt.Sprintf("?in_team=%v&in_channel=%v&name=%v&limit=%d", teamId, channelId, username, limit) r, err := c.DoApiGet(c.GetUsersRoute()+"/autocomplete"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAutocompleteFromJson(r.Body), BuildResponse(r) + return UserAutocompleteFromJson(r.Body), BuildResponse(r), nil } // AutocompleteUsers returns the users in the system based on search term. -func (c *Client4) AutocompleteUsers(username string, limit int, etag string) (*UserAutocomplete, *Response) { +func (c *Client4) AutocompleteUsers(username string, limit int, etag string) (*UserAutocomplete, *Response, error) { query := fmt.Sprintf("?name=%v&limit=%d", username, limit) r, err := c.DoApiGet(c.GetUsersRoute()+"/autocomplete"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAutocompleteFromJson(r.Body), BuildResponse(r) + return UserAutocompleteFromJson(r.Body), BuildResponse(r), nil } // GetDefaultProfileImage gets the default user's profile image. Must be logged in. -func (c *Client4) GetDefaultProfileImage(userId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetUserRoute(userId)+"/image/default", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetDefaultProfileImage(userId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetUserRoute(userId)+"/image/default", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetDefaultProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetDefaultProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetProfileImage gets user's profile image. Must be logged in. -func (c *Client4) GetProfileImage(userId, etag string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetUserRoute(userId)+"/image", etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetProfileImage(userId, etag string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetUserRoute(userId)+"/image", etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetProfileImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetUsers returns a page of users on the system. Page counting starts at 0. -func (c *Client4) GetUsers(page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsers(page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersInTeam returns a page of users on a team. Page counting starts at 0. -func (c *Client4) GetUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?in_team=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetNewUsersInTeam returns a page of users on a team. Page counting starts at 0. -func (c *Client4) GetNewUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetNewUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?sort=create_at&in_team=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetRecentlyActiveUsersInTeam returns a page of users on a team. Page counting starts at 0. -func (c *Client4) GetRecentlyActiveUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetRecentlyActiveUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?sort=last_activity_at&in_team=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetActiveUsersInTeam returns a page of users on a team. Page counting starts at 0. -func (c *Client4) GetActiveUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetActiveUsersInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?active=true&in_team=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersNotInTeam returns a page of users who are not in a team. Page counting starts at 0. -func (c *Client4) GetUsersNotInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersNotInTeam(teamId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?not_in_team=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersInChannel returns a page of users in a channel. Page counting starts at 0. -func (c *Client4) GetUsersInChannel(channelId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersInChannel(channelId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?in_channel=%v&page=%v&per_page=%v", channelId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersInChannelByStatus returns a page of users in a channel. Page counting starts at 0. Sorted by Status -func (c *Client4) GetUsersInChannelByStatus(channelId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersInChannelByStatus(channelId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?in_channel=%v&page=%v&per_page=%v&sort=status", channelId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersNotInChannel returns a page of users not in a channel. Page counting starts at 0. -func (c *Client4) GetUsersNotInChannel(teamId, channelId string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersNotInChannel(teamId, channelId string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?in_team=%v¬_in_channel=%v&page=%v&per_page=%v", teamId, channelId, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersWithoutTeam returns a page of users on the system that aren't on any teams. Page counting starts at 0. -func (c *Client4) GetUsersWithoutTeam(page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersWithoutTeam(page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?without_team=1&page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersInGroup returns a page of users in a group. Page counting starts at 0. -func (c *Client4) GetUsersInGroup(groupID string, page int, perPage int, etag string) ([]*User, *Response) { +func (c *Client4) GetUsersInGroup(groupID string, page int, perPage int, etag string) ([]*User, *Response, error) { query := fmt.Sprintf("?in_group=%v&page=%v&per_page=%v", groupID, page, perPage) r, err := c.DoApiGet(c.GetUsersRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersByIds returns a list of users based on the provided user ids. -func (c *Client4) GetUsersByIds(userIds []string) ([]*User, *Response) { +func (c *Client4) GetUsersByIds(userIds []string) ([]*User, *Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/ids", ArrayToJson(userIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersByIds returns a list of users based on the provided user ids. -func (c *Client4) GetUsersByIdsWithOptions(userIds []string, options *UserGetByIdsOptions) ([]*User, *Response) { +func (c *Client4) GetUsersByIdsWithOptions(userIds []string, options *UserGetByIdsOptions) ([]*User, *Response, error) { v := url.Values{} if options.Since != 0 { v.Set("since", fmt.Sprintf("%d", options.Since)) @@ -1138,328 +1097,328 @@ func (c *Client4) GetUsersByIdsWithOptions(userIds []string, options *UserGetByI r, err := c.DoApiPost(url, ArrayToJson(userIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersByUsernames returns a list of users based on the provided usernames. -func (c *Client4) GetUsersByUsernames(usernames []string) ([]*User, *Response) { +func (c *Client4) GetUsersByUsernames(usernames []string) ([]*User, *Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/usernames", ArrayToJson(usernames)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // GetUsersByGroupChannelIds returns a map with channel ids as keys // and a list of users as values based on the provided user ids. -func (c *Client4) GetUsersByGroupChannelIds(groupChannelIds []string) (map[string][]*User, *Response) { +func (c *Client4) GetUsersByGroupChannelIds(groupChannelIds []string) (map[string][]*User, *Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/group_channels", ArrayToJson(groupChannelIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) usersByChannelId := map[string][]*User{} json.NewDecoder(r.Body).Decode(&usersByChannelId) - return usersByChannelId, BuildResponse(r) + return usersByChannelId, BuildResponse(r), nil } // SearchUsers returns a list of users based on some search criteria. -func (c *Client4) SearchUsers(search *UserSearch) ([]*User, *Response) { +func (c *Client4) SearchUsers(search *UserSearch) ([]*User, *Response, error) { buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("SearchUsers", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("SearchUsers", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/search", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUsersRoute()+"/search", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserListFromJson(r.Body), BuildResponse(r) + return UserListFromJson(r.Body), BuildResponse(r), nil } // UpdateUser updates a user in the system based on the provided user struct. -func (c *Client4) UpdateUser(user *User) (*User, *Response) { +func (c *Client4) UpdateUser(user *User) (*User, *Response, error) { buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetUserRoute(user.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetUserRoute(user.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // PatchUser partially updates a user in the system. Any missing fields are not updated. -func (c *Client4) PatchUser(userId string, patch *UserPatch) (*User, *Response) { +func (c *Client4) PatchUser(userId string, patch *UserPatch) (*User, *Response, error) { buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetUserRoute(userId)+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetUserRoute(userId)+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // UpdateUserAuth updates a user AuthData (uthData, authService and password) in the system. -func (c *Client4) UpdateUserAuth(userId string, userAuth *UserAuth) (*UserAuth, *Response) { +func (c *Client4) UpdateUserAuth(userId string, userAuth *UserAuth) (*UserAuth, *Response, error) { buf, err := json.Marshal(userAuth) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateUserAuth", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateUserAuth", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetUserRoute(userId)+"/auth", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetUserRoute(userId)+"/auth", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAuthFromJson(r.Body), BuildResponse(r) + return UserAuthFromJson(r.Body), BuildResponse(r), nil } // UpdateUserMfa activates multi-factor authentication for a user if activate // is true and a valid code is provided. If activate is false, then code is not // required and multi-factor authentication is disabled for the user. -func (c *Client4) UpdateUserMfa(userId, code string, activate bool) (bool, *Response) { +func (c *Client4) UpdateUserMfa(userId, code string, activate bool) (*Response, error) { requestBody := make(map[string]interface{}) requestBody["activate"] = activate requestBody["code"] = code r, err := c.DoApiPut(c.GetUserRoute(userId)+"/mfa", StringInterfaceToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GenerateMfaSecret will generate a new MFA secret for a user and return it as a string and // as a base64 encoded image QR code. -func (c *Client4) GenerateMfaSecret(userId string) (*MfaSecret, *Response) { +func (c *Client4) GenerateMfaSecret(userId string) (*MfaSecret, *Response, error) { r, err := c.DoApiPost(c.GetUserRoute(userId)+"/mfa/generate", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MfaSecretFromJson(r.Body), BuildResponse(r) + return MfaSecretFromJson(r.Body), BuildResponse(r), nil } // UpdateUserPassword updates a user's password. Must be logged in as the user or be a system administrator. -func (c *Client4) UpdateUserPassword(userId, currentPassword, newPassword string) (bool, *Response) { +func (c *Client4) UpdateUserPassword(userId, currentPassword, newPassword string) (*Response, error) { requestBody := map[string]string{"current_password": currentPassword, "new_password": newPassword} r, err := c.DoApiPut(c.GetUserRoute(userId)+"/password", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateUserHashedPassword updates a user's password with an already-hashed password. Must be a system administrator. -func (c *Client4) UpdateUserHashedPassword(userId, newHashedPassword string) (bool, *Response) { +func (c *Client4) UpdateUserHashedPassword(userId, newHashedPassword string) (*Response, error) { requestBody := map[string]string{"already_hashed": "true", "new_password": newHashedPassword} r, err := c.DoApiPut(c.GetUserRoute(userId)+"/password", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PromoteGuestToUser convert a guest into a regular user -func (c *Client4) PromoteGuestToUser(guestId string) (bool, *Response) { +func (c *Client4) PromoteGuestToUser(guestId string) (*Response, error) { r, err := c.DoApiPost(c.GetUserRoute(guestId)+"/promote", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DemoteUserToGuest convert a regular user into a guest -func (c *Client4) DemoteUserToGuest(guestId string) (bool, *Response) { +func (c *Client4) DemoteUserToGuest(guestId string) (*Response, error) { r, err := c.DoApiPost(c.GetUserRoute(guestId)+"/demote", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateUserRoles updates a user's roles in the system. A user can have "system_user" and "system_admin" roles. -func (c *Client4) UpdateUserRoles(userId, roles string) (bool, *Response) { +func (c *Client4) UpdateUserRoles(userId, roles string) (*Response, error) { requestBody := map[string]string{"roles": roles} r, err := c.DoApiPut(c.GetUserRoute(userId)+"/roles", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateUserActive updates status of a user whether active or not. -func (c *Client4) UpdateUserActive(userId string, active bool) (bool, *Response) { +func (c *Client4) UpdateUserActive(userId string, active bool) (*Response, error) { requestBody := make(map[string]interface{}) requestBody["active"] = active r, err := c.DoApiPut(c.GetUserRoute(userId)+"/active", StringInterfaceToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DeleteUser deactivates a user in the system based on the provided user id string. -func (c *Client4) DeleteUser(userId string) (bool, *Response) { +func (c *Client4) DeleteUser(userId string) (*Response, error) { r, err := c.DoApiDelete(c.GetUserRoute(userId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PermanentDeleteUser deletes a user in the system based on the provided user id string. -func (c *Client4) PermanentDeleteUser(userId string) (bool, *Response) { +func (c *Client4) PermanentDeleteUser(userId string) (*Response, error) { r, err := c.DoApiDelete(c.GetUserRoute(userId) + "?permanent=" + c.boolString(true)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // ConvertUserToBot converts a user to a bot user. -func (c *Client4) ConvertUserToBot(userId string) (*Bot, *Response) { - r, appErr := c.DoApiPost(c.GetUserRoute(userId)+"/convert_to_bot", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) ConvertUserToBot(userId string) (*Bot, *Response, error) { + r, err := c.DoApiPost(c.GetUserRoute(userId)+"/convert_to_bot", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("ConvertUserToBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("ConvertUserToBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // ConvertBotToUser converts a bot user to a user. -func (c *Client4) ConvertBotToUser(userId string, userPatch *UserPatch, setSystemAdmin bool) (*User, *Response) { +func (c *Client4) ConvertBotToUser(userId string, userPatch *UserPatch, setSystemAdmin bool) (*User, *Response, error) { var query string if setSystemAdmin { query = "?set_system_admin=true" } buf, err := json.Marshal(userPatch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("ConvertBotToUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("ConvertBotToUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetBotRoute(userId)+"/convert_to_user"+query, buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetBotRoute(userId)+"/convert_to_user"+query, buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // PermanentDeleteAll permanently deletes all users in the system. This is a local only endpoint -func (c *Client4) PermanentDeleteAllUsers() (bool, *Response) { +func (c *Client4) PermanentDeleteAllUsers() (*Response, error) { r, err := c.DoApiDelete(c.GetUsersRoute()) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SendPasswordResetEmail will send a link for password resetting to a user with the // provided email. -func (c *Client4) SendPasswordResetEmail(email string) (bool, *Response) { +func (c *Client4) SendPasswordResetEmail(email string) (*Response, error) { requestBody := map[string]string{"email": email} r, err := c.DoApiPost(c.GetUsersRoute()+"/password/reset/send", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // ResetPassword uses a recovery code to update reset a user's password. -func (c *Client4) ResetPassword(token, newPassword string) (bool, *Response) { +func (c *Client4) ResetPassword(token, newPassword string) (*Response, error) { requestBody := map[string]string{"token": token, "new_password": newPassword} r, err := c.DoApiPost(c.GetUsersRoute()+"/password/reset", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetSessions returns a list of sessions based on the provided user id string. -func (c *Client4) GetSessions(userId, etag string) ([]*Session, *Response) { +func (c *Client4) GetSessions(userId, etag string) ([]*Session, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId)+"/sessions", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return SessionsFromJson(r.Body), BuildResponse(r) + return SessionsFromJson(r.Body), BuildResponse(r), nil } // RevokeSession revokes a user session based on the provided user id and session id strings. -func (c *Client4) RevokeSession(userId, sessionId string) (bool, *Response) { +func (c *Client4) RevokeSession(userId, sessionId string) (*Response, error) { requestBody := map[string]string{"session_id": sessionId} r, err := c.DoApiPost(c.GetUserRoute(userId)+"/sessions/revoke", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // RevokeAllSessions revokes all sessions for the provided user id string. -func (c *Client4) RevokeAllSessions(userId string) (bool, *Response) { +func (c *Client4) RevokeAllSessions(userId string) (*Response, error) { r, err := c.DoApiPost(c.GetUserRoute(userId)+"/sessions/revoke/all", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // RevokeAllSessions revokes all sessions for all the users. -func (c *Client4) RevokeSessionsFromAllUsers() (bool, *Response) { +func (c *Client4) RevokeSessionsFromAllUsers() (*Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/sessions/revoke/all", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // AttachDeviceId attaches a mobile device ID to the current session. -func (c *Client4) AttachDeviceId(deviceId string) (bool, *Response) { +func (c *Client4) AttachDeviceId(deviceId string) (*Response, error) { requestBody := map[string]string{"device_id": deviceId} r, err := c.DoApiPut(c.GetUsersRoute()+"/sessions/device", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetTeamsUnreadForUser will return an array with TeamUnread objects that contain the amount // of unread messages and mentions the current user has for the teams it belongs to. // An optional team ID can be set to exclude that team from the results. // An optional boolean can be set to include collapsed thread unreads. Must be authenticated. -func (c *Client4) GetTeamsUnreadForUser(userId, teamIdToExclude string, includeCollapsedThreads bool) ([]*TeamUnread, *Response) { +func (c *Client4) GetTeamsUnreadForUser(userId, teamIdToExclude string, includeCollapsedThreads bool) ([]*TeamUnread, *Response, error) { query := url.Values{} if teamIdToExclude != "" { @@ -1472,93 +1431,93 @@ func (c *Client4) GetTeamsUnreadForUser(userId, teamIdToExclude string, includeC r, err := c.DoApiGet(c.GetUserRoute(userId)+"/teams/unread?"+query.Encode(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamsUnreadFromJson(r.Body), BuildResponse(r) + return TeamsUnreadFromJson(r.Body), BuildResponse(r), nil } // GetUserAudits returns a list of audit based on the provided user id string. -func (c *Client4) GetUserAudits(userId string, page int, perPage int, etag string) (Audits, *Response) { +func (c *Client4) GetUserAudits(userId string, page int, perPage int, etag string) (Audits, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetUserRoute(userId)+"/audits"+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetUserRoute(userId)+"/audits"+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var audits Audits - err := json.NewDecoder(r.Body).Decode(&audits) + err = json.NewDecoder(r.Body).Decode(&audits) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetUserAudits", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetUserAudits", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return audits, BuildResponse(r) + return audits, BuildResponse(r), nil } // VerifyUserEmail will verify a user's email using the supplied token. -func (c *Client4) VerifyUserEmail(token string) (bool, *Response) { +func (c *Client4) VerifyUserEmail(token string) (*Response, error) { requestBody := map[string]string{"token": token} r, err := c.DoApiPost(c.GetUsersRoute()+"/email/verify", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // VerifyUserEmailWithoutToken will verify a user's email by its Id. (Requires manage system role) -func (c *Client4) VerifyUserEmailWithoutToken(userId string) (*User, *Response) { +func (c *Client4) VerifyUserEmailWithoutToken(userId string) (*User, *Response, error) { r, err := c.DoApiPost(c.GetUserRoute(userId)+"/email/verify/member", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserFromJson(r.Body), BuildResponse(r) + return UserFromJson(r.Body), BuildResponse(r), nil } // SendVerificationEmail will send an email to the user with the provided email address, if // that user exists. The email will contain a link that can be used to verify the user's // email address. -func (c *Client4) SendVerificationEmail(email string) (bool, *Response) { +func (c *Client4) SendVerificationEmail(email string) (*Response, error) { requestBody := map[string]string{"email": email} r, err := c.DoApiPost(c.GetUsersRoute()+"/email/verify/send", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SetDefaultProfileImage resets the profile image to a default generated one. -func (c *Client4) SetDefaultProfileImage(userId string) (bool, *Response) { +func (c *Client4) SetDefaultProfileImage(userId string) (*Response, error) { r, err := c.DoApiDelete(c.GetUserRoute(userId) + "/image") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SetProfileImage sets profile image of the user. -func (c *Client4) SetProfileImage(userId string, data []byte) (bool, *Response) { +func (c *Client4) SetProfileImage(userId string, data []byte) (*Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("image", "profile.png") if err != nil { - return false, &Response{Error: NewAppError("SetProfileImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetProfileImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if _, err = io.Copy(part, bytes.NewBuffer(data)); err != nil { - return false, &Response{Error: NewAppError("SetProfileImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetProfileImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if err = writer.Close(); err != nil { - return false, &Response{Error: NewAppError("SetProfileImage", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetProfileImage", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest) } rq, err := http.NewRequest("POST", c.ApiUrl+c.GetUserRoute(userId)+"/image", bytes.NewReader(body.Bytes())) if err != nil { - return false, &Response{Error: NewAppError("SetProfileImage", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, err } rq.Header.Set("Content-Type", writer.FormDataContentType()) @@ -1567,384 +1526,384 @@ func (c *Client4) SetProfileImage(userId string, data []byte) (bool, *Response) } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetUserRoute(userId)+"/image", "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)} + if err != nil { + return BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return BuildResponse(rp), AppErrorFromJson(rp.Body) } - return CheckStatusOK(rp), BuildResponse(rp) + return BuildResponse(rp), nil } // CreateUserAccessToken will generate a user access token that can be used in place // of a session token to access the REST API. Must have the 'create_user_access_token' // permission and if generating for another user, must have the 'edit_other_users' // permission. A non-blank description is required. -func (c *Client4) CreateUserAccessToken(userId, description string) (*UserAccessToken, *Response) { +func (c *Client4) CreateUserAccessToken(userId, description string) (*UserAccessToken, *Response, error) { requestBody := map[string]string{"description": description} r, err := c.DoApiPost(c.GetUserRoute(userId)+"/tokens", MapToJson(requestBody)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAccessTokenFromJson(r.Body), BuildResponse(r) + return UserAccessTokenFromJson(r.Body), BuildResponse(r), nil } // GetUserAccessTokens will get a page of access tokens' id, description, is_active // and the user_id in the system. The actual token will not be returned. Must have // the 'manage_system' permission. -func (c *Client4) GetUserAccessTokens(page int, perPage int) ([]*UserAccessToken, *Response) { +func (c *Client4) GetUserAccessTokens(page int, perPage int) ([]*UserAccessToken, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUserAccessTokensRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAccessTokenListFromJson(r.Body), BuildResponse(r) + return UserAccessTokenListFromJson(r.Body), BuildResponse(r), nil } // GetUserAccessToken will get a user access tokens' id, description, is_active // and the user_id of the user it is for. The actual token will not be returned. // Must have the 'read_user_access_token' permission and if getting for another // user, must have the 'edit_other_users' permission. -func (c *Client4) GetUserAccessToken(tokenId string) (*UserAccessToken, *Response) { +func (c *Client4) GetUserAccessToken(tokenId string) (*UserAccessToken, *Response, error) { r, err := c.DoApiGet(c.GetUserAccessTokenRoute(tokenId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAccessTokenFromJson(r.Body), BuildResponse(r) + return UserAccessTokenFromJson(r.Body), BuildResponse(r), nil } // GetUserAccessTokensForUser will get a paged list of user access tokens showing id, // description and user_id for each. The actual tokens will not be returned. Must have // the 'read_user_access_token' permission and if getting for another user, must have the // 'edit_other_users' permission. -func (c *Client4) GetUserAccessTokensForUser(userId string, page, perPage int) ([]*UserAccessToken, *Response) { +func (c *Client4) GetUserAccessTokensForUser(userId string, page, perPage int) ([]*UserAccessToken, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUserRoute(userId)+"/tokens"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAccessTokenListFromJson(r.Body), BuildResponse(r) + return UserAccessTokenListFromJson(r.Body), BuildResponse(r), nil } // RevokeUserAccessToken will revoke a user access token by id. Must have the // 'revoke_user_access_token' permission and if revoking for another user, must have the // 'edit_other_users' permission. -func (c *Client4) RevokeUserAccessToken(tokenId string) (bool, *Response) { +func (c *Client4) RevokeUserAccessToken(tokenId string) (*Response, error) { requestBody := map[string]string{"token_id": tokenId} r, err := c.DoApiPost(c.GetUsersRoute()+"/tokens/revoke", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SearchUserAccessTokens returns user access tokens matching the provided search term. -func (c *Client4) SearchUserAccessTokens(search *UserAccessTokenSearch) ([]*UserAccessToken, *Response) { +func (c *Client4) SearchUserAccessTokens(search *UserAccessTokenSearch) ([]*UserAccessToken, *Response, error) { buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("SearchUserAccessTokens", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("SearchUserAccessTokens", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/tokens/search", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUsersRoute()+"/tokens/search", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UserAccessTokenListFromJson(r.Body), BuildResponse(r) + return UserAccessTokenListFromJson(r.Body), BuildResponse(r), nil } // DisableUserAccessToken will disable a user access token by id. Must have the // 'revoke_user_access_token' permission and if disabling for another user, must have the // 'edit_other_users' permission. -func (c *Client4) DisableUserAccessToken(tokenId string) (bool, *Response) { +func (c *Client4) DisableUserAccessToken(tokenId string) (*Response, error) { requestBody := map[string]string{"token_id": tokenId} r, err := c.DoApiPost(c.GetUsersRoute()+"/tokens/disable", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // EnableUserAccessToken will enable a user access token by id. Must have the // 'create_user_access_token' permission and if enabling for another user, must have the // 'edit_other_users' permission. -func (c *Client4) EnableUserAccessToken(tokenId string) (bool, *Response) { +func (c *Client4) EnableUserAccessToken(tokenId string) (*Response, error) { requestBody := map[string]string{"token_id": tokenId} r, err := c.DoApiPost(c.GetUsersRoute()+"/tokens/enable", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Bots section // CreateBot creates a bot in the system based on the provided bot struct. -func (c *Client4) CreateBot(bot *Bot) (*Bot, *Response) { - r, appErr := c.doApiPostBytes(c.GetBotsRoute(), bot.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) CreateBot(bot *Bot) (*Bot, *Response, error) { + r, err := c.doApiPostBytes(c.GetBotsRoute(), bot.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var resp *Bot - err := json.NewDecoder(r.Body).Decode(&resp) + err = json.NewDecoder(r.Body).Decode(&resp) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("CreateBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("CreateBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return resp, BuildResponse(r) + return resp, BuildResponse(r), nil } // PatchBot partially updates a bot. Any missing fields are not updated. -func (c *Client4) PatchBot(userId string, patch *BotPatch) (*Bot, *Response) { - r, appErr := c.doApiPutBytes(c.GetBotRoute(userId), patch.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) PatchBot(userId string, patch *BotPatch) (*Bot, *Response, error) { + r, err := c.doApiPutBytes(c.GetBotRoute(userId), patch.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("PatchBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("PatchBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // GetBot fetches the given, undeleted bot. -func (c *Client4) GetBot(userId string, etag string) (*Bot, *Response) { - r, appErr := c.DoApiGet(c.GetBotRoute(userId), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetBot(userId string, etag string) (*Bot, *Response, error) { + r, err := c.DoApiGet(c.GetBotRoute(userId), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // GetBotIncludeDeleted fetches the given bot, even if it is deleted. -func (c *Client4) GetBotIncludeDeleted(userId string, etag string) (*Bot, *Response) { - r, appErr := c.DoApiGet(c.GetBotRoute(userId)+"?include_deleted="+c.boolString(true), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetBotIncludeDeleted(userId string, etag string) (*Bot, *Response, error) { + r, err := c.DoApiGet(c.GetBotRoute(userId)+"?include_deleted="+c.boolString(true), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBotIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetBotIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // GetBots fetches the given page of bots, excluding deleted. -func (c *Client4) GetBots(page, perPage int, etag string) ([]*Bot, *Response) { +func (c *Client4) GetBots(page, perPage int, etag string) ([]*Bot, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetBotsRoute()+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetBotsRoute()+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bots BotList - err := json.NewDecoder(r.Body).Decode(&bots) + err = json.NewDecoder(r.Body).Decode(&bots) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBots", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetBots", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bots, BuildResponse(r) + return bots, BuildResponse(r), nil } // GetBotsIncludeDeleted fetches the given page of bots, including deleted. -func (c *Client4) GetBotsIncludeDeleted(page, perPage int, etag string) ([]*Bot, *Response) { +func (c *Client4) GetBotsIncludeDeleted(page, perPage int, etag string) ([]*Bot, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&include_deleted="+c.boolString(true), page, perPage) - r, appErr := c.DoApiGet(c.GetBotsRoute()+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetBotsRoute()+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bots BotList - err := json.NewDecoder(r.Body).Decode(&bots) + err = json.NewDecoder(r.Body).Decode(&bots) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBotsIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetBotsIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bots, BuildResponse(r) + return bots, BuildResponse(r), nil } // GetBotsOrphaned fetches the given page of bots, only including orphanded bots. -func (c *Client4) GetBotsOrphaned(page, perPage int, etag string) ([]*Bot, *Response) { +func (c *Client4) GetBotsOrphaned(page, perPage int, etag string) ([]*Bot, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&only_orphaned="+c.boolString(true), page, perPage) - r, appErr := c.DoApiGet(c.GetBotsRoute()+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetBotsRoute()+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bots BotList - err := json.NewDecoder(r.Body).Decode(&bots) + err = json.NewDecoder(r.Body).Decode(&bots) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBotsOrphaned", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetBotsOrphaned", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bots, BuildResponse(r) + return bots, BuildResponse(r), nil } // DisableBot disables the given bot in the system. -func (c *Client4) DisableBot(botUserId string) (*Bot, *Response) { - r, appErr := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/disable", nil) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) DisableBot(botUserId string) (*Bot, *Response, error) { + r, err := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/disable", nil) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("DisableBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("DisableBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // EnableBot disables the given bot in the system. -func (c *Client4) EnableBot(botUserId string) (*Bot, *Response) { - r, appErr := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/enable", nil) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) EnableBot(botUserId string) (*Bot, *Response, error) { + r, err := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/enable", nil) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("EnableBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("EnableBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // AssignBot assigns the given bot to the given user -func (c *Client4) AssignBot(botUserId, newOwnerId string) (*Bot, *Response) { - r, appErr := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/assign/"+newOwnerId, nil) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) AssignBot(botUserId, newOwnerId string) (*Bot, *Response, error) { + r, err := c.doApiPostBytes(c.GetBotRoute(botUserId)+"/assign/"+newOwnerId, nil) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var bot *Bot - err := json.NewDecoder(r.Body).Decode(&bot) + err = json.NewDecoder(r.Body).Decode(&bot) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("AssignBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("AssignBot", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return bot, BuildResponse(r) + return bot, BuildResponse(r), nil } // Team Section // CreateTeam creates a team in the system based on the provided team struct. -func (c *Client4) CreateTeam(team *Team) (*Team, *Response) { +func (c *Client4) CreateTeam(team *Team) (*Team, *Response, error) { buf, err := json.Marshal(team) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // GetTeam returns a team based on the provided team id string. -func (c *Client4) GetTeam(teamId, etag string) (*Team, *Response) { +func (c *Client4) GetTeam(teamId, etag string) (*Team, *Response, error) { r, err := c.DoApiGet(c.GetTeamRoute(teamId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // GetAllTeams returns all teams based on permissions. -func (c *Client4) GetAllTeams(etag string, page int, perPage int) ([]*Team, *Response) { +func (c *Client4) GetAllTeams(etag string, page int, perPage int) ([]*Team, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetTeamsRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamListFromJson(r.Body), BuildResponse(r) + return TeamListFromJson(r.Body), BuildResponse(r), nil } // GetAllTeamsWithTotalCount returns all teams based on permissions. -func (c *Client4) GetAllTeamsWithTotalCount(etag string, page int, perPage int) ([]*Team, int64, *Response) { +func (c *Client4) GetAllTeamsWithTotalCount(etag string, page int, perPage int) ([]*Team, int64, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&include_total_count="+c.boolString(true), page, perPage) r, err := c.DoApiGet(c.GetTeamsRoute()+query, etag) if err != nil { - return nil, 0, BuildErrorResponse(r, err) + return nil, 0, BuildResponse(r), err } defer closeBody(r) teamsListWithCount := TeamsWithCountFromJson(r.Body) - return teamsListWithCount.Teams, teamsListWithCount.TotalCount, BuildResponse(r) + return teamsListWithCount.Teams, teamsListWithCount.TotalCount, BuildResponse(r), nil } // GetAllTeamsExcludePolicyConstrained returns all teams which are not part of a data retention policy. // Must be a system administrator. -func (c *Client4) GetAllTeamsExcludePolicyConstrained(etag string, page int, perPage int) ([]*Team, *Response) { +func (c *Client4) GetAllTeamsExcludePolicyConstrained(etag string, page int, perPage int) ([]*Team, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&exclude_policy_constrained=%v", page, perPage, true) r, err := c.DoApiGet(c.GetTeamsRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamListFromJson(r.Body), BuildResponse(r) + return TeamListFromJson(r.Body), BuildResponse(r), nil } // GetTeamByName returns a team based on the provided team name string. -func (c *Client4) GetTeamByName(name, etag string) (*Team, *Response) { +func (c *Client4) GetTeamByName(name, etag string) (*Team, *Response, error) { r, err := c.DoApiGet(c.GetTeamByNameRoute(name), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // SearchTeams returns teams matching the provided search term. -func (c *Client4) SearchTeams(search *TeamSearch) ([]*Team, *Response) { +func (c *Client4) SearchTeams(search *TeamSearch) ([]*Team, *Response, error) { buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("SearchTeams", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("SearchTeams", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamListFromJson(r.Body), BuildResponse(r) + return TeamListFromJson(r.Body), BuildResponse(r), nil } // SearchTeamsPaged returns a page of teams and the total count matching the provided search term. -func (c *Client4) SearchTeamsPaged(search *TeamSearch) ([]*Team, int64, *Response) { +func (c *Client4) SearchTeamsPaged(search *TeamSearch) ([]*Team, int64, *Response, error) { if search.Page == nil { search.Page = NewInt(0) } @@ -1953,216 +1912,216 @@ func (c *Client4) SearchTeamsPaged(search *TeamSearch) ([]*Team, int64, *Respons } buf, err := json.Marshal(search) if err != nil { - return nil, 0, BuildErrorResponse(nil, NewAppError("SearchTeamsPaged", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, 0, BuildResponse(nil), NewAppError("SearchTeamsPaged", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) - if appErr != nil { - return nil, 0, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) + if err != nil { + return nil, 0, BuildResponse(r), err } defer closeBody(r) twc := TeamsWithCountFromJson(r.Body) - return twc.Teams, twc.TotalCount, BuildResponse(r) + return twc.Teams, twc.TotalCount, BuildResponse(r), nil } // TeamExists returns true or false if the team exist or not. -func (c *Client4) TeamExists(name, etag string) (bool, *Response) { +func (c *Client4) TeamExists(name, etag string) (bool, *Response, error) { r, err := c.DoApiGet(c.GetTeamByNameRoute(name)+"/exists", etag) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildResponse(r), err } defer closeBody(r) - return MapBoolFromJson(r.Body)["exists"], BuildResponse(r) + return MapBoolFromJson(r.Body)["exists"], BuildResponse(r), nil } // GetTeamsForUser returns a list of teams a user is on. Must be logged in as the user // or be a system administrator. -func (c *Client4) GetTeamsForUser(userId, etag string) ([]*Team, *Response) { +func (c *Client4) GetTeamsForUser(userId, etag string) ([]*Team, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId)+"/teams", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamListFromJson(r.Body), BuildResponse(r) + return TeamListFromJson(r.Body), BuildResponse(r), nil } // GetTeamMember returns a team member based on the provided team and user id strings. -func (c *Client4) GetTeamMember(teamId, userId, etag string) (*TeamMember, *Response) { +func (c *Client4) GetTeamMember(teamId, userId, etag string) (*TeamMember, *Response, error) { r, err := c.DoApiGet(c.GetTeamMemberRoute(teamId, userId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMemberFromJson(r.Body), BuildResponse(r) + return TeamMemberFromJson(r.Body), BuildResponse(r), nil } // UpdateTeamMemberRoles will update the roles on a team for a user. -func (c *Client4) UpdateTeamMemberRoles(teamId, userId, newRoles string) (bool, *Response) { +func (c *Client4) UpdateTeamMemberRoles(teamId, userId, newRoles string) (*Response, error) { requestBody := map[string]string{"roles": newRoles} r, err := c.DoApiPut(c.GetTeamMemberRoute(teamId, userId)+"/roles", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateTeamMemberSchemeRoles will update the scheme-derived roles on a team for a user. -func (c *Client4) UpdateTeamMemberSchemeRoles(teamId string, userId string, schemeRoles *SchemeRoles) (bool, *Response) { +func (c *Client4) UpdateTeamMemberSchemeRoles(teamId string, userId string, schemeRoles *SchemeRoles) (*Response, error) { buf, err := json.Marshal(schemeRoles) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("UpdateTeamMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("UpdateTeamMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetTeamMemberRoute(teamId, userId)+"/schemeRoles", buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetTeamMemberRoute(teamId, userId)+"/schemeRoles", buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateTeam will update a team. -func (c *Client4) UpdateTeam(team *Team) (*Team, *Response) { +func (c *Client4) UpdateTeam(team *Team) (*Team, *Response, error) { buf, err := json.Marshal(team) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetTeamRoute(team.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetTeamRoute(team.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // PatchTeam partially updates a team. Any missing fields are not updated. -func (c *Client4) PatchTeam(teamId string, patch *TeamPatch) (*Team, *Response) { +func (c *Client4) PatchTeam(teamId string, patch *TeamPatch) (*Team, *Response, error) { buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetTeamRoute(teamId)+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetTeamRoute(teamId)+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // RestoreTeam restores a previously deleted team. -func (c *Client4) RestoreTeam(teamId string) (*Team, *Response) { +func (c *Client4) RestoreTeam(teamId string) (*Team, *Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/restore", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // RegenerateTeamInviteId requests a new invite ID to be generated. -func (c *Client4) RegenerateTeamInviteId(teamId string) (*Team, *Response) { +func (c *Client4) RegenerateTeamInviteId(teamId string) (*Team, *Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/regenerate_invite_id", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // SoftDeleteTeam deletes the team softly (archive only, not permanent delete). -func (c *Client4) SoftDeleteTeam(teamId string) (bool, *Response) { +func (c *Client4) SoftDeleteTeam(teamId string) (*Response, error) { r, err := c.DoApiDelete(c.GetTeamRoute(teamId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PermanentDeleteTeam deletes the team, should only be used when needed for // compliance and the like. -func (c *Client4) PermanentDeleteTeam(teamId string) (bool, *Response) { +func (c *Client4) PermanentDeleteTeam(teamId string) (*Response, error) { r, err := c.DoApiDelete(c.GetTeamRoute(teamId) + "?permanent=" + c.boolString(true)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateTeamPrivacy modifies the team type (model.TeamOpen <--> model.TeamInvite) and sets // the corresponding AllowOpenInvite appropriately. -func (c *Client4) UpdateTeamPrivacy(teamId string, privacy string) (*Team, *Response) { +func (c *Client4) UpdateTeamPrivacy(teamId string, privacy string) (*Team, *Response, error) { requestBody := map[string]string{"privacy": privacy} r, err := c.DoApiPut(c.GetTeamRoute(teamId)+"/privacy", MapToJson(requestBody)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // GetTeamMembers returns team members based on the provided team id string. -func (c *Client4) GetTeamMembers(teamId string, page int, perPage int, etag string) ([]*TeamMember, *Response) { +func (c *Client4) GetTeamMembers(teamId string, page int, perPage int, etag string) ([]*TeamMember, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetTeamMembersRoute(teamId)+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersFromJson(r.Body), BuildResponse(r) + return TeamMembersFromJson(r.Body), BuildResponse(r), nil } // GetTeamMembersWithoutDeletedUsers returns team members based on the provided team id string. Additional parameters of sort and exclude_deleted_users accepted as well // Could not add it to above function due to it be a breaking change. -func (c *Client4) GetTeamMembersSortAndWithoutDeletedUsers(teamId string, page int, perPage int, sort string, excludeDeletedUsers bool, etag string) ([]*TeamMember, *Response) { +func (c *Client4) GetTeamMembersSortAndWithoutDeletedUsers(teamId string, page int, perPage int, sort string, excludeDeletedUsers bool, etag string) ([]*TeamMember, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&sort=%v&exclude_deleted_users=%v", page, perPage, sort, excludeDeletedUsers) r, err := c.DoApiGet(c.GetTeamMembersRoute(teamId)+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersFromJson(r.Body), BuildResponse(r) + return TeamMembersFromJson(r.Body), BuildResponse(r), nil } // GetTeamMembersForUser returns the team members for a user. -func (c *Client4) GetTeamMembersForUser(userId string, etag string) ([]*TeamMember, *Response) { +func (c *Client4) GetTeamMembersForUser(userId string, etag string) ([]*TeamMember, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId)+"/teams/members", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersFromJson(r.Body), BuildResponse(r) + return TeamMembersFromJson(r.Body), BuildResponse(r), nil } // GetTeamMembersByIds will return an array of team members based on the // team id and a list of user ids provided. Must be authenticated. -func (c *Client4) GetTeamMembersByIds(teamId string, userIds []string) ([]*TeamMember, *Response) { +func (c *Client4) GetTeamMembersByIds(teamId string, userIds []string) ([]*TeamMember, *Response, error) { r, err := c.DoApiPost(fmt.Sprintf("/teams/%v/members/ids", teamId), ArrayToJson(userIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersFromJson(r.Body), BuildResponse(r) + return TeamMembersFromJson(r.Body), BuildResponse(r), nil } // AddTeamMember adds user to a team and return a team member. -func (c *Client4) AddTeamMember(teamId, userId string) (*TeamMember, *Response) { +func (c *Client4) AddTeamMember(teamId, userId string) (*TeamMember, *Response, error) { member := &TeamMember{TeamId: teamId, UserId: userId} buf, err := json.Marshal(member) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("AddTeamMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("AddTeamMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamMembersRoute(teamId), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamMembersRoute(teamId), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMemberFromJson(r.Body), BuildResponse(r) + return TeamMemberFromJson(r.Body), BuildResponse(r), nil } // AddTeamMemberFromInvite adds a user to a team and return a team member using an invite id // or an invite token/data pair. -func (c *Client4) AddTeamMemberFromInvite(token, inviteId string) (*TeamMember, *Response) { +func (c *Client4) AddTeamMemberFromInvite(token, inviteId string) (*TeamMember, *Response, error) { var query string if inviteId != "" { @@ -2175,14 +2134,14 @@ func (c *Client4) AddTeamMemberFromInvite(token, inviteId string) (*TeamMember, r, err := c.DoApiPost(c.GetTeamsRoute()+"/members/invite"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMemberFromJson(r.Body), BuildResponse(r) + return TeamMemberFromJson(r.Body), BuildResponse(r), nil } // AddTeamMembers adds a number of users to a team and returns the team members. -func (c *Client4) AddTeamMembers(teamId string, userIds []string) ([]*TeamMember, *Response) { +func (c *Client4) AddTeamMembers(teamId string, userIds []string) ([]*TeamMember, *Response, error) { var members []*TeamMember for _, userId := range userIds { member := &TeamMember{TeamId: teamId, UserId: userId} @@ -2191,14 +2150,14 @@ func (c *Client4) AddTeamMembers(teamId string, userIds []string) ([]*TeamMember r, err := c.DoApiPost(c.GetTeamMembersRoute(teamId)+"/batch", TeamMembersToJson(members)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersFromJson(r.Body), BuildResponse(r) + return TeamMembersFromJson(r.Body), BuildResponse(r), nil } // AddTeamMembers adds a number of users to a team and returns the team members. -func (c *Client4) AddTeamMembersGracefully(teamId string, userIds []string) ([]*TeamMemberWithError, *Response) { +func (c *Client4) AddTeamMembersGracefully(teamId string, userIds []string) ([]*TeamMemberWithError, *Response, error) { var members []*TeamMember for _, userId := range userIds { member := &TeamMember{TeamId: teamId, UserId: userId} @@ -2207,107 +2166,107 @@ func (c *Client4) AddTeamMembersGracefully(teamId string, userIds []string) ([]* r, err := c.DoApiPost(c.GetTeamMembersRoute(teamId)+"/batch?graceful="+c.boolString(true), TeamMembersToJson(members)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamMembersWithErrorFromJson(r.Body), BuildResponse(r) + return TeamMembersWithErrorFromJson(r.Body), BuildResponse(r), nil } // RemoveTeamMember will remove a user from a team. -func (c *Client4) RemoveTeamMember(teamId, userId string) (bool, *Response) { +func (c *Client4) RemoveTeamMember(teamId, userId string) (*Response, error) { r, err := c.DoApiDelete(c.GetTeamMemberRoute(teamId, userId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetTeamStats returns a team stats based on the team id string. // Must be authenticated. -func (c *Client4) GetTeamStats(teamId, etag string) (*TeamStats, *Response) { +func (c *Client4) GetTeamStats(teamId, etag string) (*TeamStats, *Response, error) { r, err := c.DoApiGet(c.GetTeamStatsRoute(teamId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamStatsFromJson(r.Body), BuildResponse(r) + return TeamStatsFromJson(r.Body), BuildResponse(r), nil } // GetTotalUsersStats returns a total system user stats. // Must be authenticated. -func (c *Client4) GetTotalUsersStats(etag string) (*UsersStats, *Response) { +func (c *Client4) GetTotalUsersStats(etag string) (*UsersStats, *Response, error) { r, err := c.DoApiGet(c.GetTotalUsersStatsRoute(), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UsersStatsFromJson(r.Body), BuildResponse(r) + return UsersStatsFromJson(r.Body), BuildResponse(r), nil } // GetTeamUnread will return a TeamUnread object that contains the amount of // unread messages and mentions the user has for the specified team. // Must be authenticated. -func (c *Client4) GetTeamUnread(teamId, userId string) (*TeamUnread, *Response) { +func (c *Client4) GetTeamUnread(teamId, userId string) (*TeamUnread, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId)+c.GetTeamRoute(teamId)+"/unread", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamUnreadFromJson(r.Body), BuildResponse(r) + return TeamUnreadFromJson(r.Body), BuildResponse(r), nil } // ImportTeam will import an exported team from other app into a existing team. -func (c *Client4) ImportTeam(data []byte, filesize int, importFrom, filename, teamId string) (map[string]string, *Response) { +func (c *Client4) ImportTeam(data []byte, filesize int, importFrom, filename, teamId string) (map[string]string, *Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("file", filename) if err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if _, err = io.Copy(part, bytes.NewBuffer(data)); err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } part, err = writer.CreateFormField("filesize") if err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.file_size.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if _, err = io.Copy(part, strings.NewReader(strconv.Itoa(filesize))); err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.file_size.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } part, err = writer.CreateFormField("importFrom") if err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.import_from.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if _, err := io.Copy(part, strings.NewReader(importFrom)); err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.import_from.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if err := writer.Close(); err != nil { - return nil, &Response{Error: NewAppError("UploadImportTeam", "model.client.upload_post_attachment.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } return c.DoUploadImportTeam(c.GetTeamImportRoute(teamId), body.Bytes(), writer.FormDataContentType()) } // InviteUsersToTeam invite users by email to the team. -func (c *Client4) InviteUsersToTeam(teamId string, userEmails []string) (bool, *Response) { +func (c *Client4) InviteUsersToTeam(teamId string, userEmails []string) (*Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/invite/email", ArrayToJson(userEmails)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // InviteGuestsToTeam invite guest by email to some channels in a team. -func (c *Client4) InviteGuestsToTeam(teamId string, userEmails []string, channels []string, message string) (bool, *Response) { +func (c *Client4) InviteGuestsToTeam(teamId string, userEmails []string, channels []string, message string) (*Response, error) { guestsInvite := GuestsInvite{ Emails: userEmails, Channels: channels, @@ -2315,28 +2274,28 @@ func (c *Client4) InviteGuestsToTeam(teamId string, userEmails []string, channel } buf, err := json.Marshal(guestsInvite) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("InviteGuestsToTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("InviteGuestsToTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email", buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email", buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // InviteUsersToTeam invite users by email to the team. -func (c *Client4) InviteUsersToTeamGracefully(teamId string, userEmails []string) ([]*EmailInviteWithError, *Response) { +func (c *Client4) InviteUsersToTeamGracefully(teamId string, userEmails []string) ([]*EmailInviteWithError, *Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/invite/email?graceful="+c.boolString(true), ArrayToJson(userEmails)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return EmailInviteWithErrorFromJson(r.Body), BuildResponse(r) + return EmailInviteWithErrorFromJson(r.Body), BuildResponse(r), nil } // InviteGuestsToTeam invite guest by email to some channels in a team. -func (c *Client4) InviteGuestsToTeamGracefully(teamId string, userEmails []string, channels []string, message string) ([]*EmailInviteWithError, *Response) { +func (c *Client4) InviteGuestsToTeamGracefully(teamId string, userEmails []string, channels []string, message string) ([]*EmailInviteWithError, *Response, error) { guestsInvite := GuestsInvite{ Emails: userEmails, Channels: channels, @@ -2344,57 +2303,57 @@ func (c *Client4) InviteGuestsToTeamGracefully(teamId string, userEmails []strin } buf, err := json.Marshal(guestsInvite) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("InviteGuestsToTeamGracefully", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("InviteGuestsToTeamGracefully", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email?graceful="+c.boolString(true), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email?graceful="+c.boolString(true), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return EmailInviteWithErrorFromJson(r.Body), BuildResponse(r) + return EmailInviteWithErrorFromJson(r.Body), BuildResponse(r), nil } // InvalidateEmailInvites will invalidate active email invitations that have not been accepted by the user. -func (c *Client4) InvalidateEmailInvites() (bool, *Response) { +func (c *Client4) InvalidateEmailInvites() (*Response, error) { r, err := c.DoApiDelete(c.GetTeamsRoute() + "/invites/email") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetTeamInviteInfo returns a team object from an invite id containing sanitized information. -func (c *Client4) GetTeamInviteInfo(inviteId string) (*Team, *Response) { +func (c *Client4) GetTeamInviteInfo(inviteId string) (*Team, *Response, error) { r, err := c.DoApiGet(c.GetTeamsRoute()+"/invite/"+inviteId, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamFromJson(r.Body), BuildResponse(r) + return TeamFromJson(r.Body), BuildResponse(r), nil } // SetTeamIcon sets team icon of the team. -func (c *Client4) SetTeamIcon(teamId string, data []byte) (bool, *Response) { +func (c *Client4) SetTeamIcon(teamId string, data []byte) (*Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("image", "teamIcon.png") if err != nil { - return false, &Response{Error: NewAppError("SetTeamIcon", "model.client.set_team_icon.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetTeamIcon", "model.client.set_team_icon.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if _, err = io.Copy(part, bytes.NewBuffer(data)); err != nil { - return false, &Response{Error: NewAppError("SetTeamIcon", "model.client.set_team_icon.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetTeamIcon", "model.client.set_team_icon.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if err = writer.Close(); err != nil { - return false, &Response{Error: NewAppError("SetTeamIcon", "model.client.set_team_icon.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("SetTeamIcon", "model.client.set_team_icon.writer.app_error", nil, err.Error(), http.StatusBadRequest) } rq, err := http.NewRequest("POST", c.ApiUrl+c.GetTeamRoute(teamId)+"/image", bytes.NewReader(body.Bytes())) if err != nil { - return false, &Response{Error: NewAppError("SetTeamIcon", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, err } rq.Header.Set("Content-Type", writer.FormDataContentType()) @@ -2403,1005 +2362,1004 @@ func (c *Client4) SetTeamIcon(teamId string, data []byte) (bool, *Response) { } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - // set to http.StatusForbidden(403) - return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetTeamRoute(teamId)+"/image", "model.client.connecting.app_error", nil, err.Error(), 403)} + if err != nil { + return BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return BuildResponse(rp), AppErrorFromJson(rp.Body) } - return CheckStatusOK(rp), BuildResponse(rp) + return BuildResponse(rp), nil } // GetTeamIcon gets the team icon of the team. -func (c *Client4) GetTeamIcon(teamId, etag string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetTeamRoute(teamId)+"/image", etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetTeamIcon(teamId, etag string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetTeamRoute(teamId)+"/image", etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetTeamIcon", "model.client.get_team_icon.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetTeamIcon", "model.client.get_team_icon.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // RemoveTeamIcon updates LastTeamIconUpdate to 0 which indicates team icon is removed. -func (c *Client4) RemoveTeamIcon(teamId string) (bool, *Response) { +func (c *Client4) RemoveTeamIcon(teamId string) (*Response, error) { r, err := c.DoApiDelete(c.GetTeamRoute(teamId) + "/image") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Channel Section // GetAllChannels get all the channels. Must be a system administrator. -func (c *Client4) GetAllChannels(page int, perPage int, etag string) (*ChannelListWithTeamData, *Response) { +func (c *Client4) GetAllChannels(page int, perPage int, etag string) (*ChannelListWithTeamData, *Response, error) { return c.getAllChannels(page, perPage, etag, ChannelSearchOpts{}) } // GetAllChannelsIncludeDeleted get all the channels. Must be a system administrator. -func (c *Client4) GetAllChannelsIncludeDeleted(page int, perPage int, etag string) (*ChannelListWithTeamData, *Response) { +func (c *Client4) GetAllChannelsIncludeDeleted(page int, perPage int, etag string) (*ChannelListWithTeamData, *Response, error) { return c.getAllChannels(page, perPage, etag, ChannelSearchOpts{IncludeDeleted: true}) } // GetAllChannelsExcludePolicyConstrained gets all channels which are not part of a data retention policy. // Must be a system administrator. -func (c *Client4) GetAllChannelsExcludePolicyConstrained(page, perPage int, etag string) (*ChannelListWithTeamData, *Response) { +func (c *Client4) GetAllChannelsExcludePolicyConstrained(page, perPage int, etag string) (*ChannelListWithTeamData, *Response, error) { return c.getAllChannels(page, perPage, etag, ChannelSearchOpts{ExcludePolicyConstrained: true}) } -func (c *Client4) getAllChannels(page int, perPage int, etag string, opts ChannelSearchOpts) (*ChannelListWithTeamData, *Response) { +func (c *Client4) getAllChannels(page int, perPage int, etag string, opts ChannelSearchOpts) (*ChannelListWithTeamData, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&include_deleted=%v&exclude_policy_constrained=%v", page, perPage, opts.IncludeDeleted, opts.ExcludePolicyConstrained) - r, appErr := c.DoApiGet(c.GetChannelsRoute()+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsRoute()+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelListWithTeamData - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("getAllChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("getAllChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetAllChannelsWithCount get all the channels including the total count. Must be a system administrator. -func (c *Client4) GetAllChannelsWithCount(page int, perPage int, etag string) (*ChannelListWithTeamData, int64, *Response) { +func (c *Client4) GetAllChannelsWithCount(page int, perPage int, etag string) (*ChannelListWithTeamData, int64, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&include_total_count="+c.boolString(true), page, perPage) - r, appErr := c.DoApiGet(c.GetChannelsRoute()+query, etag) - if appErr != nil { - return nil, 0, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsRoute()+query, etag) + if err != nil { + return nil, 0, BuildResponse(r), err } defer closeBody(r) var cwc *ChannelsWithCount - err := json.NewDecoder(r.Body).Decode(&cwc) + err = json.NewDecoder(r.Body).Decode(&cwc) if err != nil { - return nil, 0, BuildErrorResponse(r, NewAppError("GetAllChannelsWithCount", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, 0, BuildResponse(r), NewAppError("GetAllChannelsWithCount", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return cwc.Channels, cwc.TotalCount, BuildResponse(r) + return cwc.Channels, cwc.TotalCount, BuildResponse(r), nil } // CreateChannel creates a channel based on the provided channel struct. -func (c *Client4) CreateChannel(channel *Channel) (*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsRoute(), channel.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) - } - defer closeBody(r) - - var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) +func (c *Client4) CreateChannel(channel *Channel) (*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsRoute(), channel.ToJson()) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("CreateChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) - } - return ch, BuildResponse(r) -} - -// UpdateChannel updates a channel based on the provided channel struct. -func (c *Client4) UpdateChannel(channel *Channel) (*Channel, *Response) { - r, appErr := c.DoApiPut(c.GetChannelRoute(channel.Id), channel.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) - } - defer closeBody(r) - - var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) - if err != nil { - return nil, BuildErrorResponse(r, NewAppError("UpdateChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) - } - return ch, BuildResponse(r) -} - -// PatchChannel partially updates a channel. Any missing fields are not updated. -func (c *Client4) PatchChannel(channelId string, patch *ChannelPatch) (*Channel, *Response) { - buf, err := json.Marshal(patch) - if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) - } - r, appErr := c.doApiPutBytes(c.GetChannelRoute(channelId)+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("CreateChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil +} + +// UpdateChannel updates a channel based on the provided channel struct. +func (c *Client4) UpdateChannel(channel *Channel) (*Channel, *Response, error) { + r, err := c.DoApiPut(c.GetChannelRoute(channel.Id), channel.ToJson()) + if err != nil { + return nil, BuildResponse(r), err + } + defer closeBody(r) + + var ch *Channel + err = json.NewDecoder(r.Body).Decode(&ch) + if err != nil { + return nil, BuildResponse(r), NewAppError("UpdateChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) + } + return ch, BuildResponse(r), nil +} + +// PatchChannel partially updates a channel. Any missing fields are not updated. +func (c *Client4) PatchChannel(channelId string, patch *ChannelPatch) (*Channel, *Response, error) { + buf, err := json.Marshal(patch) + if err != nil { + return nil, nil, NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) + } + r, err := c.doApiPutBytes(c.GetChannelRoute(channelId)+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err + } + defer closeBody(r) + + var ch *Channel + err = json.NewDecoder(r.Body).Decode(&ch) + if err != nil { + return nil, BuildResponse(r), NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) + } + return ch, BuildResponse(r), nil } // ConvertChannelToPrivate converts public to private channel. -func (c *Client4) ConvertChannelToPrivate(channelId string) (*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelRoute(channelId)+"/convert", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) ConvertChannelToPrivate(channelId string) (*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelRoute(channelId)+"/convert", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("ConvertChannelToPrivate", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("ConvertChannelToPrivate", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // UpdateChannelPrivacy updates channel privacy -func (c *Client4) UpdateChannelPrivacy(channelId string, privacy ChannelType) (*Channel, *Response) { +func (c *Client4) UpdateChannelPrivacy(channelId string, privacy ChannelType) (*Channel, *Response, error) { requestBody := map[string]string{"privacy": string(privacy)} - r, appErr := c.DoApiPut(c.GetChannelRoute(channelId)+"/privacy", MapToJson(requestBody)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPut(c.GetChannelRoute(channelId)+"/privacy", MapToJson(requestBody)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("UpdateChannelPrivacy", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("UpdateChannelPrivacy", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // RestoreChannel restores a previously deleted channel. Any missing fields are not updated. -func (c *Client4) RestoreChannel(channelId string) (*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelRoute(channelId)+"/restore", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) RestoreChannel(channelId string) (*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelRoute(channelId)+"/restore", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("RestoreChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("RestoreChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // CreateDirectChannel creates a direct message channel based on the two user // ids provided. -func (c *Client4) CreateDirectChannel(userId1, userId2 string) (*Channel, *Response) { +func (c *Client4) CreateDirectChannel(userId1, userId2 string) (*Channel, *Response, error) { requestBody := []string{userId1, userId2} - r, appErr := c.DoApiPost(c.GetChannelsRoute()+"/direct", ArrayToJson(requestBody)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(c.GetChannelsRoute()+"/direct", ArrayToJson(requestBody)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("CreateDirectChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("CreateDirectChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // CreateGroupChannel creates a group message channel based on userIds provided. -func (c *Client4) CreateGroupChannel(userIds []string) (*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsRoute()+"/group", ArrayToJson(userIds)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) CreateGroupChannel(userIds []string) (*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsRoute()+"/group", ArrayToJson(userIds)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("CreateGroupChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("CreateGroupChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannel returns a channel based on the provided channel id string. -func (c *Client4) GetChannel(channelId, etag string) (*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelRoute(channelId), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannel(channelId, etag string) (*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelRoute(channelId), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelStats returns statistics for a channel. -func (c *Client4) GetChannelStats(channelId string, etag string) (*ChannelStats, *Response) { +func (c *Client4) GetChannelStats(channelId string, etag string) (*ChannelStats, *Response, error) { r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/stats", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ChannelStatsFromJson(r.Body), BuildResponse(r) + return ChannelStatsFromJson(r.Body), BuildResponse(r), nil } // GetChannelMembersTimezones gets a list of timezones for a channel. -func (c *Client4) GetChannelMembersTimezones(channelId string) ([]string, *Response) { +func (c *Client4) GetChannelMembersTimezones(channelId string) ([]string, *Response, error) { r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/timezones", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } // GetPinnedPosts gets a list of pinned posts. -func (c *Client4) GetPinnedPosts(channelId string, etag string) (*PostList, *Response) { +func (c *Client4) GetPinnedPosts(channelId string, etag string) (*PostList, *Response, error) { r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/pinned", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPrivateChannelsForTeam returns a list of private channels based on the provided team id string. -func (c *Client4) GetPrivateChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response) { +func (c *Client4) GetPrivateChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response, error) { query := fmt.Sprintf("/private?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetPrivateChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetPrivateChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetPublicChannelsForTeam returns a list of public channels based on the provided team id string. -func (c *Client4) GetPublicChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response) { +func (c *Client4) GetPublicChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetPublicChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetPublicChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetDeletedChannelsForTeam returns a list of public channels based on the provided team id string. -func (c *Client4) GetDeletedChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response) { +func (c *Client4) GetDeletedChannelsForTeam(teamId string, page int, perPage int, etag string) ([]*Channel, *Response, error) { query := fmt.Sprintf("/deleted?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetDeletedChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetDeletedChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetPublicChannelsByIdsForTeam returns a list of public channels based on provided team id string. -func (c *Client4) GetPublicChannelsByIdsForTeam(teamId string, channelIds []string) ([]*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/ids", ArrayToJson(channelIds)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetPublicChannelsByIdsForTeam(teamId string, channelIds []string) ([]*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/ids", ArrayToJson(channelIds)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetPublicChannelsByIdsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetPublicChannelsByIdsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelsForTeamForUser returns a list channels of on a team for a user. -func (c *Client4) GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool, etag string) ([]*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelsForTeamForUserRoute(teamId, userId, includeDeleted), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool, etag string) ([]*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelsForTeamForUserRoute(teamId, userId, includeDeleted), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelsForTeamForUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelsForTeamForUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelsForTeamAndUserWithLastDeleteAt returns a list channels of a team for a user, additionally filtered with lastDeleteAt. This does not have any effect if includeDeleted is set to false. -func (c *Client4) GetChannelsForTeamAndUserWithLastDeleteAt(teamId, userId string, includeDeleted bool, lastDeleteAt int, etag string) ([]*Channel, *Response) { +func (c *Client4) GetChannelsForTeamAndUserWithLastDeleteAt(teamId, userId string, includeDeleted bool, lastDeleteAt int, etag string) ([]*Channel, *Response, error) { route := fmt.Sprintf(c.GetUserRoute(userId) + c.GetTeamRoute(teamId) + "/channels") route += fmt.Sprintf("?include_deleted=%v&last_delete_at=%d", includeDeleted, lastDeleteAt) - r, appErr := c.DoApiGet(route, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(route, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelsForTeamAndUserWithLastDeleteAt", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelsForTeamAndUserWithLastDeleteAt", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // SearchChannels returns the channels on a team matching the provided search term. -func (c *Client4) SearchChannels(teamId string, search *ChannelSearch) ([]*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/search", search.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) SearchChannels(teamId string, search *ChannelSearch) ([]*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/search", search.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("SearchChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("SearchChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // SearchArchivedChannels returns the archived channels on a team matching the provided search term. -func (c *Client4) SearchArchivedChannels(teamId string, search *ChannelSearch) ([]*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/search_archived", search.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) SearchArchivedChannels(teamId string, search *ChannelSearch) ([]*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsForTeamRoute(teamId)+"/search_archived", search.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("SearchArchivedChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("SearchArchivedChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // SearchAllChannels search in all the channels. Must be a system administrator. -func (c *Client4) SearchAllChannels(search *ChannelSearch) (*ChannelListWithTeamData, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsRoute()+"/search", search.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) SearchAllChannels(search *ChannelSearch) (*ChannelListWithTeamData, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsRoute()+"/search", search.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelListWithTeamData - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("SearchAllChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("SearchAllChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // SearchAllChannelsPaged searches all the channels and returns the results paged with the total count. -func (c *Client4) SearchAllChannelsPaged(search *ChannelSearch) (*ChannelsWithCount, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsRoute()+"/search", search.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) SearchAllChannelsPaged(search *ChannelSearch) (*ChannelsWithCount, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsRoute()+"/search", search.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cwc *ChannelsWithCount - err := json.NewDecoder(r.Body).Decode(&cwc) + err = json.NewDecoder(r.Body).Decode(&cwc) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetAllChannelsWithCount", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetAllChannelsWithCount", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return cwc, BuildResponse(r) + return cwc, BuildResponse(r), nil } // SearchGroupChannels returns the group channels of the user whose members' usernames match the search term. -func (c *Client4) SearchGroupChannels(search *ChannelSearch) ([]*Channel, *Response) { - r, appErr := c.DoApiPost(c.GetChannelsRoute()+"/group/search", search.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) SearchGroupChannels(search *ChannelSearch) ([]*Channel, *Response, error) { + r, err := c.DoApiPost(c.GetChannelsRoute()+"/group/search", search.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("SearchGroupChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("SearchGroupChannels", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // DeleteChannel deletes channel based on the provided channel id string. -func (c *Client4) DeleteChannel(channelId string) (bool, *Response) { +func (c *Client4) DeleteChannel(channelId string) (*Response, error) { r, err := c.DoApiDelete(c.GetChannelRoute(channelId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PermanentDeleteChannel deletes a channel based on the provided channel id string. -func (c *Client4) PermanentDeleteChannel(channelId string) (bool, *Response) { +func (c *Client4) PermanentDeleteChannel(channelId string) (*Response, error) { r, err := c.DoApiDelete(c.GetChannelRoute(channelId) + "?permanent=" + c.boolString(true)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // MoveChannel moves the channel to the destination team. -func (c *Client4) MoveChannel(channelId, teamId string, force bool) (*Channel, *Response) { +func (c *Client4) MoveChannel(channelId, teamId string, force bool) (*Channel, *Response, error) { requestBody := map[string]interface{}{ "team_id": teamId, "force": force, } - r, appErr := c.DoApiPost(c.GetChannelRoute(channelId)+"/move", StringInterfaceToJson(requestBody)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(c.GetChannelRoute(channelId)+"/move", StringInterfaceToJson(requestBody)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("MoveChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("MoveChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelByName returns a channel based on the provided channel name and team id strings. -func (c *Client4) GetChannelByName(channelName, teamId string, etag string) (*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelByNameRoute(channelName, teamId), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelByName(channelName, teamId string, etag string) (*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelByNameRoute(channelName, teamId), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelByName", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelByName", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelByNameIncludeDeleted returns a channel based on the provided channel name and team id strings. Other then GetChannelByName it will also return deleted channels. -func (c *Client4) GetChannelByNameIncludeDeleted(channelName, teamId string, etag string) (*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelByNameRoute(channelName, teamId)+"?include_deleted="+c.boolString(true), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelByNameIncludeDeleted(channelName, teamId string, etag string) (*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelByNameRoute(channelName, teamId)+"?include_deleted="+c.boolString(true), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelByNameIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelByNameIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelByNameForTeamName returns a channel based on the provided channel name and team name strings. -func (c *Client4) GetChannelByNameForTeamName(channelName, teamName string, etag string) (*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelByNameForTeamNameRoute(channelName, teamName), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelByNameForTeamName(channelName, teamName string, etag string) (*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelByNameForTeamNameRoute(channelName, teamName), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelByNameForTeamName", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelByNameForTeamName", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelByNameForTeamNameIncludeDeleted returns a channel based on the provided channel name and team name strings. Other then GetChannelByNameForTeamName it will also return deleted channels. -func (c *Client4) GetChannelByNameForTeamNameIncludeDeleted(channelName, teamName string, etag string) (*Channel, *Response) { - r, appErr := c.DoApiGet(c.GetChannelByNameForTeamNameRoute(channelName, teamName)+"?include_deleted="+c.boolString(true), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelByNameForTeamNameIncludeDeleted(channelName, teamName string, etag string) (*Channel, *Response, error) { + r, err := c.DoApiGet(c.GetChannelByNameForTeamNameRoute(channelName, teamName)+"?include_deleted="+c.boolString(true), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelByNameForTeamNameIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelByNameForTeamNameIncludeDeleted", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelMembers gets a page of channel members. -func (c *Client4) GetChannelMembers(channelId string, page, perPage int, etag string) (*ChannelMembers, *Response) { +func (c *Client4) GetChannelMembers(channelId string, page, perPage int, etag string) (*ChannelMembers, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet(c.GetChannelMembersRoute(channelId)+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelMembersRoute(channelId)+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMembers - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelMembers", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelMembers", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelMembersByIds gets the channel members in a channel for a list of user ids. -func (c *Client4) GetChannelMembersByIds(channelId string, userIds []string) (*ChannelMembers, *Response) { - r, appErr := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"/ids", ArrayToJson(userIds)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelMembersByIds(channelId string, userIds []string) (*ChannelMembers, *Response, error) { + r, err := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"/ids", ArrayToJson(userIds)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMembers - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelMembersByIds", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelMembersByIds", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelMember gets a channel member. -func (c *Client4) GetChannelMember(channelId, userId, etag string) (*ChannelMember, *Response) { - r, appErr := c.DoApiGet(c.GetChannelMemberRoute(channelId, userId), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelMember(channelId, userId, etag string) (*ChannelMember, *Response, error) { + r, err := c.DoApiGet(c.GetChannelMemberRoute(channelId, userId), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMember - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelMembersForUser gets all the channel members for a user on a team. -func (c *Client4) GetChannelMembersForUser(userId, teamId, etag string) (*ChannelMembers, *Response) { - r, appErr := c.DoApiGet(fmt.Sprintf(c.GetUserRoute(userId)+"/teams/%v/channels/members", teamId), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelMembersForUser(userId, teamId, etag string) (*ChannelMembers, *Response, error) { + r, err := c.DoApiGet(fmt.Sprintf(c.GetUserRoute(userId)+"/teams/%v/channels/members", teamId), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMembers - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelMembersForUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelMembersForUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // ViewChannel performs a view action for a user. Synonymous with switching channels or marking channels as read by a user. -func (c *Client4) ViewChannel(userId string, view *ChannelView) (*ChannelViewResponse, *Response) { +func (c *Client4) ViewChannel(userId string, view *ChannelView) (*ChannelViewResponse, *Response, error) { url := fmt.Sprintf(c.GetChannelsRoute()+"/members/%v/view", userId) buf, err := json.Marshal(view) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(url, buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(url, buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelViewResponse err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // GetChannelUnread will return a ChannelUnread object that contains the number of // unread messages and mentions for a user. -func (c *Client4) GetChannelUnread(channelId, userId string) (*ChannelUnread, *Response) { - r, appErr := c.DoApiGet(c.GetUserRoute(userId)+c.GetChannelRoute(channelId)+"/unread", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelUnread(channelId, userId string) (*ChannelUnread, *Response, error) { + r, err := c.DoApiGet(c.GetUserRoute(userId)+c.GetChannelRoute(channelId)+"/unread", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelUnread - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelUnread", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelUnread", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // UpdateChannelRoles will update the roles on a channel for a user. -func (c *Client4) UpdateChannelRoles(channelId, userId, roles string) (bool, *Response) { +func (c *Client4) UpdateChannelRoles(channelId, userId, roles string) (*Response, error) { requestBody := map[string]string{"roles": roles} r, err := c.DoApiPut(c.GetChannelMemberRoute(channelId, userId)+"/roles", MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateChannelMemberSchemeRoles will update the scheme-derived roles on a channel for a user. -func (c *Client4) UpdateChannelMemberSchemeRoles(channelId string, userId string, schemeRoles *SchemeRoles) (bool, *Response) { +func (c *Client4) UpdateChannelMemberSchemeRoles(channelId string, userId string, schemeRoles *SchemeRoles) (*Response, error) { buf, err := json.Marshal(schemeRoles) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("UpdateChannelMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("UpdateChannelMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetChannelMemberRoute(channelId, userId)+"/schemeRoles", buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetChannelMemberRoute(channelId, userId)+"/schemeRoles", buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateChannelNotifyProps will update the notification properties on a channel for a user. -func (c *Client4) UpdateChannelNotifyProps(channelId, userId string, props map[string]string) (bool, *Response) { +func (c *Client4) UpdateChannelNotifyProps(channelId, userId string, props map[string]string) (*Response, error) { r, err := c.DoApiPut(c.GetChannelMemberRoute(channelId, userId)+"/notify_props", MapToJson(props)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // AddChannelMember adds user to channel and return a channel member. -func (c *Client4) AddChannelMember(channelId, userId string) (*ChannelMember, *Response) { +func (c *Client4) AddChannelMember(channelId, userId string) (*ChannelMember, *Response, error) { requestBody := map[string]string{"user_id": userId} - r, appErr := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"", MapToJson(requestBody)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"", MapToJson(requestBody)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMember - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("AddChannelMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("AddChannelMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // AddChannelMemberWithRootId adds user to channel and return a channel member. Post add to channel message has the postRootId. -func (c *Client4) AddChannelMemberWithRootId(channelId, userId, postRootId string) (*ChannelMember, *Response) { +func (c *Client4) AddChannelMemberWithRootId(channelId, userId, postRootId string) (*ChannelMember, *Response, error) { requestBody := map[string]string{"user_id": userId, "post_root_id": postRootId} - r, appErr := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"", MapToJson(requestBody)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(c.GetChannelMembersRoute(channelId)+"", MapToJson(requestBody)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelMember - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("AddChannelMemberWithRootId", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("AddChannelMemberWithRootId", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // RemoveUserFromChannel will delete the channel member object for a user, effectively removing the user from a channel. -func (c *Client4) RemoveUserFromChannel(channelId, userId string) (bool, *Response) { +func (c *Client4) RemoveUserFromChannel(channelId, userId string) (*Response, error) { r, err := c.DoApiDelete(c.GetChannelMemberRoute(channelId, userId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // AutocompleteChannelsForTeam will return an ordered list of channels autocomplete suggestions. -func (c *Client4) AutocompleteChannelsForTeam(teamId, name string) (*ChannelList, *Response) { +func (c *Client4) AutocompleteChannelsForTeam(teamId, name string) (*ChannelList, *Response, error) { query := fmt.Sprintf("?name=%v", name) - r, app := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+"/autocomplete"+query, "") - if app != nil { - return nil, BuildErrorResponse(r, app) + r, err := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+"/autocomplete"+query, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelList - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("AutocompleteChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("AutocompleteChannelsForTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // AutocompleteChannelsForTeamForSearch will return an ordered list of your channels autocomplete suggestions. -func (c *Client4) AutocompleteChannelsForTeamForSearch(teamId, name string) (*ChannelList, *Response) { +func (c *Client4) AutocompleteChannelsForTeamForSearch(teamId, name string) (*ChannelList, *Response, error) { query := fmt.Sprintf("?name=%v", name) - r, appErr := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+"/search_autocomplete"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetChannelsForTeamRoute(teamId)+"/search_autocomplete"+query, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch *ChannelList - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("AutocompleteChannelsForTeamForSearch", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("AutocompleteChannelsForTeamForSearch", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // Post Section // CreatePost creates a post based on the provided post struct. -func (c *Client4) CreatePost(post *Post) (*Post, *Response) { +func (c *Client4) CreatePost(post *Post) (*Post, *Response, error) { r, err := c.DoApiPost(c.GetPostsRoute(), post.ToUnsanitizedJson()) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostFromJson(r.Body), BuildResponse(r) + return PostFromJson(r.Body), BuildResponse(r), nil } // CreatePostEphemeral creates a ephemeral post based on the provided post struct which is send to the given user id. -func (c *Client4) CreatePostEphemeral(post *PostEphemeral) (*Post, *Response) { +func (c *Client4) CreatePostEphemeral(post *PostEphemeral) (*Post, *Response, error) { r, err := c.DoApiPost(c.GetPostsEphemeralRoute(), post.ToUnsanitizedJson()) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostFromJson(r.Body), BuildResponse(r) + return PostFromJson(r.Body), BuildResponse(r), nil } // UpdatePost updates a post based on the provided post struct. -func (c *Client4) UpdatePost(postId string, post *Post) (*Post, *Response) { +func (c *Client4) UpdatePost(postId string, post *Post) (*Post, *Response, error) { r, err := c.DoApiPut(c.GetPostRoute(postId), post.ToUnsanitizedJson()) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostFromJson(r.Body), BuildResponse(r) + return PostFromJson(r.Body), BuildResponse(r), nil } // PatchPost partially updates a post. Any missing fields are not updated. -func (c *Client4) PatchPost(postId string, patch *PostPatch) (*Post, *Response) { +func (c *Client4) PatchPost(postId string, patch *PostPatch) (*Post, *Response, error) { buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchPost", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchPost", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetPostRoute(postId)+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetPostRoute(postId)+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return PostFromJson(r.Body), BuildResponse(r) + return PostFromJson(r.Body), BuildResponse(r), nil } // SetPostUnread marks channel where post belongs as unread on the time of the provided post. -func (c *Client4) SetPostUnread(userId string, postId string, collapsedThreadsSupported bool) *Response { +func (c *Client4) SetPostUnread(userId string, postId string, collapsedThreadsSupported bool) (*Response, error) { b, err := json.Marshal(map[string]bool{"collapsed_threads_supported": collapsedThreadsSupported}) if err != nil { - return BuildErrorResponse(nil, NewAppError("SetPostUnread", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("SetPostUnread", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUserRoute(userId)+c.GetPostRoute(postId)+"/set_unread", b) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUserRoute(userId)+c.GetPostRoute(postId)+"/set_unread", b) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // PinPost pin a post based on provided post id string. -func (c *Client4) PinPost(postId string) (bool, *Response) { +func (c *Client4) PinPost(postId string) (*Response, error) { r, err := c.DoApiPost(c.GetPostRoute(postId)+"/pin", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UnpinPost unpin a post based on provided post id string. -func (c *Client4) UnpinPost(postId string) (bool, *Response) { +func (c *Client4) UnpinPost(postId string) (*Response, error) { r, err := c.DoApiPost(c.GetPostRoute(postId)+"/unpin", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetPost gets a single post. -func (c *Client4) GetPost(postId string, etag string) (*Post, *Response) { +func (c *Client4) GetPost(postId string, etag string) (*Post, *Response, error) { r, err := c.DoApiGet(c.GetPostRoute(postId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostFromJson(r.Body), BuildResponse(r) + return PostFromJson(r.Body), BuildResponse(r), nil } // DeletePost deletes a post from the provided post id string. -func (c *Client4) DeletePost(postId string) (bool, *Response) { +func (c *Client4) DeletePost(postId string) (*Response, error) { r, err := c.DoApiDelete(c.GetPostRoute(postId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetPostThread gets a post with all the other posts in the same thread. -func (c *Client4) GetPostThread(postId string, etag string, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostThread(postId string, etag string, collapsedThreads bool) (*PostList, *Response, error) { url := c.GetPostRoute(postId) + "/thread" if collapsedThreads { url += "?collapsedThreads=true" } r, err := c.DoApiGet(url, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPostsForChannel gets a page of posts with an array for ordering for a channel. -func (c *Client4) GetPostsForChannel(channelId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostsForChannel(channelId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) if collapsedThreads { query += "&collapsedThreads=true" } r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/posts"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetFlaggedPostsForUser returns flagged posts of a user based on user id string. -func (c *Client4) GetFlaggedPostsForUser(userId string, page int, perPage int) (*PostList, *Response) { +func (c *Client4) GetFlaggedPostsForUser(userId string, page int, perPage int) (*PostList, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUserRoute(userId)+"/posts/flagged"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetFlaggedPostsForUserInTeam returns flagged posts in team of a user based on user id string. -func (c *Client4) GetFlaggedPostsForUserInTeam(userId string, teamId string, page int, perPage int) (*PostList, *Response) { +func (c *Client4) GetFlaggedPostsForUserInTeam(userId string, teamId string, page int, perPage int) (*PostList, *Response, error) { if !IsValidId(teamId) { - return nil, &Response{StatusCode: http.StatusBadRequest, Error: NewAppError("GetFlaggedPostsForUserInTeam", "model.client.get_flagged_posts_in_team.missing_parameter.app_error", nil, "", http.StatusBadRequest)} + return nil, nil, NewAppError("GetFlaggedPostsForUserInTeam", "model.client.get_flagged_posts_in_team.missing_parameter.app_error", nil, "", http.StatusBadRequest) } query := fmt.Sprintf("?team_id=%v&page=%v&per_page=%v", teamId, page, perPage) r, err := c.DoApiGet(c.GetUserRoute(userId)+"/posts/flagged"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetFlaggedPostsForUserInChannel returns flagged posts in channel of a user based on user id string. -func (c *Client4) GetFlaggedPostsForUserInChannel(userId string, channelId string, page int, perPage int) (*PostList, *Response) { +func (c *Client4) GetFlaggedPostsForUserInChannel(userId string, channelId string, page int, perPage int) (*PostList, *Response, error) { if !IsValidId(channelId) { - return nil, &Response{StatusCode: http.StatusBadRequest, Error: NewAppError("GetFlaggedPostsForUserInChannel", "model.client.get_flagged_posts_in_channel.missing_parameter.app_error", nil, "", http.StatusBadRequest)} + return nil, nil, NewAppError("GetFlaggedPostsForUserInChannel", "model.client.get_flagged_posts_in_channel.missing_parameter.app_error", nil, "", http.StatusBadRequest) } query := fmt.Sprintf("?channel_id=%v&page=%v&per_page=%v", channelId, page, perPage) r, err := c.DoApiGet(c.GetUserRoute(userId)+"/posts/flagged"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPostsSince gets posts created after a specified time as Unix time in milliseconds. -func (c *Client4) GetPostsSince(channelId string, time int64, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostsSince(channelId string, time int64, collapsedThreads bool) (*PostList, *Response, error) { query := fmt.Sprintf("?since=%v", time) if collapsedThreads { query += "&collapsedThreads=true" } r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/posts"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPostsAfter gets a page of posts that were posted after the post provided. -func (c *Client4) GetPostsAfter(channelId, postId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostsAfter(channelId, postId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&after=%v", page, perPage, postId) if collapsedThreads { query += "&collapsedThreads=true" } r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/posts"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPostsBefore gets a page of posts that were posted before the post provided. -func (c *Client4) GetPostsBefore(channelId, postId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostsBefore(channelId, postId string, page, perPage int, etag string, collapsedThreads bool) (*PostList, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&before=%v", page, perPage, postId) if collapsedThreads { query += "&collapsedThreads=true" } r, err := c.DoApiGet(c.GetChannelRoute(channelId)+"/posts"+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // GetPostsAroundLastUnread gets a list of posts around last unread post by a user in a channel. -func (c *Client4) GetPostsAroundLastUnread(userId, channelId string, limitBefore, limitAfter int, collapsedThreads bool) (*PostList, *Response) { +func (c *Client4) GetPostsAroundLastUnread(userId, channelId string, limitBefore, limitAfter int, collapsedThreads bool) (*PostList, *Response, error) { query := fmt.Sprintf("?limit_before=%v&limit_after=%v", limitBefore, limitAfter) if collapsedThreads { query += "&collapsedThreads=true" } r, err := c.DoApiGet(c.GetUserRoute(userId)+c.GetChannelRoute(channelId)+"/posts/unread"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // SearchFiles returns any posts with matching terms string. -func (c *Client4) SearchFiles(teamId string, terms string, isOrSearch bool) (*FileInfoList, *Response) { +func (c *Client4) SearchFiles(teamId string, terms string, isOrSearch bool) (*FileInfoList, *Response, error) { params := SearchParameter{ Terms: &terms, IsOrSearch: &isOrSearch, @@ -3410,17 +3368,17 @@ func (c *Client4) SearchFiles(teamId string, terms string, isOrSearch bool) (*Fi } // SearchFilesWithParams returns any posts with matching terms string. -func (c *Client4) SearchFilesWithParams(teamId string, params *SearchParameter) (*FileInfoList, *Response) { +func (c *Client4) SearchFilesWithParams(teamId string, params *SearchParameter) (*FileInfoList, *Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/files/search", params.SearchParameterToJson()) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return FileInfoListFromJson(r.Body), BuildResponse(r) + return FileInfoListFromJson(r.Body), BuildResponse(r), nil } // SearchPosts returns any posts with matching terms string. -func (c *Client4) SearchPosts(teamId string, terms string, isOrSearch bool) (*PostList, *Response) { +func (c *Client4) SearchPosts(teamId string, terms string, isOrSearch bool) (*PostList, *Response, error) { params := SearchParameter{ Terms: &terms, IsOrSearch: &isOrSearch, @@ -3429,38 +3387,38 @@ func (c *Client4) SearchPosts(teamId string, terms string, isOrSearch bool) (*Po } // SearchPostsWithParams returns any posts with matching terms string. -func (c *Client4) SearchPostsWithParams(teamId string, params *SearchParameter) (*PostList, *Response) { +func (c *Client4) SearchPostsWithParams(teamId string, params *SearchParameter) (*PostList, *Response, error) { r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/posts/search", params.SearchParameterToJson()) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostListFromJson(r.Body), BuildResponse(r) + return PostListFromJson(r.Body), BuildResponse(r), nil } // SearchPostsWithMatches returns any posts with matching terms string, including. -func (c *Client4) SearchPostsWithMatches(teamId string, terms string, isOrSearch bool) (*PostSearchResults, *Response) { +func (c *Client4) SearchPostsWithMatches(teamId string, terms string, isOrSearch bool) (*PostSearchResults, *Response, error) { requestBody := map[string]interface{}{"terms": terms, "is_or_search": isOrSearch} r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/posts/search", StringInterfaceToJson(requestBody)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PostSearchResultsFromJson(r.Body), BuildResponse(r) + return PostSearchResultsFromJson(r.Body), BuildResponse(r), nil } // DoPostAction performs a post action. -func (c *Client4) DoPostAction(postId, actionId string) (bool, *Response) { +func (c *Client4) DoPostAction(postId, actionId string) (*Response, error) { r, err := c.DoApiPost(c.GetPostRoute(postId)+"/actions/"+actionId, "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DoPostActionWithCookie performs a post action with extra arguments -func (c *Client4) DoPostActionWithCookie(postId, actionId, selected, cookieStr string) (bool, *Response) { +func (c *Client4) DoPostActionWithCookie(postId, actionId, selected, cookieStr string) (*Response, error) { var body []byte if selected != "" || cookieStr != "" { body, _ = json.Marshal(DoPostActionRequest{ @@ -3470,69 +3428,69 @@ func (c *Client4) DoPostActionWithCookie(postId, actionId, selected, cookieStr s } r, err := c.DoApiPost(c.GetPostRoute(postId)+"/actions/"+actionId, string(body)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // OpenInteractiveDialog sends a WebSocket event to a user's clients to // open interactive dialogs, based on the provided trigger ID and other // provided data. Used with interactive message buttons, menus and // slash commands. -func (c *Client4) OpenInteractiveDialog(request OpenDialogRequest) (bool, *Response) { +func (c *Client4) OpenInteractiveDialog(request OpenDialogRequest) (*Response, error) { b, _ := json.Marshal(request) r, err := c.DoApiPost("/actions/dialogs/open", string(b)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // SubmitInteractiveDialog will submit the provided dialog data to the integration // configured by the URL. Used with the interactive dialogs integration feature. -func (c *Client4) SubmitInteractiveDialog(request SubmitDialogRequest) (*SubmitDialogResponse, *Response) { +func (c *Client4) SubmitInteractiveDialog(request SubmitDialogRequest) (*SubmitDialogResponse, *Response, error) { b, _ := json.Marshal(request) r, err := c.DoApiPost("/actions/dialogs/submit", string(b)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) var resp SubmitDialogResponse json.NewDecoder(r.Body).Decode(&resp) - return &resp, BuildResponse(r) + return &resp, BuildResponse(r), nil } // UploadFile will upload a file to a channel using a multipart request, to be later attached to a post. // This method is functionally equivalent to Client4.UploadFileAsRequestBody. -func (c *Client4) UploadFile(data []byte, channelId string, filename string) (*FileUploadResponse, *Response) { +func (c *Client4) UploadFile(data []byte, channelId string, filename string) (*FileUploadResponse, *Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormField("channel_id") if err != nil { - return nil, &Response{Error: NewAppError("UploadPostAttachment", "model.client.upload_post_attachment.channel_id.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } _, err = io.Copy(part, strings.NewReader(channelId)) if err != nil { - return nil, &Response{Error: NewAppError("UploadPostAttachment", "model.client.upload_post_attachment.channel_id.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } part, err = writer.CreateFormFile("files", filename) if err != nil { - return nil, &Response{Error: NewAppError("UploadPostAttachment", "model.client.upload_post_attachment.file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } _, err = io.Copy(part, bytes.NewBuffer(data)) if err != nil { - return nil, &Response{Error: NewAppError("UploadPostAttachment", "model.client.upload_post_attachment.file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } err = writer.Close() if err != nil { - return nil, &Response{Error: NewAppError("UploadPostAttachment", "model.client.upload_post_attachment.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } return c.DoUploadFile(c.GetFilesRoute(), body.Bytes(), writer.FormDataContentType()) @@ -3540,353 +3498,353 @@ func (c *Client4) UploadFile(data []byte, channelId string, filename string) (*F // UploadFileAsRequestBody will upload a file to a channel as the body of a request, to be later attached // to a post. This method is functionally equivalent to Client4.UploadFile. -func (c *Client4) UploadFileAsRequestBody(data []byte, channelId string, filename string) (*FileUploadResponse, *Response) { +func (c *Client4) UploadFileAsRequestBody(data []byte, channelId string, filename string) (*FileUploadResponse, *Response, error) { return c.DoUploadFile(c.GetFilesRoute()+fmt.Sprintf("?channel_id=%v&filename=%v", url.QueryEscape(channelId), url.QueryEscape(filename)), data, http.DetectContentType(data)) } // GetFile gets the bytes for a file by id. -func (c *Client4) GetFile(fileId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetFile(fileId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // DownloadFile gets the bytes for a file by id, optionally adding headers to force the browser to download it. -func (c *Client4) DownloadFile(fileId string, download bool) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("?download=%v", download), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) DownloadFile(fileId string, download bool) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("?download=%v", download), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("DownloadFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("DownloadFile", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetFileThumbnail gets the bytes for a file by id. -func (c *Client4) GetFileThumbnail(fileId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId)+"/thumbnail", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetFileThumbnail(fileId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/thumbnail", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // DownloadFileThumbnail gets the bytes for a file by id, optionally adding headers to force the browser to download it. -func (c *Client4) DownloadFileThumbnail(fileId string, download bool) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/thumbnail?download=%v", download), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) DownloadFileThumbnail(fileId string, download bool) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/thumbnail?download=%v", download), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("DownloadFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("DownloadFileThumbnail", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetFileLink gets the public link of a file by id. -func (c *Client4) GetFileLink(fileId string) (string, *Response) { +func (c *Client4) GetFileLink(fileId string) (string, *Response, error) { r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/link", "") if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["link"], BuildResponse(r) + return MapFromJson(r.Body)["link"], BuildResponse(r), nil } // GetFilePreview gets the bytes for a file by id. -func (c *Client4) GetFilePreview(fileId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId)+"/preview", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetFilePreview(fileId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/preview", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // DownloadFilePreview gets the bytes for a file by id. -func (c *Client4) DownloadFilePreview(fileId string, download bool) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/preview?download=%v", download), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) DownloadFilePreview(fileId string, download bool) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetFileRoute(fileId)+fmt.Sprintf("/preview?download=%v", download), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("DownloadFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("DownloadFilePreview", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetFileInfo gets all the file info objects. -func (c *Client4) GetFileInfo(fileId string) (*FileInfo, *Response) { +func (c *Client4) GetFileInfo(fileId string) (*FileInfo, *Response, error) { r, err := c.DoApiGet(c.GetFileRoute(fileId)+"/info", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return FileInfoFromJson(r.Body), BuildResponse(r) + return FileInfoFromJson(r.Body), BuildResponse(r), nil } // GetFileInfosForPost gets all the file info objects attached to a post. -func (c *Client4) GetFileInfosForPost(postId string, etag string) ([]*FileInfo, *Response) { +func (c *Client4) GetFileInfosForPost(postId string, etag string) ([]*FileInfo, *Response, error) { r, err := c.DoApiGet(c.GetPostRoute(postId)+"/files/info", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return FileInfosFromJson(r.Body), BuildResponse(r) + return FileInfosFromJson(r.Body), BuildResponse(r), nil } // General/System Section // GenerateSupportPacket downloads the generated support packet -func (c *Client4) GenerateSupportPacket() ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetSystemRoute()+"/support_packet", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GenerateSupportPacket() ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetSystemRoute()+"/support_packet", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetFile", "model.client.read_job_result_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetFile", "model.client.read_job_result_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // GetPing will return ok if the running goRoutines are below the threshold and unhealthy for above. -func (c *Client4) GetPing() (string, *Response) { +func (c *Client4) GetPing() (string, *Response, error) { r, err := c.DoApiGet(c.GetSystemRoute()+"/ping", "") if r != nil && r.StatusCode == 500 { defer r.Body.Close() - return StatusUnhealthy, BuildErrorResponse(r, err) + return StatusUnhealthy, BuildResponse(r), err } if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["status"], BuildResponse(r) + return MapFromJson(r.Body)["status"], BuildResponse(r), nil } // GetPingWithServerStatus will return ok if several basic server health checks // all pass successfully. -func (c *Client4) GetPingWithServerStatus() (string, *Response) { +func (c *Client4) GetPingWithServerStatus() (string, *Response, error) { r, err := c.DoApiGet(c.GetSystemRoute()+"/ping?get_server_status="+c.boolString(true), "") if r != nil && r.StatusCode == 500 { defer r.Body.Close() - return StatusUnhealthy, BuildErrorResponse(r, err) + return StatusUnhealthy, BuildResponse(r), err } if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["status"], BuildResponse(r) + return MapFromJson(r.Body)["status"], BuildResponse(r), nil } // GetPingWithFullServerStatus will return the full status if several basic server // health checks all pass successfully. -func (c *Client4) GetPingWithFullServerStatus() (map[string]string, *Response) { +func (c *Client4) GetPingWithFullServerStatus() (map[string]string, *Response, error) { r, err := c.DoApiGet(c.GetSystemRoute()+"/ping?get_server_status="+c.boolString(true), "") if r != nil && r.StatusCode == 500 { defer r.Body.Close() - return map[string]string{"status": StatusUnhealthy}, BuildErrorResponse(r, err) + return map[string]string{"status": StatusUnhealthy}, BuildResponse(r), err } if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body), BuildResponse(r) + return MapFromJson(r.Body), BuildResponse(r), nil } // TestEmail will attempt to connect to the configured SMTP server. -func (c *Client4) TestEmail(config *Config) (bool, *Response) { +func (c *Client4) TestEmail(config *Config) (*Response, error) { buf, err := json.Marshal(config) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("TestEmail", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("TestEmail", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTestEmailRoute(), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTestEmailRoute(), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // TestSiteURL will test the validity of a site URL. -func (c *Client4) TestSiteURL(siteURL string) (bool, *Response) { +func (c *Client4) TestSiteURL(siteURL string) (*Response, error) { requestBody := make(map[string]string) requestBody["site_url"] = siteURL r, err := c.DoApiPost(c.GetTestSiteURLRoute(), MapToJson(requestBody)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // TestS3Connection will attempt to connect to the AWS S3. -func (c *Client4) TestS3Connection(config *Config) (bool, *Response) { +func (c *Client4) TestS3Connection(config *Config) (*Response, error) { buf, err := json.Marshal(config) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("TestS3Connection", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("TestS3Connection", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetTestS3Route(), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetTestS3Route(), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetConfig will retrieve the server config with some sanitized items. -func (c *Client4) GetConfig() (*Config, *Response) { +func (c *Client4) GetConfig() (*Config, *Response, error) { r, err := c.DoApiGet(c.GetConfigRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ConfigFromJson(r.Body), BuildResponse(r) + return ConfigFromJson(r.Body), BuildResponse(r), nil } // ReloadConfig will reload the server configuration. -func (c *Client4) ReloadConfig() (bool, *Response) { +func (c *Client4) ReloadConfig() (*Response, error) { r, err := c.DoApiPost(c.GetConfigRoute()+"/reload", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetOldClientConfig will retrieve the parts of the server configuration needed by the // client, formatted in the old format. -func (c *Client4) GetOldClientConfig(etag string) (map[string]string, *Response) { +func (c *Client4) GetOldClientConfig(etag string) (map[string]string, *Response, error) { r, err := c.DoApiGet(c.GetConfigRoute()+"/client?format=old", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body), BuildResponse(r) + return MapFromJson(r.Body), BuildResponse(r), nil } // GetEnvironmentConfig will retrieve a map mirroring the server configuration where fields // are set to true if the corresponding config setting is set through an environment variable. // Settings that haven't been set through environment variables will be missing from the map. -func (c *Client4) GetEnvironmentConfig() (map[string]interface{}, *Response) { +func (c *Client4) GetEnvironmentConfig() (map[string]interface{}, *Response, error) { r, err := c.DoApiGet(c.GetConfigRoute()+"/environment", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return StringInterfaceFromJson(r.Body), BuildResponse(r) + return StringInterfaceFromJson(r.Body), BuildResponse(r), nil } // GetOldClientLicense will retrieve the parts of the server license needed by the // client, formatted in the old format. -func (c *Client4) GetOldClientLicense(etag string) (map[string]string, *Response) { +func (c *Client4) GetOldClientLicense(etag string) (map[string]string, *Response, error) { r, err := c.DoApiGet(c.GetLicenseRoute()+"/client?format=old", etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body), BuildResponse(r) + return MapFromJson(r.Body), BuildResponse(r), nil } // DatabaseRecycle will recycle the connections. Discard current connection and get new one. -func (c *Client4) DatabaseRecycle() (bool, *Response) { +func (c *Client4) DatabaseRecycle() (*Response, error) { r, err := c.DoApiPost(c.GetDatabaseRoute()+"/recycle", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // InvalidateCaches will purge the cache and can affect the performance while is cleaning. -func (c *Client4) InvalidateCaches() (bool, *Response) { +func (c *Client4) InvalidateCaches() (*Response, error) { r, err := c.DoApiPost(c.GetCacheRoute()+"/invalidate", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateConfig will update the server configuration. -func (c *Client4) UpdateConfig(config *Config) (*Config, *Response) { +func (c *Client4) UpdateConfig(config *Config) (*Config, *Response, error) { buf, err := json.Marshal(config) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetConfigRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetConfigRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return ConfigFromJson(r.Body), BuildResponse(r) + return ConfigFromJson(r.Body), BuildResponse(r), nil } // MigrateConfig will migrate existing config to the new one. -func (c *Client4) MigrateConfig(from, to string) (bool, *Response) { +func (c *Client4) MigrateConfig(from, to string) (*Response, error) { m := make(map[string]string, 2) m["from"] = from m["to"] = to r, err := c.DoApiPost(c.GetConfigRoute()+"/migrate", MapToJson(m)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return true, BuildResponse(r) + return BuildResponse(r), nil } // UploadLicenseFile will add a license file to the system. -func (c *Client4) UploadLicenseFile(data []byte) (bool, *Response) { +func (c *Client4) UploadLicenseFile(data []byte) (*Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("license", "test-license.mattermost-license") if err != nil { - return false, &Response{Error: NewAppError("UploadLicenseFile", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadLicenseFile", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if _, err = io.Copy(part, bytes.NewBuffer(data)); err != nil { - return false, &Response{Error: NewAppError("UploadLicenseFile", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadLicenseFile", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if err = writer.Close(); err != nil { - return false, &Response{Error: NewAppError("UploadLicenseFile", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadLicenseFile", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest) } rq, err := http.NewRequest("POST", c.ApiUrl+c.GetLicenseRoute(), bytes.NewReader(body.Bytes())) if err != nil { - return false, &Response{Error: NewAppError("UploadLicenseFile", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, err } rq.Header.Set("Content-Type", writer.FormDataContentType()) @@ -3895,288 +3853,293 @@ func (c *Client4) UploadLicenseFile(data []byte) (bool, *Response) { } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetLicenseRoute(), "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)} + if err != nil { + return BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return BuildResponse(rp), AppErrorFromJson(rp.Body) } - return CheckStatusOK(rp), BuildResponse(rp) + return BuildResponse(rp), nil } // RemoveLicenseFile will remove the server license it exists. Note that this will // disable all enterprise features. -func (c *Client4) RemoveLicenseFile() (bool, *Response) { +func (c *Client4) RemoveLicenseFile() (*Response, error) { r, err := c.DoApiDelete(c.GetLicenseRoute()) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetAnalyticsOld will retrieve analytics using the old format. New format is not // available but the "/analytics" endpoint is reserved for it. The "name" argument is optional // and defaults to "standard". The "teamId" argument is optional and will limit results // to a specific team. -func (c *Client4) GetAnalyticsOld(name, teamId string) (AnalyticsRows, *Response) { +func (c *Client4) GetAnalyticsOld(name, teamId string) (AnalyticsRows, *Response, error) { query := fmt.Sprintf("?name=%v&team_id=%v", name, teamId) - r, appErr := c.DoApiGet(c.GetAnalyticsRoute()+"/old"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetAnalyticsRoute()+"/old"+query, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var rows AnalyticsRows - err := json.NewDecoder(r.Body).Decode(&rows) + err = json.NewDecoder(r.Body).Decode(&rows) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetAnalyticsOld", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetAnalyticsOld", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return rows, BuildResponse(r) + return rows, BuildResponse(r), nil } // Webhooks Section // CreateIncomingWebhook creates an incoming webhook for a channel. -func (c *Client4) CreateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response) { +func (c *Client4) CreateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response, error) { buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetIncomingWebhooksRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetIncomingWebhooksRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return IncomingWebhookFromJson(r.Body), BuildResponse(r) + return IncomingWebhookFromJson(r.Body), BuildResponse(r), nil } // UpdateIncomingWebhook updates an incoming webhook for a channel. -func (c *Client4) UpdateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response) { +func (c *Client4) UpdateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response, error) { buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetIncomingWebhookRoute(hook.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetIncomingWebhookRoute(hook.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return IncomingWebhookFromJson(r.Body), BuildResponse(r) + return IncomingWebhookFromJson(r.Body), BuildResponse(r), nil } // GetIncomingWebhooks returns a page of incoming webhooks on the system. Page counting starts at 0. -func (c *Client4) GetIncomingWebhooks(page int, perPage int, etag string) ([]*IncomingWebhook, *Response) { +func (c *Client4) GetIncomingWebhooks(page int, perPage int, etag string) ([]*IncomingWebhook, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetIncomingWebhooksRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return IncomingWebhookListFromJson(r.Body), BuildResponse(r) + return IncomingWebhookListFromJson(r.Body), BuildResponse(r), nil } // GetIncomingWebhooksForTeam returns a page of incoming webhooks for a team. Page counting starts at 0. -func (c *Client4) GetIncomingWebhooksForTeam(teamId string, page int, perPage int, etag string) ([]*IncomingWebhook, *Response) { +func (c *Client4) GetIncomingWebhooksForTeam(teamId string, page int, perPage int, etag string) ([]*IncomingWebhook, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&team_id=%v", page, perPage, teamId) r, err := c.DoApiGet(c.GetIncomingWebhooksRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return IncomingWebhookListFromJson(r.Body), BuildResponse(r) + return IncomingWebhookListFromJson(r.Body), BuildResponse(r), nil } // GetIncomingWebhook returns an Incoming webhook given the hook ID. -func (c *Client4) GetIncomingWebhook(hookID string, etag string) (*IncomingWebhook, *Response) { +func (c *Client4) GetIncomingWebhook(hookID string, etag string) (*IncomingWebhook, *Response, error) { r, err := c.DoApiGet(c.GetIncomingWebhookRoute(hookID), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return IncomingWebhookFromJson(r.Body), BuildResponse(r) + return IncomingWebhookFromJson(r.Body), BuildResponse(r), nil } // DeleteIncomingWebhook deletes and Incoming Webhook given the hook ID. -func (c *Client4) DeleteIncomingWebhook(hookID string) (bool, *Response) { +func (c *Client4) DeleteIncomingWebhook(hookID string) (*Response, error) { r, err := c.DoApiDelete(c.GetIncomingWebhookRoute(hookID)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // CreateOutgoingWebhook creates an outgoing webhook for a team or channel. -func (c *Client4) CreateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response) { +func (c *Client4) CreateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response, error) { buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetOutgoingWebhooksRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetOutgoingWebhooksRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookFromJson(r.Body), BuildResponse(r), nil } // UpdateOutgoingWebhook creates an outgoing webhook for a team or channel. -func (c *Client4) UpdateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response) { +func (c *Client4) UpdateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response, error) { buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetOutgoingWebhookRoute(hook.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetOutgoingWebhookRoute(hook.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookFromJson(r.Body), BuildResponse(r), nil } // GetOutgoingWebhooks returns a page of outgoing webhooks on the system. Page counting starts at 0. -func (c *Client4) GetOutgoingWebhooks(page int, perPage int, etag string) ([]*OutgoingWebhook, *Response) { +func (c *Client4) GetOutgoingWebhooks(page int, perPage int, etag string) ([]*OutgoingWebhook, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetOutgoingWebhooksRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookListFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookListFromJson(r.Body), BuildResponse(r), nil } // GetOutgoingWebhook outgoing webhooks on the system requested by Hook Id. -func (c *Client4) GetOutgoingWebhook(hookId string) (*OutgoingWebhook, *Response) { +func (c *Client4) GetOutgoingWebhook(hookId string) (*OutgoingWebhook, *Response, error) { r, err := c.DoApiGet(c.GetOutgoingWebhookRoute(hookId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookFromJson(r.Body), BuildResponse(r), nil } // GetOutgoingWebhooksForChannel returns a page of outgoing webhooks for a channel. Page counting starts at 0. -func (c *Client4) GetOutgoingWebhooksForChannel(channelId string, page int, perPage int, etag string) ([]*OutgoingWebhook, *Response) { +func (c *Client4) GetOutgoingWebhooksForChannel(channelId string, page int, perPage int, etag string) ([]*OutgoingWebhook, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&channel_id=%v", page, perPage, channelId) r, err := c.DoApiGet(c.GetOutgoingWebhooksRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookListFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookListFromJson(r.Body), BuildResponse(r), nil } // GetOutgoingWebhooksForTeam returns a page of outgoing webhooks for a team. Page counting starts at 0. -func (c *Client4) GetOutgoingWebhooksForTeam(teamId string, page int, perPage int, etag string) ([]*OutgoingWebhook, *Response) { +func (c *Client4) GetOutgoingWebhooksForTeam(teamId string, page int, perPage int, etag string) ([]*OutgoingWebhook, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&team_id=%v", page, perPage, teamId) r, err := c.DoApiGet(c.GetOutgoingWebhooksRoute()+query, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookListFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookListFromJson(r.Body), BuildResponse(r), nil } // RegenOutgoingHookToken regenerate the outgoing webhook token. -func (c *Client4) RegenOutgoingHookToken(hookId string) (*OutgoingWebhook, *Response) { +func (c *Client4) RegenOutgoingHookToken(hookId string) (*OutgoingWebhook, *Response, error) { r, err := c.DoApiPost(c.GetOutgoingWebhookRoute(hookId)+"/regen_token", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OutgoingWebhookFromJson(r.Body), BuildResponse(r) + return OutgoingWebhookFromJson(r.Body), BuildResponse(r), nil } // DeleteOutgoingWebhook delete the outgoing webhook on the system requested by Hook Id. -func (c *Client4) DeleteOutgoingWebhook(hookId string) (bool, *Response) { +func (c *Client4) DeleteOutgoingWebhook(hookId string) (*Response, error) { r, err := c.DoApiDelete(c.GetOutgoingWebhookRoute(hookId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Preferences Section // GetPreferences returns the user's preferences. -func (c *Client4) GetPreferences(userId string) (Preferences, *Response) { +func (c *Client4) GetPreferences(userId string) (Preferences, *Response, error) { r, err := c.DoApiGet(c.GetPreferencesRoute(userId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) preferences, _ := PreferencesFromJson(r.Body) - return preferences, BuildResponse(r) + return preferences, BuildResponse(r), nil } // UpdatePreferences saves the user's preferences. -func (c *Client4) UpdatePreferences(userId string, preferences *Preferences) (bool, *Response) { +func (c *Client4) UpdatePreferences(userId string, preferences *Preferences) (*Response, error) { buf, err := json.Marshal(preferences) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("UpdatePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("UpdatePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetPreferencesRoute(userId), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetPreferencesRoute(userId), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return true, BuildResponse(r) + return BuildResponse(r), nil } // DeletePreferences deletes the user's preferences. -func (c *Client4) DeletePreferences(userId string, preferences *Preferences) (bool, *Response) { +func (c *Client4) DeletePreferences(userId string, preferences *Preferences) (*Response, error) { buf, err := json.Marshal(preferences) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("DeletePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("DeletePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetPreferencesRoute(userId)+"/delete", buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetPreferencesRoute(userId)+"/delete", buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return true, BuildResponse(r) + return BuildResponse(r), nil } // GetPreferencesByCategory returns the user's preferences from the provided category string. -func (c *Client4) GetPreferencesByCategory(userId string, category string) (Preferences, *Response) { +func (c *Client4) GetPreferencesByCategory(userId string, category string) (Preferences, *Response, error) { url := fmt.Sprintf(c.GetPreferencesRoute(userId)+"/%s", category) r, err := c.DoApiGet(url, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) preferences, _ := PreferencesFromJson(r.Body) - return preferences, BuildResponse(r) + return preferences, BuildResponse(r), nil } // GetPreferenceByCategoryAndName returns the user's preferences from the provided category and preference name string. -func (c *Client4) GetPreferenceByCategoryAndName(userId string, category string, preferenceName string) (*Preference, *Response) { +func (c *Client4) GetPreferenceByCategoryAndName(userId string, category string, preferenceName string) (*Preference, *Response, error) { url := fmt.Sprintf(c.GetPreferencesRoute(userId)+"/%s/name/%v", category, preferenceName) r, err := c.DoApiGet(url, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PreferenceFromJson(r.Body), BuildResponse(r) + return PreferenceFromJson(r.Body), BuildResponse(r), nil } // SAML Section // GetSamlMetadata returns metadata for the SAML configuration. -func (c *Client4) GetSamlMetadata() (string, *Response) { +func (c *Client4) GetSamlMetadata() (string, *Response, error) { r, err := c.DoApiGet(c.GetSamlRoute()+"/metadata", "") if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) + buf := new(bytes.Buffer) - _, _ = buf.ReadFrom(r.Body) - return buf.String(), BuildResponse(r) + _, err = buf.ReadFrom(r.Body) + if err != nil { + return "", BuildResponse(r), err + } + + return buf.String(), BuildResponse(r), nil } func fileToMultipart(data []byte, filename string) ([]byte, *multipart.Writer, error) { @@ -4201,94 +4164,94 @@ func fileToMultipart(data []byte, filename string) ([]byte, *multipart.Writer, e // UploadSamlIdpCertificate will upload an IDP certificate for SAML and set the config to use it. // The filename parameter is deprecated and ignored: the server will pick a hard-coded filename when writing to disk. -func (c *Client4) UploadSamlIdpCertificate(data []byte, filename string) (bool, *Response) { +func (c *Client4) UploadSamlIdpCertificate(data []byte, filename string) (*Response, error) { body, writer, err := fileToMultipart(data, filename) if err != nil { - return false, &Response{Error: NewAppError("UploadSamlIdpCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadSamlIdpCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest) } - _, resp := c.DoUploadFile(c.GetSamlRoute()+"/certificate/idp", body, writer.FormDataContentType()) - return resp.Error == nil, resp + _, resp, err := c.DoUploadFile(c.GetSamlRoute()+"/certificate/idp", body, writer.FormDataContentType()) + return resp, err } // UploadSamlPublicCertificate will upload a public certificate for SAML and set the config to use it. // The filename parameter is deprecated and ignored: the server will pick a hard-coded filename when writing to disk. -func (c *Client4) UploadSamlPublicCertificate(data []byte, filename string) (bool, *Response) { +func (c *Client4) UploadSamlPublicCertificate(data []byte, filename string) (*Response, error) { body, writer, err := fileToMultipart(data, filename) if err != nil { - return false, &Response{Error: NewAppError("UploadSamlPublicCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadSamlPublicCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest) } - _, resp := c.DoUploadFile(c.GetSamlRoute()+"/certificate/public", body, writer.FormDataContentType()) - return resp.Error == nil, resp + _, resp, err := c.DoUploadFile(c.GetSamlRoute()+"/certificate/public", body, writer.FormDataContentType()) + return resp, err } // UploadSamlPrivateCertificate will upload a private key for SAML and set the config to use it. // The filename parameter is deprecated and ignored: the server will pick a hard-coded filename when writing to disk. -func (c *Client4) UploadSamlPrivateCertificate(data []byte, filename string) (bool, *Response) { +func (c *Client4) UploadSamlPrivateCertificate(data []byte, filename string) (*Response, error) { body, writer, err := fileToMultipart(data, filename) if err != nil { - return false, &Response{Error: NewAppError("UploadSamlPrivateCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadSamlPrivateCertificate", "model.client.upload_saml_cert.app_error", nil, err.Error(), http.StatusBadRequest) } - _, resp := c.DoUploadFile(c.GetSamlRoute()+"/certificate/private", body, writer.FormDataContentType()) - return resp.Error == nil, resp + _, resp, err := c.DoUploadFile(c.GetSamlRoute()+"/certificate/private", body, writer.FormDataContentType()) + return resp, err } // DeleteSamlIdpCertificate deletes the SAML IDP certificate from the server and updates the config to not use it and disable SAML. -func (c *Client4) DeleteSamlIdpCertificate() (bool, *Response) { +func (c *Client4) DeleteSamlIdpCertificate() (*Response, error) { r, err := c.DoApiDelete(c.GetSamlRoute() + "/certificate/idp") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DeleteSamlPublicCertificate deletes the SAML IDP certificate from the server and updates the config to not use it and disable SAML. -func (c *Client4) DeleteSamlPublicCertificate() (bool, *Response) { +func (c *Client4) DeleteSamlPublicCertificate() (*Response, error) { r, err := c.DoApiDelete(c.GetSamlRoute() + "/certificate/public") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DeleteSamlPrivateCertificate deletes the SAML IDP certificate from the server and updates the config to not use it and disable SAML. -func (c *Client4) DeleteSamlPrivateCertificate() (bool, *Response) { +func (c *Client4) DeleteSamlPrivateCertificate() (*Response, error) { r, err := c.DoApiDelete(c.GetSamlRoute() + "/certificate/private") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetSamlCertificateStatus returns metadata for the SAML configuration. -func (c *Client4) GetSamlCertificateStatus() (*SamlCertificateStatus, *Response) { +func (c *Client4) GetSamlCertificateStatus() (*SamlCertificateStatus, *Response, error) { r, err := c.DoApiGet(c.GetSamlRoute()+"/certificate/status", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return SamlCertificateStatusFromJson(r.Body), BuildResponse(r) + return SamlCertificateStatusFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetSamlMetadataFromIdp(samlMetadataURL string) (*SamlMetadataResponse, *Response) { +func (c *Client4) GetSamlMetadataFromIdp(samlMetadataURL string) (*SamlMetadataResponse, *Response, error) { requestBody := make(map[string]string) requestBody["saml_metadata_url"] = samlMetadataURL r, err := c.DoApiPost(c.GetSamlRoute()+"/metadatafromidp", MapToJson(requestBody)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return SamlMetadataResponseFromJson(r.Body), BuildResponse(r) + return SamlMetadataResponseFromJson(r.Body), BuildResponse(r), nil } // ResetSamlAuthDataToEmail resets the AuthData field of SAML users to their Email. -func (c *Client4) ResetSamlAuthDataToEmail(includeDeleted bool, dryRun bool, userIDs []string) (int64, *Response) { +func (c *Client4) ResetSamlAuthDataToEmail(includeDeleted bool, dryRun bool, userIDs []string) (int64, *Response, error) { params := map[string]interface{}{ "include_deleted": includeDeleted, "dry_run": dryRun, @@ -4297,60 +4260,59 @@ func (c *Client4) ResetSamlAuthDataToEmail(includeDeleted bool, dryRun bool, use b, _ := json.Marshal(params) r, err := c.doApiPostBytes(c.GetSamlRoute()+"/reset_auth_data", b) if err != nil { - return 0, BuildErrorResponse(r, err) + return 0, BuildResponse(r), err } defer closeBody(r) respBody := map[string]int64{} - jsonErr := json.NewDecoder(r.Body).Decode(&respBody) - if jsonErr != nil { - appErr := NewAppError("Api4.ResetSamlAuthDataToEmail", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return 0, BuildErrorResponse(r, appErr) + err = json.NewDecoder(r.Body).Decode(&respBody) + if err != nil { + return 0, BuildResponse(r), NewAppError("Api4.ResetSamlAuthDataToEmail", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return respBody["num_affected"], BuildResponse(r) + return respBody["num_affected"], BuildResponse(r), nil } // Compliance Section // CreateComplianceReport creates an incoming webhook for a channel. -func (c *Client4) CreateComplianceReport(report *Compliance) (*Compliance, *Response) { +func (c *Client4) CreateComplianceReport(report *Compliance) (*Compliance, *Response, error) { buf, err := json.Marshal(report) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateComplianceReport", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateComplianceReport", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetComplianceReportsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetComplianceReportsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return ComplianceFromJson(r.Body), BuildResponse(r) + return ComplianceFromJson(r.Body), BuildResponse(r), nil } // GetComplianceReports returns list of compliance reports. -func (c *Client4) GetComplianceReports(page, perPage int) (Compliances, *Response) { +func (c *Client4) GetComplianceReports(page, perPage int) (Compliances, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetComplianceReportsRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return CompliancesFromJson(r.Body), BuildResponse(r) + return CompliancesFromJson(r.Body), BuildResponse(r), nil } // GetComplianceReport returns a compliance report. -func (c *Client4) GetComplianceReport(reportId string) (*Compliance, *Response) { +func (c *Client4) GetComplianceReport(reportId string) (*Compliance, *Response, error) { r, err := c.DoApiGet(c.GetComplianceReportRoute(reportId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ComplianceFromJson(r.Body), BuildResponse(r) + return ComplianceFromJson(r.Body), BuildResponse(r), nil } // DownloadComplianceReport returns a full compliance report as a file. -func (c *Client4) DownloadComplianceReport(reportId string) ([]byte, *Response) { +func (c *Client4) DownloadComplianceReport(reportId string) ([]byte, *Response, error) { rq, err := http.NewRequest("GET", c.ApiUrl+c.GetComplianceReportDownloadRoute(reportId), nil) if err != nil { - return nil, &Response{Error: NewAppError("DownloadComplianceReport", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } if c.AuthToken != "" { @@ -4358,33 +4320,33 @@ func (c *Client4) DownloadComplianceReport(reportId string) ([]byte, *Response) } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, &Response{Error: NewAppError("DownloadComplianceReport", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } data, err := ioutil.ReadAll(rp.Body) if err != nil { - return nil, BuildErrorResponse(rp, NewAppError("DownloadComplianceReport", "model.client.read_file.app_error", nil, err.Error(), rp.StatusCode)) + return nil, BuildResponse(rp), NewAppError("DownloadComplianceReport", "model.client.read_file.app_error", nil, err.Error(), rp.StatusCode) } - return data, BuildResponse(rp) + return data, BuildResponse(rp), nil } // Cluster Section // GetClusterStatus returns the status of all the configured cluster nodes. -func (c *Client4) GetClusterStatus() ([]*ClusterInfo, *Response) { +func (c *Client4) GetClusterStatus() ([]*ClusterInfo, *Response, error) { r, err := c.DoApiGet(c.GetClusterRoute()+"/status", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ClusterInfosFromJson(r.Body), BuildResponse(r) + return ClusterInfosFromJson(r.Body), BuildResponse(r), nil } // LDAP Section @@ -4392,36 +4354,36 @@ func (c *Client4) GetClusterStatus() ([]*ClusterInfo, *Response) { // SyncLdap will force a sync with the configured LDAP server. // If includeRemovedMembers is true, then group members who left or were removed from a // synced team/channel will be re-joined; otherwise, they will be excluded. -func (c *Client4) SyncLdap(includeRemovedMembers bool) (bool, *Response) { +func (c *Client4) SyncLdap(includeRemovedMembers bool) (*Response, error) { reqBody, _ := json.Marshal(map[string]interface{}{ "include_removed_members": includeRemovedMembers, }) r, err := c.doApiPostBytes(c.GetLdapRoute()+"/sync", reqBody) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // TestLdap will attempt to connect to the configured LDAP server and return OK if configured // correctly. -func (c *Client4) TestLdap() (bool, *Response) { +func (c *Client4) TestLdap() (*Response, error) { r, err := c.DoApiPost(c.GetLdapRoute()+"/test", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetLdapGroups retrieves the immediate child groups of the given parent group. -func (c *Client4) GetLdapGroups() ([]*Group, *Response) { +func (c *Client4) GetLdapGroups() ([]*Group, *Response, error) { path := fmt.Sprintf("%s/groups", c.GetLdapRoute()) - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) @@ -4430,63 +4392,62 @@ func (c *Client4) GetLdapGroups() ([]*Group, *Response) { Groups []*Group `json:"groups"` }{} if err := json.NewDecoder(r.Body).Decode(&responseData); err != nil { - appErr := NewAppError("Api4.GetLdapGroups", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return nil, BuildErrorResponse(r, appErr) + return nil, BuildResponse(r), NewAppError("Api4.GetLdapGroups", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } for i := range responseData.Groups { responseData.Groups[i].DisplayName = *responseData.Groups[i].Name } - return responseData.Groups, BuildResponse(r) + return responseData.Groups, BuildResponse(r), nil } // LinkLdapGroup creates or undeletes a Mattermost group and associates it to the given LDAP group DN. -func (c *Client4) LinkLdapGroup(dn string) (*Group, *Response) { +func (c *Client4) LinkLdapGroup(dn string) (*Group, *Response, error) { path := fmt.Sprintf("%s/groups/%s/link", c.GetLdapRoute(), dn) - r, appErr := c.DoApiPost(path, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(path, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupFromJson(r.Body), BuildResponse(r) + return GroupFromJson(r.Body), BuildResponse(r), nil } // UnlinkLdapGroup deletes the Mattermost group associated with the given LDAP group DN. -func (c *Client4) UnlinkLdapGroup(dn string) (*Group, *Response) { +func (c *Client4) UnlinkLdapGroup(dn string) (*Group, *Response, error) { path := fmt.Sprintf("%s/groups/%s/link", c.GetLdapRoute(), dn) - r, appErr := c.DoApiDelete(path) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiDelete(path) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupFromJson(r.Body), BuildResponse(r) + return GroupFromJson(r.Body), BuildResponse(r), nil } // MigrateIdLdap migrates the LDAP enabled users to given attribute -func (c *Client4) MigrateIdLdap(toAttribute string) (bool, *Response) { +func (c *Client4) MigrateIdLdap(toAttribute string) (*Response, error) { r, err := c.DoApiPost(c.GetLdapRoute()+"/migrateid", MapToJson(map[string]string{ "toAttribute": toAttribute, })) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetGroupsByChannel retrieves the Mattermost Groups associated with a given channel -func (c *Client4) GetGroupsByChannel(channelId string, opts GroupSearchOpts) ([]*GroupWithSchemeAdmin, int, *Response) { +func (c *Client4) GetGroupsByChannel(channelId string, opts GroupSearchOpts) ([]*GroupWithSchemeAdmin, int, *Response, error) { path := fmt.Sprintf("%s/groups?q=%v&include_member_count=%v&filter_allow_reference=%v", c.GetChannelRoute(channelId), opts.Q, opts.IncludeMemberCount, opts.FilterAllowReference) if opts.PageOpts != nil { path = fmt.Sprintf("%s&page=%v&per_page=%v", path, opts.PageOpts.Page, opts.PageOpts.PerPage) } - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, 0, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, 0, BuildResponse(r), err } defer closeBody(r) @@ -4495,22 +4456,21 @@ func (c *Client4) GetGroupsByChannel(channelId string, opts GroupSearchOpts) ([] Count int `json:"total_group_count"` }{} if err := json.NewDecoder(r.Body).Decode(&responseData); err != nil { - appErr := NewAppError("Api4.GetGroupsByChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return nil, 0, BuildErrorResponse(r, appErr) + return nil, 0, BuildResponse(r), NewAppError("Api4.GetGroupsByChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return responseData.Groups, responseData.Count, BuildResponse(r) + return responseData.Groups, responseData.Count, BuildResponse(r), nil } // GetGroupsByTeam retrieves the Mattermost Groups associated with a given team -func (c *Client4) GetGroupsByTeam(teamId string, opts GroupSearchOpts) ([]*GroupWithSchemeAdmin, int, *Response) { +func (c *Client4) GetGroupsByTeam(teamId string, opts GroupSearchOpts) ([]*GroupWithSchemeAdmin, int, *Response, error) { path := fmt.Sprintf("%s/groups?q=%v&include_member_count=%v&filter_allow_reference=%v", c.GetTeamRoute(teamId), opts.Q, opts.IncludeMemberCount, opts.FilterAllowReference) if opts.PageOpts != nil { path = fmt.Sprintf("%s&page=%v&per_page=%v", path, opts.PageOpts.Page, opts.PageOpts.PerPage) } - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, 0, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, 0, BuildResponse(r), err } defer closeBody(r) @@ -4519,22 +4479,21 @@ func (c *Client4) GetGroupsByTeam(teamId string, opts GroupSearchOpts) ([]*Group Count int `json:"total_group_count"` }{} if err := json.NewDecoder(r.Body).Decode(&responseData); err != nil { - appErr := NewAppError("Api4.GetGroupsByTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return nil, 0, BuildErrorResponse(r, appErr) + return nil, 0, BuildResponse(r), NewAppError("Api4.GetGroupsByTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return responseData.Groups, responseData.Count, BuildResponse(r) + return responseData.Groups, responseData.Count, BuildResponse(r), nil } // GetGroupsAssociatedToChannelsByTeam retrieves the Mattermost Groups associated with channels in a given team -func (c *Client4) GetGroupsAssociatedToChannelsByTeam(teamId string, opts GroupSearchOpts) (map[string][]*GroupWithSchemeAdmin, *Response) { +func (c *Client4) GetGroupsAssociatedToChannelsByTeam(teamId string, opts GroupSearchOpts) (map[string][]*GroupWithSchemeAdmin, *Response, error) { path := fmt.Sprintf("%s/groups_by_channels?q=%v&filter_allow_reference=%v", c.GetTeamRoute(teamId), opts.Q, opts.FilterAllowReference) if opts.PageOpts != nil { path = fmt.Sprintf("%s&page=%v&per_page=%v", path, opts.PageOpts.Page, opts.PageOpts.PerPage) } - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) @@ -4542,15 +4501,14 @@ func (c *Client4) GetGroupsAssociatedToChannelsByTeam(teamId string, opts GroupS GroupsAssociatedToChannels map[string][]*GroupWithSchemeAdmin `json:"groups"` }{} if err := json.NewDecoder(r.Body).Decode(&responseData); err != nil { - appErr := NewAppError("Api4.GetGroupsAssociatedToChannelsByTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return nil, BuildErrorResponse(r, appErr) + return nil, BuildResponse(r), NewAppError("Api4.GetGroupsAssociatedToChannelsByTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return responseData.GroupsAssociatedToChannels, BuildResponse(r) + return responseData.GroupsAssociatedToChannels, BuildResponse(r), nil } // GetGroups retrieves Mattermost Groups -func (c *Client4) GetGroups(opts GroupSearchOpts) ([]*Group, *Response) { +func (c *Client4) GetGroups(opts GroupSearchOpts) ([]*Group, *Response, error) { path := fmt.Sprintf( "%s?include_member_count=%v¬_associated_to_team=%v¬_associated_to_channel=%v&filter_allow_reference=%v&q=%v&filter_parent_team_permitted=%v", c.GetGroupsRoute(), @@ -4567,170 +4525,170 @@ func (c *Client4) GetGroups(opts GroupSearchOpts) ([]*Group, *Response) { if opts.PageOpts != nil { path = fmt.Sprintf("%s&page=%v&per_page=%v", path, opts.PageOpts.Page, opts.PageOpts.PerPage) } - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupsFromJson(r.Body), BuildResponse(r) + return GroupsFromJson(r.Body), BuildResponse(r), nil } // GetGroupsByUserId retrieves Mattermost Groups for a user -func (c *Client4) GetGroupsByUserId(userId string) ([]*Group, *Response) { +func (c *Client4) GetGroupsByUserId(userId string) ([]*Group, *Response, error) { path := fmt.Sprintf( "%s/%v/groups", c.GetUsersRoute(), userId, ) - r, appErr := c.DoApiGet(path, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(path, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupsFromJson(r.Body), BuildResponse(r) + return GroupsFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) MigrateAuthToLdap(fromAuthService string, matchField string, force bool) (bool, *Response) { +func (c *Client4) MigrateAuthToLdap(fromAuthService string, matchField string, force bool) (*Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/migrate_auth/ldap", StringInterfaceToJson(map[string]interface{}{ "from": fromAuthService, "force": force, "match_field": matchField, })) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) MigrateAuthToSaml(fromAuthService string, usersMap map[string]string, auto bool) (bool, *Response) { +func (c *Client4) MigrateAuthToSaml(fromAuthService string, usersMap map[string]string, auto bool) (*Response, error) { r, err := c.DoApiPost(c.GetUsersRoute()+"/migrate_auth/saml", StringInterfaceToJson(map[string]interface{}{ "from": fromAuthService, "auto": auto, "matches": usersMap, })) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UploadLdapPublicCertificate will upload a public certificate for LDAP and set the config to use it. -func (c *Client4) UploadLdapPublicCertificate(data []byte) (bool, *Response) { +func (c *Client4) UploadLdapPublicCertificate(data []byte) (*Response, error) { body, writer, err := fileToMultipart(data, LdapPublicCertificateName) if err != nil { - return false, &Response{Error: NewAppError("UploadLdapPublicCertificate", "model.client.upload_ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadLdapPublicCertificate", "model.client.upload_ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest) } - _, resp := c.DoUploadFile(c.GetLdapRoute()+"/certificate/public", body, writer.FormDataContentType()) - return resp.Error == nil, resp + _, resp, err := c.DoUploadFile(c.GetLdapRoute()+"/certificate/public", body, writer.FormDataContentType()) + return resp, err } // UploadLdapPrivateCertificate will upload a private key for LDAP and set the config to use it. -func (c *Client4) UploadLdapPrivateCertificate(data []byte) (bool, *Response) { +func (c *Client4) UploadLdapPrivateCertificate(data []byte) (*Response, error) { body, writer, err := fileToMultipart(data, LdapPrivateKeyName) if err != nil { - return false, &Response{Error: NewAppError("UploadLdapPrivateCertificate", "model.client.upload_Ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadLdapPrivateCertificate", "model.client.upload_Ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest) } - _, resp := c.DoUploadFile(c.GetLdapRoute()+"/certificate/private", body, writer.FormDataContentType()) - return resp.Error == nil, resp + _, resp, err := c.DoUploadFile(c.GetLdapRoute()+"/certificate/private", body, writer.FormDataContentType()) + return resp, err } // DeleteLdapPublicCertificate deletes the LDAP IDP certificate from the server and updates the config to not use it and disable LDAP. -func (c *Client4) DeleteLdapPublicCertificate() (bool, *Response) { +func (c *Client4) DeleteLdapPublicCertificate() (*Response, error) { r, err := c.DoApiDelete(c.GetLdapRoute() + "/certificate/public") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DeleteLDAPPrivateCertificate deletes the LDAP IDP certificate from the server and updates the config to not use it and disable LDAP. -func (c *Client4) DeleteLdapPrivateCertificate() (bool, *Response) { +func (c *Client4) DeleteLdapPrivateCertificate() (*Response, error) { r, err := c.DoApiDelete(c.GetLdapRoute() + "/certificate/private") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Audits Section // GetAudits returns a list of audits for the whole system. -func (c *Client4) GetAudits(page int, perPage int, etag string) (Audits, *Response) { +func (c *Client4) GetAudits(page int, perPage int, etag string) (Audits, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) - r, appErr := c.DoApiGet("/audits"+query, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet("/audits"+query, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var audits Audits - err := json.NewDecoder(r.Body).Decode(&audits) + err = json.NewDecoder(r.Body).Decode(&audits) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetAudits", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetAudits", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return audits, BuildResponse(r) + return audits, BuildResponse(r), nil } // Brand Section // GetBrandImage retrieves the previously uploaded brand image. -func (c *Client4) GetBrandImage() ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetBrandRoute()+"/image", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetBrandImage() ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetBrandRoute()+"/image", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) if r.StatusCode >= 300 { - return nil, BuildErrorResponse(r, AppErrorFromJson(r.Body)) + return nil, BuildResponse(r), AppErrorFromJson(r.Body) } data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetBrandImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetBrandImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // DeleteBrandImage deletes the brand image for the system. -func (c *Client4) DeleteBrandImage() *Response { +func (c *Client4) DeleteBrandImage() (*Response, error) { r, err := c.DoApiDelete(c.GetBrandRoute() + "/image") if err != nil { - return BuildErrorResponse(r, err) + return BuildResponse(r), err } - return BuildResponse(r) + return BuildResponse(r), nil } // UploadBrandImage sets the brand image for the system. -func (c *Client4) UploadBrandImage(data []byte) (bool, *Response) { +func (c *Client4) UploadBrandImage(data []byte) (*Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("image", "brand.png") if err != nil { - return false, &Response{Error: NewAppError("UploadBrandImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadBrandImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if _, err = io.Copy(part, bytes.NewBuffer(data)); err != nil { - return false, &Response{Error: NewAppError("UploadBrandImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadBrandImage", "model.client.set_profile_user.no_file.app_error", nil, err.Error(), http.StatusBadRequest) } if err = writer.Close(); err != nil { - return false, &Response{Error: NewAppError("UploadBrandImage", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, NewAppError("UploadBrandImage", "model.client.set_profile_user.writer.app_error", nil, err.Error(), http.StatusBadRequest) } rq, err := http.NewRequest("POST", c.ApiUrl+c.GetBrandRoute()+"/image", bytes.NewReader(body.Bytes())) if err != nil { - return false, &Response{Error: NewAppError("UploadBrandImage", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, err } rq.Header.Set("Content-Type", writer.FormDataContentType()) @@ -4739,166 +4697,166 @@ func (c *Client4) UploadBrandImage(data []byte) (bool, *Response) { } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return false, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(c.GetBrandRoute()+"/image", "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)} + if err != nil { + return BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return false, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return BuildResponse(rp), AppErrorFromJson(rp.Body) } - return CheckStatusOK(rp), BuildResponse(rp) + return BuildResponse(rp), nil } // Logs Section // GetLogs page of logs as a string array. -func (c *Client4) GetLogs(page, perPage int) ([]string, *Response) { +func (c *Client4) GetLogs(page, perPage int) ([]string, *Response, error) { query := fmt.Sprintf("?page=%v&logs_per_page=%v", page, perPage) r, err := c.DoApiGet("/logs"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } // PostLog is a convenience Web Service call so clients can log messages into // the server-side logs. For example we typically log javascript error messages // into the server-side. It returns the log message if the logging was successful. -func (c *Client4) PostLog(message map[string]string) (map[string]string, *Response) { +func (c *Client4) PostLog(message map[string]string) (map[string]string, *Response, error) { r, err := c.DoApiPost("/logs", MapToJson(message)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body), BuildResponse(r) + return MapFromJson(r.Body), BuildResponse(r), nil } // OAuth Section // CreateOAuthApp will register a new OAuth 2.0 client application with Mattermost acting as an OAuth 2.0 service provider. -func (c *Client4) CreateOAuthApp(app *OAuthApp) (*OAuthApp, *Response) { +func (c *Client4) CreateOAuthApp(app *OAuthApp) (*OAuthApp, *Response, error) { buf, err := json.Marshal(app) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetOAuthAppsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetOAuthAppsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppFromJson(r.Body), BuildResponse(r) + return OAuthAppFromJson(r.Body), BuildResponse(r), nil } // UpdateOAuthApp updates a page of registered OAuth 2.0 client applications with Mattermost acting as an OAuth 2.0 service provider. -func (c *Client4) UpdateOAuthApp(app *OAuthApp) (*OAuthApp, *Response) { +func (c *Client4) UpdateOAuthApp(app *OAuthApp) (*OAuthApp, *Response, error) { buf, err := json.Marshal(app) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetOAuthAppRoute(app.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetOAuthAppRoute(app.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppFromJson(r.Body), BuildResponse(r) + return OAuthAppFromJson(r.Body), BuildResponse(r), nil } // GetOAuthApps gets a page of registered OAuth 2.0 client applications with Mattermost acting as an OAuth 2.0 service provider. -func (c *Client4) GetOAuthApps(page, perPage int) ([]*OAuthApp, *Response) { +func (c *Client4) GetOAuthApps(page, perPage int) ([]*OAuthApp, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetOAuthAppsRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppListFromJson(r.Body), BuildResponse(r) + return OAuthAppListFromJson(r.Body), BuildResponse(r), nil } // GetOAuthApp gets a registered OAuth 2.0 client application with Mattermost acting as an OAuth 2.0 service provider. -func (c *Client4) GetOAuthApp(appId string) (*OAuthApp, *Response) { +func (c *Client4) GetOAuthApp(appId string) (*OAuthApp, *Response, error) { r, err := c.DoApiGet(c.GetOAuthAppRoute(appId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppFromJson(r.Body), BuildResponse(r) + return OAuthAppFromJson(r.Body), BuildResponse(r), nil } // GetOAuthAppInfo gets a sanitized version of a registered OAuth 2.0 client application with Mattermost acting as an OAuth 2.0 service provider. -func (c *Client4) GetOAuthAppInfo(appId string) (*OAuthApp, *Response) { +func (c *Client4) GetOAuthAppInfo(appId string) (*OAuthApp, *Response, error) { r, err := c.DoApiGet(c.GetOAuthAppRoute(appId)+"/info", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppFromJson(r.Body), BuildResponse(r) + return OAuthAppFromJson(r.Body), BuildResponse(r), nil } // DeleteOAuthApp deletes a registered OAuth 2.0 client application. -func (c *Client4) DeleteOAuthApp(appId string) (bool, *Response) { +func (c *Client4) DeleteOAuthApp(appId string) (*Response, error) { r, err := c.DoApiDelete(c.GetOAuthAppRoute(appId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // RegenerateOAuthAppSecret regenerates the client secret for a registered OAuth 2.0 client application. -func (c *Client4) RegenerateOAuthAppSecret(appId string) (*OAuthApp, *Response) { +func (c *Client4) RegenerateOAuthAppSecret(appId string) (*OAuthApp, *Response, error) { r, err := c.DoApiPost(c.GetOAuthAppRoute(appId)+"/regen_secret", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppFromJson(r.Body), BuildResponse(r) + return OAuthAppFromJson(r.Body), BuildResponse(r), nil } // GetAuthorizedOAuthAppsForUser gets a page of OAuth 2.0 client applications the user has authorized to use access their account. -func (c *Client4) GetAuthorizedOAuthAppsForUser(userId string, page, perPage int) ([]*OAuthApp, *Response) { +func (c *Client4) GetAuthorizedOAuthAppsForUser(userId string, page, perPage int) ([]*OAuthApp, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetUserRoute(userId)+"/oauth/apps/authorized"+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return OAuthAppListFromJson(r.Body), BuildResponse(r) + return OAuthAppListFromJson(r.Body), BuildResponse(r), nil } // AuthorizeOAuthApp will authorize an OAuth 2.0 client application to access a user's account and provide a redirect link to follow. -func (c *Client4) AuthorizeOAuthApp(authRequest *AuthorizeRequest) (string, *Response) { +func (c *Client4) AuthorizeOAuthApp(authRequest *AuthorizeRequest) (string, *Response, error) { buf, err := json.Marshal(authRequest) if err != nil { - return "", BuildErrorResponse(nil, NewAppError("AuthorizeOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return "", BuildResponse(nil), NewAppError("AuthorizeOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiRequestBytes(http.MethodPost, c.Url+"/oauth/authorize", buf, "") - if appErr != nil { - return "", BuildErrorResponse(r, appErr) + r, err := c.doApiRequestBytes(http.MethodPost, c.Url+"/oauth/authorize", buf, "") + if err != nil { + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["redirect"], BuildResponse(r) + return MapFromJson(r.Body)["redirect"], BuildResponse(r), nil } // DeauthorizeOAuthApp will deauthorize an OAuth 2.0 client application from accessing a user's account. -func (c *Client4) DeauthorizeOAuthApp(appId string) (bool, *Response) { +func (c *Client4) DeauthorizeOAuthApp(appId string) (*Response, error) { requestData := map[string]string{"client_id": appId} r, err := c.DoApiRequest(http.MethodPost, c.Url+"/oauth/deauthorize", MapToJson(requestData), "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetOAuthAccessToken is a test helper function for the OAuth access token endpoint. -func (c *Client4) GetOAuthAccessToken(data url.Values) (*AccessResponse, *Response) { +func (c *Client4) GetOAuthAccessToken(data url.Values) (*AccessResponse, *Response, error) { url := c.Url + "/oauth/access_token" rq, err := http.NewRequest(http.MethodPost, url, strings.NewReader(data.Encode())) if err != nil { - return nil, &Response{Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } rq.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -4907,407 +4865,407 @@ func (c *Client4) GetOAuthAccessToken(data url.Values) (*AccessResponse, *Respon } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, &Response{StatusCode: http.StatusForbidden, Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 403)} + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } var ar *AccessResponse err = json.NewDecoder(rp.Body).Decode(&ar) if err != nil { - return nil, BuildErrorResponse(rp, NewAppError(url, "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(rp), NewAppError(url, "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ar, BuildResponse(rp) + return ar, BuildResponse(rp), nil } // Elasticsearch Section // TestElasticsearch will attempt to connect to the configured Elasticsearch server and return OK if configured. // correctly. -func (c *Client4) TestElasticsearch() (bool, *Response) { +func (c *Client4) TestElasticsearch() (*Response, error) { r, err := c.DoApiPost(c.GetElasticsearchRoute()+"/test", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PurgeElasticsearchIndexes immediately deletes all Elasticsearch indexes. -func (c *Client4) PurgeElasticsearchIndexes() (bool, *Response) { +func (c *Client4) PurgeElasticsearchIndexes() (*Response, error) { r, err := c.DoApiPost(c.GetElasticsearchRoute()+"/purge_indexes", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Bleve Section // PurgeBleveIndexes immediately deletes all Bleve indexes. -func (c *Client4) PurgeBleveIndexes() (bool, *Response) { +func (c *Client4) PurgeBleveIndexes() (*Response, error) { r, err := c.DoApiPost(c.GetBleveRoute()+"/purge_indexes", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // Data Retention Section // GetDataRetentionPolicy will get the current global data retention policy details. -func (c *Client4) GetDataRetentionPolicy() (*GlobalRetentionPolicy, *Response) { +func (c *Client4) GetDataRetentionPolicy() (*GlobalRetentionPolicy, *Response, error) { r, err := c.DoApiGet(c.GetDataRetentionRoute()+"/policy", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return GlobalRetentionPolicyFromJson(r.Body), BuildResponse(r) + return GlobalRetentionPolicyFromJson(r.Body), BuildResponse(r), nil } // GetDataRetentionPolicyByID will get the details for the granular data retention policy with the specified ID. -func (c *Client4) GetDataRetentionPolicyByID(policyID string) (*RetentionPolicyWithTeamAndChannelCounts, *Response) { - r, appErr := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetDataRetentionPolicyByID(policyID string) (*RetentionPolicyWithTeamAndChannelCounts, *Response, error) { + r, err := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) policy, err := RetentionPolicyWithTeamAndChannelCountsFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetDataRetentionPolicyByID", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.GetDataRetentionPolicyByID", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return policy, BuildResponse(r) + return policy, BuildResponse(r), nil } // GetDataRetentionPoliciesCount will get the total number of granular data retention policies. -func (c *Client4) GetDataRetentionPoliciesCount() (int64, *Response) { +func (c *Client4) GetDataRetentionPoliciesCount() (int64, *Response, error) { type CountBody struct { TotalCount int64 `json:"total_count"` } - r, appErr := c.DoApiGet(c.GetDataRetentionRoute()+"/policies_count", "") - if appErr != nil { - return 0, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetDataRetentionRoute()+"/policies_count", "") + if err != nil { + return 0, BuildResponse(r), err } var countObj CountBody - jsonErr := json.NewDecoder(r.Body).Decode(&countObj) - if jsonErr != nil { - return 0, BuildErrorResponse(r, NewAppError("Client4.GetDataRetentionPoliciesCount", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&countObj) + if err != nil { + return 0, nil, NewAppError("Client4.GetDataRetentionPoliciesCount", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return countObj.TotalCount, BuildResponse(r) + return countObj.TotalCount, BuildResponse(r), nil } // GetDataRetentionPolicies will get the current granular data retention policies' details. -func (c *Client4) GetDataRetentionPolicies(page, perPage int) (*RetentionPolicyWithTeamAndChannelCountsList, *Response) { +func (c *Client4) GetDataRetentionPolicies(page, perPage int) (*RetentionPolicyWithTeamAndChannelCountsList, *Response, error) { query := fmt.Sprintf("?page=%d&per_page=%d", page, perPage) - r, appErr := c.DoApiGet(c.GetDataRetentionRoute()+"/policies"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetDataRetentionRoute()+"/policies"+query, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) policies, err := RetentionPolicyWithTeamAndChannelCountsListFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetDataRetentionPolicies", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.GetDataRetentionPolicies", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return policies, BuildResponse(r) + return policies, BuildResponse(r), nil } // CreateDataRetentionPolicy will create a new granular data retention policy which will be applied to // the specified teams and channels. The Id field of `policy` must be empty. -func (c *Client4) CreateDataRetentionPolicy(policy *RetentionPolicyWithTeamAndChannelIDs) (*RetentionPolicyWithTeamAndChannelCounts, *Response) { - r, appErr := c.doApiPostBytes(c.GetDataRetentionRoute()+"/policies", policy.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) CreateDataRetentionPolicy(policy *RetentionPolicyWithTeamAndChannelIDs) (*RetentionPolicyWithTeamAndChannelCounts, *Response, error) { + r, err := c.doApiPostBytes(c.GetDataRetentionRoute()+"/policies", policy.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) newPolicy, err := RetentionPolicyWithTeamAndChannelCountsFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.CreateDataRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.CreateDataRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return newPolicy, BuildResponse(r) + return newPolicy, BuildResponse(r), nil } // DeleteDataRetentionPolicy will delete the granular data retention policy with the specified ID. -func (c *Client4) DeleteDataRetentionPolicy(policyID string) *Response { - r, appErr := c.DoApiDelete(c.GetDataRetentionPolicyRoute(policyID)) - if appErr != nil { - return BuildErrorResponse(r, appErr) +func (c *Client4) DeleteDataRetentionPolicy(policyID string) (*Response, error) { + r, err := c.DoApiDelete(c.GetDataRetentionPolicyRoute(policyID)) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // PatchDataRetentionPolicy will patch the granular data retention policy with the specified ID. // The Id field of `patch` must be non-empty. -func (c *Client4) PatchDataRetentionPolicy(patch *RetentionPolicyWithTeamAndChannelIDs) (*RetentionPolicyWithTeamAndChannelCounts, *Response) { - r, appErr := c.doApiPatchBytes(c.GetDataRetentionPolicyRoute(patch.ID), patch.ToJson()) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) PatchDataRetentionPolicy(patch *RetentionPolicyWithTeamAndChannelIDs) (*RetentionPolicyWithTeamAndChannelCounts, *Response, error) { + r, err := c.doApiPatchBytes(c.GetDataRetentionPolicyRoute(patch.ID), patch.ToJson()) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) policy, err := RetentionPolicyWithTeamAndChannelCountsFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.PatchDataRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.PatchDataRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return policy, BuildResponse(r) + return policy, BuildResponse(r), nil } // GetTeamsForRetentionPolicy will get the teams to which the specified policy is currently applied. -func (c *Client4) GetTeamsForRetentionPolicy(policyID string, page, perPage int) (*TeamsWithCount, *Response) { +func (c *Client4) GetTeamsForRetentionPolicy(policyID string, page, perPage int) (*TeamsWithCount, *Response, error) { query := fmt.Sprintf("?page=%d&per_page=%d", page, perPage) - r, appErr := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID)+"/teams"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID)+"/teams"+query, "") + if err != nil { + return nil, BuildResponse(r), err } var teams *TeamsWithCount - jsonErr := json.NewDecoder(r.Body).Decode(&teams) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetTeamsForRetentionPolicy", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&teams) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.GetTeamsForRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return teams, BuildResponse(r) + return teams, BuildResponse(r), nil } // SearchTeamsForRetentionPolicy will search the teams to which the specified policy is currently applied. -func (c *Client4) SearchTeamsForRetentionPolicy(policyID string, term string) ([]*Team, *Response) { +func (c *Client4) SearchTeamsForRetentionPolicy(policyID string, term string) ([]*Team, *Response, error) { body, _ := json.Marshal(map[string]interface{}{"term": term}) - r, appErr := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams/search", body) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams/search", body) + if err != nil { + return nil, BuildResponse(r), err } var teams []*Team - jsonErr := json.NewDecoder(r.Body).Decode(&teams) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.SearchTeamsForRetentionPolicy", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&teams) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.SearchTeamsForRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return teams, BuildResponse(r) + return teams, BuildResponse(r), nil } // AddTeamsToRetentionPolicy will add the specified teams to the granular data retention policy // with the specified ID. -func (c *Client4) AddTeamsToRetentionPolicy(policyID string, teamIDs []string) *Response { +func (c *Client4) AddTeamsToRetentionPolicy(policyID string, teamIDs []string) (*Response, error) { body, _ := json.Marshal(teamIDs) - r, appErr := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams", body) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams", body) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // RemoveTeamsFromRetentionPolicy will remove the specified teams from the granular data retention policy // with the specified ID. -func (c *Client4) RemoveTeamsFromRetentionPolicy(policyID string, teamIDs []string) *Response { +func (c *Client4) RemoveTeamsFromRetentionPolicy(policyID string, teamIDs []string) (*Response, error) { body, _ := json.Marshal(teamIDs) - r, appErr := c.doApiDeleteBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams", body) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiDeleteBytes(c.GetDataRetentionPolicyRoute(policyID)+"/teams", body) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // GetChannelsForRetentionPolicy will get the channels to which the specified policy is currently applied. -func (c *Client4) GetChannelsForRetentionPolicy(policyID string, page, perPage int) (*ChannelsWithCount, *Response) { +func (c *Client4) GetChannelsForRetentionPolicy(policyID string, page, perPage int) (*ChannelsWithCount, *Response, error) { query := fmt.Sprintf("?page=%d&per_page=%d", page, perPage) - r, appErr := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID)+"/channels"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetDataRetentionPolicyRoute(policyID)+"/channels"+query, "") + if err != nil { + return nil, BuildResponse(r), err } var channels *ChannelsWithCount - jsonErr := json.NewDecoder(r.Body).Decode(&channels) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetChannelsForRetentionPolicy", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&channels) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.GetChannelsForRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return channels, BuildResponse(r) + return channels, BuildResponse(r), nil } // SearchChannelsForRetentionPolicy will search the channels to which the specified policy is currently applied. -func (c *Client4) SearchChannelsForRetentionPolicy(policyID string, term string) (ChannelListWithTeamData, *Response) { +func (c *Client4) SearchChannelsForRetentionPolicy(policyID string, term string) (ChannelListWithTeamData, *Response, error) { body, _ := json.Marshal(map[string]interface{}{"term": term}) - r, appErr := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels/search", body) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels/search", body) + if err != nil { + return nil, BuildResponse(r), err } var channels ChannelListWithTeamData - jsonErr := json.NewDecoder(r.Body).Decode(&channels) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.SearchChannelsForRetentionPolicy", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&channels) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.SearchChannelsForRetentionPolicy", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return channels, BuildResponse(r) + return channels, BuildResponse(r), nil } // AddChannelsToRetentionPolicy will add the specified channels to the granular data retention policy // with the specified ID. -func (c *Client4) AddChannelsToRetentionPolicy(policyID string, channelIDs []string) *Response { +func (c *Client4) AddChannelsToRetentionPolicy(policyID string, channelIDs []string) (*Response, error) { body, _ := json.Marshal(channelIDs) - r, appErr := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels", body) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels", body) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // RemoveChannelsFromRetentionPolicy will remove the specified channels from the granular data retention policy // with the specified ID. -func (c *Client4) RemoveChannelsFromRetentionPolicy(policyID string, channelIDs []string) *Response { +func (c *Client4) RemoveChannelsFromRetentionPolicy(policyID string, channelIDs []string) (*Response, error) { body, _ := json.Marshal(channelIDs) - r, appErr := c.doApiDeleteBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels", body) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiDeleteBytes(c.GetDataRetentionPolicyRoute(policyID)+"/channels", body) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // GetTeamPoliciesForUser will get the data retention policies for the teams to which a user belongs. -func (c *Client4) GetTeamPoliciesForUser(userID string, offset, limit int) (*RetentionPolicyForTeamList, *Response) { - r, appErr := c.DoApiGet(c.GetUserRoute(userID)+"/data_retention/team_policies", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetTeamPoliciesForUser(userID string, offset, limit int) (*RetentionPolicyForTeamList, *Response, error) { + r, err := c.DoApiGet(c.GetUserRoute(userID)+"/data_retention/team_policies", "") + if err != nil { + return nil, BuildResponse(r), err } var teams RetentionPolicyForTeamList - jsonErr := json.NewDecoder(r.Body).Decode(&teams) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetTeamPoliciesForUser", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&teams) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.GetTeamPoliciesForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return &teams, BuildResponse(r) + return &teams, BuildResponse(r), nil } // GetChannelPoliciesForUser will get the data retention policies for the channels to which a user belongs. -func (c *Client4) GetChannelPoliciesForUser(userID string, offset, limit int) (*RetentionPolicyForChannelList, *Response) { - r, appErr := c.DoApiGet(c.GetUserRoute(userID)+"/data_retention/channel_policies", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelPoliciesForUser(userID string, offset, limit int) (*RetentionPolicyForChannelList, *Response, error) { + r, err := c.DoApiGet(c.GetUserRoute(userID)+"/data_retention/channel_policies", "") + if err != nil { + return nil, BuildResponse(r), err } var channels RetentionPolicyForChannelList - jsonErr := json.NewDecoder(r.Body).Decode(&channels) - if jsonErr != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetChannelPoliciesForUser", "model.utils.decode_json.app_error", nil, jsonErr.Error(), r.StatusCode)) + err = json.NewDecoder(r.Body).Decode(&channels) + if err != nil { + return nil, BuildResponse(r), NewAppError("Client4.GetChannelPoliciesForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return &channels, BuildResponse(r) + return &channels, BuildResponse(r), nil } // Commands Section // CreateCommand will create a new command if the user have the right permissions. -func (c *Client4) CreateCommand(cmd *Command) (*Command, *Response) { +func (c *Client4) CreateCommand(cmd *Command) (*Command, *Response, error) { buf, err := json.Marshal(cmd) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetCommandsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetCommandsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return CommandFromJson(r.Body), BuildResponse(r) + return CommandFromJson(r.Body), BuildResponse(r), nil } // UpdateCommand updates a command based on the provided Command struct. -func (c *Client4) UpdateCommand(cmd *Command) (*Command, *Response) { +func (c *Client4) UpdateCommand(cmd *Command) (*Command, *Response, error) { buf, err := json.Marshal(cmd) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetCommandRoute(cmd.Id), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetCommandRoute(cmd.Id), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return CommandFromJson(r.Body), BuildResponse(r) + return CommandFromJson(r.Body), BuildResponse(r), nil } // MoveCommand moves a command to a different team. -func (c *Client4) MoveCommand(teamId string, commandId string) (bool, *Response) { +func (c *Client4) MoveCommand(teamId string, commandId string) (*Response, error) { cmr := CommandMoveRequest{TeamId: teamId} buf, err := json.Marshal(cmr) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("MoveCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("MoveCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetCommandMoveRoute(commandId), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetCommandMoveRoute(commandId), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DeleteCommand deletes a command based on the provided command id string. -func (c *Client4) DeleteCommand(commandId string) (bool, *Response) { +func (c *Client4) DeleteCommand(commandId string) (*Response, error) { r, err := c.DoApiDelete(c.GetCommandRoute(commandId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // ListCommands will retrieve a list of commands available in the team. -func (c *Client4) ListCommands(teamId string, customOnly bool) ([]*Command, *Response) { +func (c *Client4) ListCommands(teamId string, customOnly bool) ([]*Command, *Response, error) { query := fmt.Sprintf("?team_id=%v&custom_only=%v", teamId, customOnly) r, err := c.DoApiGet(c.GetCommandsRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return CommandListFromJson(r.Body), BuildResponse(r) + return CommandListFromJson(r.Body), BuildResponse(r), nil } // ListCommandAutocompleteSuggestions will retrieve a list of suggestions for a userInput. -func (c *Client4) ListCommandAutocompleteSuggestions(userInput, teamId string) ([]AutocompleteSuggestion, *Response) { +func (c *Client4) ListCommandAutocompleteSuggestions(userInput, teamId string) ([]AutocompleteSuggestion, *Response, error) { query := fmt.Sprintf("/commands/autocomplete_suggestions?user_input=%v", userInput) r, err := c.DoApiGet(c.GetTeamRoute(teamId)+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return AutocompleteSuggestionsFromJSON(r.Body), BuildResponse(r) + return AutocompleteSuggestionsFromJSON(r.Body), BuildResponse(r), nil } // GetCommandById will retrieve a command by id. -func (c *Client4) GetCommandById(cmdId string) (*Command, *Response) { +func (c *Client4) GetCommandById(cmdId string) (*Command, *Response, error) { url := fmt.Sprintf("%s/%s", c.GetCommandsRoute(), cmdId) r, err := c.DoApiGet(url, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return CommandFromJson(r.Body), BuildResponse(r) + return CommandFromJson(r.Body), BuildResponse(r), nil } // ExecuteCommand executes a given slash command. -func (c *Client4) ExecuteCommand(channelId, command string) (*CommandResponse, *Response) { +func (c *Client4) ExecuteCommand(channelId, command string) (*CommandResponse, *Response, error) { commandArgs := &CommandArgs{ ChannelId: channelId, Command: command, } buf, err := json.Marshal(commandArgs) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) response, err := CommandResponseFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return response, BuildResponse(r) + return response, BuildResponse(r), nil } // ExecuteCommandWithTeam executes a given slash command against the specified team. // Use this when executing slash commands in a DM/GM, since the team id cannot be inferred in that case. -func (c *Client4) ExecuteCommandWithTeam(channelId, teamId, command string) (*CommandResponse, *Response) { +func (c *Client4) ExecuteCommandWithTeam(channelId, teamId, command string) (*CommandResponse, *Response, error) { commandArgs := &CommandArgs{ ChannelId: channelId, TeamId: teamId, @@ -5315,75 +5273,75 @@ func (c *Client4) ExecuteCommandWithTeam(channelId, teamId, command string) (*Co } buf, err := json.Marshal(commandArgs) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) response, err := CommandResponseFromJson(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return response, BuildResponse(r) + return response, BuildResponse(r), nil } // ListAutocompleteCommands will retrieve a list of commands available in the team. -func (c *Client4) ListAutocompleteCommands(teamId string) ([]*Command, *Response) { +func (c *Client4) ListAutocompleteCommands(teamId string) ([]*Command, *Response, error) { r, err := c.DoApiGet(c.GetTeamAutoCompleteCommandsRoute(teamId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return CommandListFromJson(r.Body), BuildResponse(r) + return CommandListFromJson(r.Body), BuildResponse(r), nil } // RegenCommandToken will create a new token if the user have the right permissions. -func (c *Client4) RegenCommandToken(commandId string) (string, *Response) { +func (c *Client4) RegenCommandToken(commandId string) (string, *Response, error) { r, err := c.DoApiPut(c.GetCommandRoute(commandId)+"/regen_token", "") if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["token"], BuildResponse(r) + return MapFromJson(r.Body)["token"], BuildResponse(r), nil } // Status Section // GetUserStatus returns a user based on the provided user id string. -func (c *Client4) GetUserStatus(userId, etag string) (*Status, *Response) { +func (c *Client4) GetUserStatus(userId, etag string) (*Status, *Response, error) { r, err := c.DoApiGet(c.GetUserStatusRoute(userId), etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return StatusFromJson(r.Body), BuildResponse(r) + return StatusFromJson(r.Body), BuildResponse(r), nil } // GetUsersStatusesByIds returns a list of users status based on the provided user ids. -func (c *Client4) GetUsersStatusesByIds(userIds []string) ([]*Status, *Response) { +func (c *Client4) GetUsersStatusesByIds(userIds []string) ([]*Status, *Response, error) { r, err := c.DoApiPost(c.GetUserStatusesRoute()+"/ids", ArrayToJson(userIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return StatusListFromJson(r.Body), BuildResponse(r) + return StatusListFromJson(r.Body), BuildResponse(r), nil } // UpdateUserStatus sets a user's status based on the provided user id string. -func (c *Client4) UpdateUserStatus(userId string, userStatus *Status) (*Status, *Response) { +func (c *Client4) UpdateUserStatus(userId string, userStatus *Status) (*Status, *Response, error) { buf, err := json.Marshal(userStatus) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("UpdateUserStatus", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("UpdateUserStatus", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetUserStatusRoute(userId), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetUserStatusRoute(userId), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return StatusFromJson(r.Body), BuildResponse(r) + return StatusFromJson(r.Body), BuildResponse(r), nil } // Emoji Section @@ -5391,440 +5349,440 @@ func (c *Client4) UpdateUserStatus(userId string, userStatus *Status) (*Status, // CreateEmoji will save an emoji to the server if the current user has permission // to do so. If successful, the provided emoji will be returned with its Id field // filled in. Otherwise, an error will be returned. -func (c *Client4) CreateEmoji(emoji *Emoji, image []byte, filename string) (*Emoji, *Response) { +func (c *Client4) CreateEmoji(emoji *Emoji, image []byte, filename string) (*Emoji, *Response, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("image", filename) if err != nil { - return nil, &Response{StatusCode: http.StatusForbidden, Error: NewAppError("CreateEmoji", "model.client.create_emoji.image.app_error", nil, err.Error(), 0)} + return nil, nil, err } if _, err := io.Copy(part, bytes.NewBuffer(image)); err != nil { - return nil, &Response{StatusCode: http.StatusForbidden, Error: NewAppError("CreateEmoji", "model.client.create_emoji.image.app_error", nil, err.Error(), 0)} + return nil, nil, err } if err := writer.WriteField("emoji", emoji.ToJson()); err != nil { - return nil, &Response{StatusCode: http.StatusForbidden, Error: NewAppError("CreateEmoji", "model.client.create_emoji.emoji.app_error", nil, err.Error(), 0)} + return nil, nil, err } if err := writer.Close(); err != nil { - return nil, &Response{StatusCode: http.StatusForbidden, Error: NewAppError("CreateEmoji", "model.client.create_emoji.writer.app_error", nil, err.Error(), 0)} + return nil, nil, err } return c.DoEmojiUploadFile(c.GetEmojisRoute(), body.Bytes(), writer.FormDataContentType()) } // GetEmojiList returns a page of custom emoji on the system. -func (c *Client4) GetEmojiList(page, perPage int) ([]*Emoji, *Response) { +func (c *Client4) GetEmojiList(page, perPage int) ([]*Emoji, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) r, err := c.DoApiGet(c.GetEmojisRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiListFromJson(r.Body), BuildResponse(r) + return EmojiListFromJson(r.Body), BuildResponse(r), nil } // GetSortedEmojiList returns a page of custom emoji on the system sorted based on the sort // parameter, blank for no sorting and "name" to sort by emoji names. -func (c *Client4) GetSortedEmojiList(page, perPage int, sort string) ([]*Emoji, *Response) { +func (c *Client4) GetSortedEmojiList(page, perPage int, sort string) ([]*Emoji, *Response, error) { query := fmt.Sprintf("?page=%v&per_page=%v&sort=%v", page, perPage, sort) r, err := c.DoApiGet(c.GetEmojisRoute()+query, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiListFromJson(r.Body), BuildResponse(r) + return EmojiListFromJson(r.Body), BuildResponse(r), nil } // DeleteEmoji delete an custom emoji on the provided emoji id string. -func (c *Client4) DeleteEmoji(emojiId string) (bool, *Response) { +func (c *Client4) DeleteEmoji(emojiId string) (*Response, error) { r, err := c.DoApiDelete(c.GetEmojiRoute(emojiId)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetEmoji returns a custom emoji based on the emojiId string. -func (c *Client4) GetEmoji(emojiId string) (*Emoji, *Response) { +func (c *Client4) GetEmoji(emojiId string) (*Emoji, *Response, error) { r, err := c.DoApiGet(c.GetEmojiRoute(emojiId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiFromJson(r.Body), BuildResponse(r) + return EmojiFromJson(r.Body), BuildResponse(r), nil } // GetEmojiByName returns a custom emoji based on the name string. -func (c *Client4) GetEmojiByName(name string) (*Emoji, *Response) { +func (c *Client4) GetEmojiByName(name string) (*Emoji, *Response, error) { r, err := c.DoApiGet(c.GetEmojiByNameRoute(name), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiFromJson(r.Body), BuildResponse(r) + return EmojiFromJson(r.Body), BuildResponse(r), nil } // GetEmojiImage returns the emoji image. -func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetEmojiImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetEmojiImage", "model.client.read_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // SearchEmoji returns a list of emoji matching some search criteria. -func (c *Client4) SearchEmoji(search *EmojiSearch) ([]*Emoji, *Response) { +func (c *Client4) SearchEmoji(search *EmojiSearch) ([]*Emoji, *Response, error) { buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("SearchEmoji", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("SearchEmoji", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetEmojisRoute()+"/search", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetEmojisRoute()+"/search", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiListFromJson(r.Body), BuildResponse(r) + return EmojiListFromJson(r.Body), BuildResponse(r), nil } // AutocompleteEmoji returns a list of emoji starting with or matching name. -func (c *Client4) AutocompleteEmoji(name string, etag string) ([]*Emoji, *Response) { +func (c *Client4) AutocompleteEmoji(name string, etag string) ([]*Emoji, *Response, error) { query := fmt.Sprintf("?name=%v", name) - r, appErr := c.DoApiGet(c.GetEmojisRoute()+"/autocomplete"+query, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(c.GetEmojisRoute()+"/autocomplete"+query, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return EmojiListFromJson(r.Body), BuildResponse(r) + return EmojiListFromJson(r.Body), BuildResponse(r), nil } // Reaction Section // SaveReaction saves an emoji reaction for a post. Returns the saved reaction if successful, otherwise an error will be returned. -func (c *Client4) SaveReaction(reaction *Reaction) (*Reaction, *Response) { +func (c *Client4) SaveReaction(reaction *Reaction) (*Reaction, *Response, error) { buf, err := json.Marshal(reaction) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("SaveReaction", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("SaveReaction", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetReactionsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetReactionsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return ReactionFromJson(r.Body), BuildResponse(r) + return ReactionFromJson(r.Body), BuildResponse(r), nil } // GetReactions returns a list of reactions to a post. -func (c *Client4) GetReactions(postId string) ([]*Reaction, *Response) { +func (c *Client4) GetReactions(postId string) ([]*Reaction, *Response, error) { r, err := c.DoApiGet(c.GetPostRoute(postId)+"/reactions", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ReactionsFromJson(r.Body), BuildResponse(r) + return ReactionsFromJson(r.Body), BuildResponse(r), nil } // DeleteReaction deletes reaction of a user in a post. -func (c *Client4) DeleteReaction(reaction *Reaction) (bool, *Response) { +func (c *Client4) DeleteReaction(reaction *Reaction) (*Response, error) { r, err := c.DoApiDelete(c.GetUserRoute(reaction.UserId) + c.GetPostRoute(reaction.PostId) + fmt.Sprintf("/reactions/%v", reaction.EmojiName)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // FetchBulkReactions returns a map of postIds and corresponding reactions -func (c *Client4) GetBulkReactions(postIds []string) (map[string][]*Reaction, *Response) { +func (c *Client4) GetBulkReactions(postIds []string) (map[string][]*Reaction, *Response, error) { r, err := c.DoApiPost(c.GetPostsRoute()+"/ids/reactions", ArrayToJson(postIds)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapPostIdToReactionsFromJson(r.Body), BuildResponse(r) + return MapPostIdToReactionsFromJson(r.Body), BuildResponse(r), nil } // Timezone Section // GetSupportedTimezone returns a page of supported timezones on the system. -func (c *Client4) GetSupportedTimezone() ([]string, *Response) { +func (c *Client4) GetSupportedTimezone() ([]string, *Response, error) { r, err := c.DoApiGet(c.GetTimezonesRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) var timezones []string json.NewDecoder(r.Body).Decode(&timezones) - return timezones, BuildResponse(r) + return timezones, BuildResponse(r), nil } // Open Graph Metadata Section // OpenGraph return the open graph metadata for a particular url if the site have the metadata. -func (c *Client4) OpenGraph(url string) (map[string]string, *Response) { +func (c *Client4) OpenGraph(url string) (map[string]string, *Response, error) { requestBody := make(map[string]string) requestBody["url"] = url r, err := c.DoApiPost(c.GetOpenGraphRoute(), MapToJson(requestBody)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body), BuildResponse(r) + return MapFromJson(r.Body), BuildResponse(r), nil } // Jobs Section // GetJob gets a single job. -func (c *Client4) GetJob(id string) (*Job, *Response) { +func (c *Client4) GetJob(id string) (*Job, *Response, error) { r, err := c.DoApiGet(c.GetJobsRoute()+fmt.Sprintf("/%v", id), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return JobFromJson(r.Body), BuildResponse(r) + return JobFromJson(r.Body), BuildResponse(r), nil } // GetJobs gets all jobs, sorted with the job that was created most recently first. -func (c *Client4) GetJobs(page int, perPage int) ([]*Job, *Response) { +func (c *Client4) GetJobs(page int, perPage int) ([]*Job, *Response, error) { r, err := c.DoApiGet(c.GetJobsRoute()+fmt.Sprintf("?page=%v&per_page=%v", page, perPage), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return JobsFromJson(r.Body), BuildResponse(r) + return JobsFromJson(r.Body), BuildResponse(r), nil } // GetJobsByType gets all jobs of a given type, sorted with the job that was created most recently first. -func (c *Client4) GetJobsByType(jobType string, page int, perPage int) ([]*Job, *Response) { +func (c *Client4) GetJobsByType(jobType string, page int, perPage int) ([]*Job, *Response, error) { r, err := c.DoApiGet(c.GetJobsRoute()+fmt.Sprintf("/type/%v?page=%v&per_page=%v", jobType, page, perPage), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return JobsFromJson(r.Body), BuildResponse(r) + return JobsFromJson(r.Body), BuildResponse(r), nil } // CreateJob creates a job based on the provided job struct. -func (c *Client4) CreateJob(job *Job) (*Job, *Response) { +func (c *Client4) CreateJob(job *Job) (*Job, *Response, error) { buf, err := json.Marshal(job) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateJob", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateJob", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetJobsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetJobsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return JobFromJson(r.Body), BuildResponse(r) + return JobFromJson(r.Body), BuildResponse(r), nil } // CancelJob requests the cancellation of the job with the provided Id. -func (c *Client4) CancelJob(jobId string) (bool, *Response) { +func (c *Client4) CancelJob(jobId string) (*Response, error) { r, err := c.DoApiPost(c.GetJobsRoute()+fmt.Sprintf("/%v/cancel", jobId), "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DownloadJob downloads the results of the job -func (c *Client4) DownloadJob(jobId string) ([]byte, *Response) { - r, appErr := c.DoApiGet(c.GetJobsRoute()+fmt.Sprintf("/%v/download", jobId), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) DownloadJob(jobId string) ([]byte, *Response, error) { + r, err := c.DoApiGet(c.GetJobsRoute()+fmt.Sprintf("/%v/download", jobId), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) data, err := ioutil.ReadAll(r.Body) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetFile", "model.client.read_job_result_file.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("GetFile", "model.client.read_job_result_file.app_error", nil, err.Error(), r.StatusCode) } - return data, BuildResponse(r) + return data, BuildResponse(r), nil } // Roles Section // GetRole gets a single role by ID. -func (c *Client4) GetRole(id string) (*Role, *Response) { +func (c *Client4) GetRole(id string) (*Role, *Response, error) { r, err := c.DoApiGet(c.GetRolesRoute()+fmt.Sprintf("/%v", id), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return RoleFromJson(r.Body), BuildResponse(r) + return RoleFromJson(r.Body), BuildResponse(r), nil } // GetRoleByName gets a single role by Name. -func (c *Client4) GetRoleByName(name string) (*Role, *Response) { +func (c *Client4) GetRoleByName(name string) (*Role, *Response, error) { r, err := c.DoApiGet(c.GetRolesRoute()+fmt.Sprintf("/name/%v", name), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return RoleFromJson(r.Body), BuildResponse(r) + return RoleFromJson(r.Body), BuildResponse(r), nil } // GetRolesByNames returns a list of roles based on the provided role names. -func (c *Client4) GetRolesByNames(roleNames []string) ([]*Role, *Response) { +func (c *Client4) GetRolesByNames(roleNames []string) ([]*Role, *Response, error) { r, err := c.DoApiPost(c.GetRolesRoute()+"/names", ArrayToJson(roleNames)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return RoleListFromJson(r.Body), BuildResponse(r) + return RoleListFromJson(r.Body), BuildResponse(r), nil } // PatchRole partially updates a role in the system. Any missing fields are not updated. -func (c *Client4) PatchRole(roleId string, patch *RolePatch) (*Role, *Response) { +func (c *Client4) PatchRole(roleId string, patch *RolePatch) (*Role, *Response, error) { buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchRole", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchRole", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetRolesRoute()+fmt.Sprintf("/%v/patch", roleId), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetRolesRoute()+fmt.Sprintf("/%v/patch", roleId), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return RoleFromJson(r.Body), BuildResponse(r) + return RoleFromJson(r.Body), BuildResponse(r), nil } // Schemes Section // CreateScheme creates a new Scheme. -func (c *Client4) CreateScheme(scheme *Scheme) (*Scheme, *Response) { +func (c *Client4) CreateScheme(scheme *Scheme) (*Scheme, *Response, error) { buf, err := json.Marshal(scheme) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetSchemesRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetSchemesRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return SchemeFromJson(r.Body), BuildResponse(r) + return SchemeFromJson(r.Body), BuildResponse(r), nil } // GetScheme gets a single scheme by ID. -func (c *Client4) GetScheme(id string) (*Scheme, *Response) { +func (c *Client4) GetScheme(id string) (*Scheme, *Response, error) { r, err := c.DoApiGet(c.GetSchemeRoute(id), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return SchemeFromJson(r.Body), BuildResponse(r) + return SchemeFromJson(r.Body), BuildResponse(r), nil } // GetSchemes gets all schemes, sorted with the most recently created first, optionally filtered by scope. -func (c *Client4) GetSchemes(scope string, page int, perPage int) ([]*Scheme, *Response) { +func (c *Client4) GetSchemes(scope string, page int, perPage int) ([]*Scheme, *Response, error) { r, err := c.DoApiGet(c.GetSchemesRoute()+fmt.Sprintf("?scope=%v&page=%v&per_page=%v", scope, page, perPage), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return SchemesFromJson(r.Body), BuildResponse(r) + return SchemesFromJson(r.Body), BuildResponse(r), nil } // DeleteScheme deletes a single scheme by ID. -func (c *Client4) DeleteScheme(id string) (bool, *Response) { +func (c *Client4) DeleteScheme(id string) (*Response, error) { r, err := c.DoApiDelete(c.GetSchemeRoute(id)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // PatchScheme partially updates a scheme in the system. Any missing fields are not updated. -func (c *Client4) PatchScheme(id string, patch *SchemePatch) (*Scheme, *Response) { +func (c *Client4) PatchScheme(id string, patch *SchemePatch) (*Scheme, *Response, error) { buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetSchemeRoute(id)+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetSchemeRoute(id)+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return SchemeFromJson(r.Body), BuildResponse(r) + return SchemeFromJson(r.Body), BuildResponse(r), nil } // GetTeamsForScheme gets the teams using this scheme, sorted alphabetically by display name. -func (c *Client4) GetTeamsForScheme(schemeId string, page int, perPage int) ([]*Team, *Response) { +func (c *Client4) GetTeamsForScheme(schemeId string, page int, perPage int) ([]*Team, *Response, error) { r, err := c.DoApiGet(c.GetSchemeRoute(schemeId)+fmt.Sprintf("/teams?page=%v&per_page=%v", page, perPage), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TeamListFromJson(r.Body), BuildResponse(r) + return TeamListFromJson(r.Body), BuildResponse(r), nil } // GetChannelsForScheme gets the channels using this scheme, sorted alphabetically by display name. -func (c *Client4) GetChannelsForScheme(schemeId string, page int, perPage int) (ChannelList, *Response) { - r, appErr := c.DoApiGet(c.GetSchemeRoute(schemeId)+fmt.Sprintf("/channels?page=%v&per_page=%v", page, perPage), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelsForScheme(schemeId string, page int, perPage int) (ChannelList, *Response, error) { + r, err := c.DoApiGet(c.GetSchemeRoute(schemeId)+fmt.Sprintf("/channels?page=%v&per_page=%v", page, perPage), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch ChannelList - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelsForScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelsForScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // Plugin Section // UploadPlugin takes an io.Reader stream pointing to the contents of a .tar.gz plugin. -func (c *Client4) UploadPlugin(file io.Reader) (*Manifest, *Response) { +func (c *Client4) UploadPlugin(file io.Reader) (*Manifest, *Response, error) { return c.uploadPlugin(file, false) } -func (c *Client4) UploadPluginForced(file io.Reader) (*Manifest, *Response) { +func (c *Client4) UploadPluginForced(file io.Reader) (*Manifest, *Response, error) { return c.uploadPlugin(file, true) } -func (c *Client4) uploadPlugin(file io.Reader, force bool) (*Manifest, *Response) { +func (c *Client4) uploadPlugin(file io.Reader, force bool) (*Manifest, *Response, error) { body := new(bytes.Buffer) writer := multipart.NewWriter(body) if force { err := writer.WriteField("force", c.boolString(true)) if err != nil { - return nil, &Response{Error: NewAppError("UploadPlugin", "model.client.writer.app_error", nil, err.Error(), 0)} + return nil, nil, err } } part, err := writer.CreateFormFile("plugin", "plugin.tar.gz") if err != nil { - return nil, &Response{Error: NewAppError("UploadPlugin", "model.client.writer.app_error", nil, err.Error(), 0)} + return nil, nil, err } if _, err = io.Copy(part, file); err != nil { - return nil, &Response{Error: NewAppError("UploadPlugin", "model.client.writer.app_error", nil, err.Error(), 0)} + return nil, nil, err } if err = writer.Close(); err != nil { - return nil, &Response{Error: NewAppError("UploadPlugin", "model.client.writer.app_error", nil, err.Error(), 0)} + return nil, nil, err } rq, err := http.NewRequest("POST", c.ApiUrl+c.GetPluginsRoute(), body) if err != nil { - return nil, &Response{Error: NewAppError("UploadPlugin", "model.client.connecting.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } rq.Header.Set("Content-Type", writer.FormDataContentType()) @@ -5833,818 +5791,817 @@ func (c *Client4) uploadPlugin(file io.Reader, force bool) (*Manifest, *Response } rp, err := c.HTTPClient.Do(rq) - if err != nil || rp == nil { - return nil, BuildErrorResponse(rp, NewAppError("UploadPlugin", "model.client.connecting.app_error", nil, err.Error(), 0)) + if err != nil { + return nil, BuildResponse(rp), err } defer closeBody(rp) if rp.StatusCode >= 300 { - return nil, BuildErrorResponse(rp, AppErrorFromJson(rp.Body)) + return nil, BuildResponse(rp), AppErrorFromJson(rp.Body) } - return ManifestFromJson(rp.Body), BuildResponse(rp) + return ManifestFromJson(rp.Body), BuildResponse(rp), nil } -func (c *Client4) InstallPluginFromUrl(downloadUrl string, force bool) (*Manifest, *Response) { +func (c *Client4) InstallPluginFromUrl(downloadUrl string, force bool) (*Manifest, *Response, error) { forceStr := c.boolString(force) url := fmt.Sprintf("%s?plugin_download_url=%s&force=%s", c.GetPluginsRoute()+"/install_from_url", url.QueryEscape(downloadUrl), forceStr) r, err := c.DoApiPost(url, "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ManifestFromJson(r.Body), BuildResponse(r) + return ManifestFromJson(r.Body), BuildResponse(r), nil } // InstallMarketplacePlugin will install marketplace plugin. -func (c *Client4) InstallMarketplacePlugin(request *InstallMarketplacePluginRequest) (*Manifest, *Response) { +func (c *Client4) InstallMarketplacePlugin(request *InstallMarketplacePluginRequest) (*Manifest, *Response, error) { json, err := request.ToJson() if err != nil { - return nil, &Response{Error: NewAppError("InstallMarketplacePlugin", "model.client.plugin_request_to_json.app_error", nil, err.Error(), http.StatusBadRequest)} + return nil, nil, err } - r, appErr := c.DoApiPost(c.GetPluginsRoute()+"/marketplace", json) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(c.GetPluginsRoute()+"/marketplace", json) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return ManifestFromJson(r.Body), BuildResponse(r) + return ManifestFromJson(r.Body), BuildResponse(r), nil } // GetPlugins will return a list of plugin manifests for currently active plugins. -func (c *Client4) GetPlugins() (*PluginsResponse, *Response) { +func (c *Client4) GetPlugins() (*PluginsResponse, *Response, error) { r, err := c.DoApiGet(c.GetPluginsRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PluginsResponseFromJson(r.Body), BuildResponse(r) + return PluginsResponseFromJson(r.Body), BuildResponse(r), nil } // GetPluginStatuses will return the plugins installed on any server in the cluster, for reporting // to the administrator via the system console. -func (c *Client4) GetPluginStatuses() (PluginStatuses, *Response) { +func (c *Client4) GetPluginStatuses() (PluginStatuses, *Response, error) { r, err := c.DoApiGet(c.GetPluginsRoute()+"/statuses", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return PluginStatusesFromJson(r.Body), BuildResponse(r) + return PluginStatusesFromJson(r.Body), BuildResponse(r), nil } // RemovePlugin will disable and delete a plugin. -func (c *Client4) RemovePlugin(id string) (bool, *Response) { +func (c *Client4) RemovePlugin(id string) (*Response, error) { r, err := c.DoApiDelete(c.GetPluginRoute(id)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetWebappPlugins will return a list of plugins that the webapp should download. -func (c *Client4) GetWebappPlugins() ([]*Manifest, *Response) { +func (c *Client4) GetWebappPlugins() ([]*Manifest, *Response, error) { r, err := c.DoApiGet(c.GetPluginsRoute()+"/webapp", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ManifestListFromJson(r.Body), BuildResponse(r) + return ManifestListFromJson(r.Body), BuildResponse(r), nil } // EnablePlugin will enable an plugin installed. -func (c *Client4) EnablePlugin(id string) (bool, *Response) { +func (c *Client4) EnablePlugin(id string) (*Response, error) { r, err := c.DoApiPost(c.GetPluginRoute(id)+"/enable", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // DisablePlugin will disable an enabled plugin. -func (c *Client4) DisablePlugin(id string) (bool, *Response) { +func (c *Client4) DisablePlugin(id string) (*Response, error) { r, err := c.DoApiPost(c.GetPluginRoute(id)+"/disable", "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetMarketplacePlugins will return a list of plugins that an admin can install. -func (c *Client4) GetMarketplacePlugins(filter *MarketplacePluginFilter) ([]*MarketplacePlugin, *Response) { +func (c *Client4) GetMarketplacePlugins(filter *MarketplacePluginFilter) ([]*MarketplacePlugin, *Response, error) { route := c.GetPluginsRoute() + "/marketplace" - u, parseErr := url.Parse(route) - if parseErr != nil { - return nil, &Response{Error: NewAppError("GetMarketplacePlugins", "model.client.parse_plugins.app_error", nil, parseErr.Error(), http.StatusBadRequest)} + u, err := url.Parse(route) + if err != nil { + return nil, nil, err } filter.ApplyToURL(u) r, err := c.DoApiGet(u.String(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - plugins, readerErr := MarketplacePluginsFromReader(r.Body) - if readerErr != nil { - return nil, BuildErrorResponse(r, NewAppError(route, "model.client.parse_plugins.app_error", nil, err.Error(), http.StatusBadRequest)) + plugins, err := MarketplacePluginsFromReader(r.Body) + if err != nil { + return nil, BuildResponse(r), NewAppError(route, "model.client.parse_plugins.app_error", nil, err.Error(), http.StatusBadRequest) } - return plugins, BuildResponse(r) + return plugins, BuildResponse(r), nil } // UpdateChannelScheme will update a channel's scheme. -func (c *Client4) UpdateChannelScheme(channelId, schemeId string) (bool, *Response) { +func (c *Client4) UpdateChannelScheme(channelId, schemeId string) (*Response, error) { sip := &SchemeIDPatch{SchemeID: &schemeId} buf, err := json.Marshal(sip) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("UpdateChannelScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("UpdateChannelScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetChannelSchemeRoute(channelId), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetChannelSchemeRoute(channelId), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // UpdateTeamScheme will update a team's scheme. -func (c *Client4) UpdateTeamScheme(teamId, schemeId string) (bool, *Response) { +func (c *Client4) UpdateTeamScheme(teamId, schemeId string) (*Response, error) { sip := &SchemeIDPatch{SchemeID: &schemeId} buf, err := json.Marshal(sip) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("UpdateTeamScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("UpdateTeamScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetTeamSchemeRoute(teamId), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetTeamSchemeRoute(teamId), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetRedirectLocation retrieves the value of the 'Location' header of an HTTP response for a given URL. -func (c *Client4) GetRedirectLocation(urlParam, etag string) (string, *Response) { +func (c *Client4) GetRedirectLocation(urlParam, etag string) (string, *Response, error) { url := fmt.Sprintf("%s?url=%s", c.GetRedirectLocationRoute(), url.QueryEscape(urlParam)) r, err := c.DoApiGet(url, etag) if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildResponse(r), err } defer closeBody(r) - return MapFromJson(r.Body)["location"], BuildResponse(r) + return MapFromJson(r.Body)["location"], BuildResponse(r), nil } // SetServerBusy will mark the server as busy, which disables non-critical services for `secs` seconds. -func (c *Client4) SetServerBusy(secs int) (bool, *Response) { +func (c *Client4) SetServerBusy(secs int) (*Response, error) { url := fmt.Sprintf("%s?seconds=%d", c.GetServerBusyRoute(), secs) r, err := c.DoApiPost(url, "") if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // ClearServerBusy will mark the server as not busy. -func (c *Client4) ClearServerBusy() (bool, *Response) { +func (c *Client4) ClearServerBusy() (*Response, error) { r, err := c.DoApiDelete(c.GetServerBusyRoute()) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetServerBusy returns the current ServerBusyState including the time when a server marked busy // will automatically have the flag cleared. -func (c *Client4) GetServerBusy() (*ServerBusyState, *Response) { +func (c *Client4) GetServerBusy() (*ServerBusyState, *Response, error) { r, err := c.DoApiGet(c.GetServerBusyRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) sbs := ServerBusyStateFromJson(r.Body) - return sbs, BuildResponse(r) + return sbs, BuildResponse(r), nil } // RegisterTermsOfServiceAction saves action performed by a user against a specific terms of service. -func (c *Client4) RegisterTermsOfServiceAction(userId, termsOfServiceId string, accepted bool) (*bool, *Response) { +func (c *Client4) RegisterTermsOfServiceAction(userId, termsOfServiceId string, accepted bool) (*Response, error) { url := c.GetUserTermsOfServiceRoute(userId) data := map[string]interface{}{"termsOfServiceId": termsOfServiceId, "accepted": accepted} r, err := c.DoApiPost(url, StringInterfaceToJson(data)) if err != nil { - return nil, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return NewBool(CheckStatusOK(r)), BuildResponse(r) + return BuildResponse(r), nil } // GetTermsOfService fetches the latest terms of service -func (c *Client4) GetTermsOfService(etag string) (*TermsOfService, *Response) { +func (c *Client4) GetTermsOfService(etag string) (*TermsOfService, *Response, error) { url := c.GetTermsOfServiceRoute() r, err := c.DoApiGet(url, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TermsOfServiceFromJson(r.Body), BuildResponse(r) + return TermsOfServiceFromJson(r.Body), BuildResponse(r), nil } // GetUserTermsOfService fetches user's latest terms of service action if the latest action was for acceptance. -func (c *Client4) GetUserTermsOfService(userId, etag string) (*UserTermsOfService, *Response) { +func (c *Client4) GetUserTermsOfService(userId, etag string) (*UserTermsOfService, *Response, error) { url := c.GetUserTermsOfServiceRoute(userId) r, err := c.DoApiGet(url, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UserTermsOfServiceFromJson(r.Body), BuildResponse(r) + return UserTermsOfServiceFromJson(r.Body), BuildResponse(r), nil } // CreateTermsOfService creates new terms of service. -func (c *Client4) CreateTermsOfService(text, userId string) (*TermsOfService, *Response) { +func (c *Client4) CreateTermsOfService(text, userId string) (*TermsOfService, *Response, error) { url := c.GetTermsOfServiceRoute() data := map[string]interface{}{"text": text} r, err := c.DoApiPost(url, StringInterfaceToJson(data)) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return TermsOfServiceFromJson(r.Body), BuildResponse(r) + return TermsOfServiceFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetGroup(groupID, etag string) (*Group, *Response) { - r, appErr := c.DoApiGet(c.GetGroupRoute(groupID), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetGroup(groupID, etag string) (*Group, *Response, error) { + r, err := c.DoApiGet(c.GetGroupRoute(groupID), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupFromJson(r.Body), BuildResponse(r) + return GroupFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) PatchGroup(groupID string, patch *GroupPatch) (*Group, *Response) { +func (c *Client4) PatchGroup(groupID string, patch *GroupPatch) (*Group, *Response, error) { payload, _ := json.Marshal(patch) - r, appErr := c.DoApiPut(c.GetGroupRoute(groupID)+"/patch", string(payload)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPut(c.GetGroupRoute(groupID)+"/patch", string(payload)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupFromJson(r.Body), BuildResponse(r) + return GroupFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) LinkGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, patch *GroupSyncablePatch) (*GroupSyncable, *Response) { +func (c *Client4) LinkGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, patch *GroupSyncablePatch) (*GroupSyncable, *Response, error) { payload, _ := json.Marshal(patch) url := fmt.Sprintf("%s/link", c.GetGroupSyncableRoute(groupID, syncableID, syncableType)) - r, appErr := c.DoApiPost(url, string(payload)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPost(url, string(payload)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupSyncableFromJson(r.Body), BuildResponse(r) + return GroupSyncableFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) UnlinkGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType) *Response { +func (c *Client4) UnlinkGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType) (*Response, error) { url := fmt.Sprintf("%s/link", c.GetGroupSyncableRoute(groupID, syncableID, syncableType)) - r, appErr := c.DoApiDelete(url) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.DoApiDelete(url) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) GetGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, etag string) (*GroupSyncable, *Response) { - r, appErr := c.DoApiGet(c.GetGroupSyncableRoute(groupID, syncableID, syncableType), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, etag string) (*GroupSyncable, *Response, error) { + r, err := c.DoApiGet(c.GetGroupSyncableRoute(groupID, syncableID, syncableType), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupSyncableFromJson(r.Body), BuildResponse(r) + return GroupSyncableFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetGroupSyncables(groupID string, syncableType GroupSyncableType, etag string) ([]*GroupSyncable, *Response) { - r, appErr := c.DoApiGet(c.GetGroupSyncablesRoute(groupID, syncableType), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetGroupSyncables(groupID string, syncableType GroupSyncableType, etag string) ([]*GroupSyncable, *Response, error) { + r, err := c.DoApiGet(c.GetGroupSyncablesRoute(groupID, syncableType), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupSyncablesFromJson(r.Body), BuildResponse(r) + return GroupSyncablesFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) PatchGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, patch *GroupSyncablePatch) (*GroupSyncable, *Response) { +func (c *Client4) PatchGroupSyncable(groupID, syncableID string, syncableType GroupSyncableType, patch *GroupSyncablePatch) (*GroupSyncable, *Response, error) { payload, _ := json.Marshal(patch) - r, appErr := c.DoApiPut(c.GetGroupSyncableRoute(groupID, syncableID, syncableType)+"/patch", string(payload)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiPut(c.GetGroupSyncableRoute(groupID, syncableID, syncableType)+"/patch", string(payload)) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupSyncableFromJson(r.Body), BuildResponse(r) + return GroupSyncableFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) TeamMembersMinusGroupMembers(teamID string, groupIDs []string, page, perPage int, etag string) ([]*UserWithGroups, int64, *Response) { +func (c *Client4) TeamMembersMinusGroupMembers(teamID string, groupIDs []string, page, perPage int, etag string) ([]*UserWithGroups, int64, *Response, error) { groupIDStr := strings.Join(groupIDs, ",") query := fmt.Sprintf("?group_ids=%s&page=%d&per_page=%d", groupIDStr, page, perPage) r, err := c.DoApiGet(c.GetTeamRoute(teamID)+"/members_minus_group_members"+query, etag) if err != nil { - return nil, 0, BuildErrorResponse(r, err) + return nil, 0, BuildResponse(r), err } defer closeBody(r) ugc := UsersWithGroupsAndCountFromJson(r.Body) - return ugc.Users, ugc.Count, BuildResponse(r) + return ugc.Users, ugc.Count, BuildResponse(r), nil } -func (c *Client4) ChannelMembersMinusGroupMembers(channelID string, groupIDs []string, page, perPage int, etag string) ([]*UserWithGroups, int64, *Response) { +func (c *Client4) ChannelMembersMinusGroupMembers(channelID string, groupIDs []string, page, perPage int, etag string) ([]*UserWithGroups, int64, *Response, error) { groupIDStr := strings.Join(groupIDs, ",") query := fmt.Sprintf("?group_ids=%s&page=%d&per_page=%d", groupIDStr, page, perPage) r, err := c.DoApiGet(c.GetChannelRoute(channelID)+"/members_minus_group_members"+query, etag) if err != nil { - return nil, 0, BuildErrorResponse(r, err) + return nil, 0, BuildResponse(r), err } defer closeBody(r) ugc := UsersWithGroupsAndCountFromJson(r.Body) - return ugc.Users, ugc.Count, BuildResponse(r) + return ugc.Users, ugc.Count, BuildResponse(r), nil } -func (c *Client4) PatchConfig(config *Config) (*Config, *Response) { +func (c *Client4) PatchConfig(config *Config) (*Config, *Response, error) { buf, err := json.Marshal(config) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("PatchConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPutBytes(c.GetConfigRoute()+"/patch", buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetConfigRoute()+"/patch", buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return ConfigFromJson(r.Body), BuildResponse(r) + return ConfigFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetChannelModerations(channelID string, etag string) ([]*ChannelModeration, *Response) { - r, appErr := c.DoApiGet(c.GetChannelRoute(channelID)+"/moderations", etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) - } - defer closeBody(r) - - var ch []*ChannelModeration - err := json.NewDecoder(r.Body).Decode(&ch) +func (c *Client4) GetChannelModerations(channelID string, etag string) ([]*ChannelModeration, *Response, error) { + r, err := c.DoApiGet(c.GetChannelRoute(channelID)+"/moderations", etag) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) - } - return ch, BuildResponse(r) -} - -func (c *Client4) PatchChannelModerations(channelID string, patch []*ChannelModerationPatch) ([]*ChannelModeration, *Response) { - payload, err := json.Marshal(patch) - if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("PatchChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) - } - - r, appErr := c.DoApiPut(c.GetChannelRoute(channelID)+"/moderations/patch", string(payload)) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*ChannelModeration err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("PatchChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } -func (c *Client4) GetKnownUsers() ([]string, *Response) { +func (c *Client4) PatchChannelModerations(channelID string, patch []*ChannelModerationPatch) ([]*ChannelModeration, *Response, error) { + payload, err := json.Marshal(patch) + if err != nil { + return nil, nil, NewAppError("PatchChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) + } + + r, err := c.DoApiPut(c.GetChannelRoute(channelID)+"/moderations/patch", string(payload)) + if err != nil { + return nil, BuildResponse(r), err + } + defer closeBody(r) + + var ch []*ChannelModeration + err = json.NewDecoder(r.Body).Decode(&ch) + if err != nil { + return nil, BuildResponse(r), NewAppError("PatchChannelModerations", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) + } + return ch, BuildResponse(r), nil +} + +func (c *Client4) GetKnownUsers() ([]string, *Response, error) { r, err := c.DoApiGet(c.GetUsersRoute()+"/known", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) var userIds []string json.NewDecoder(r.Body).Decode(&userIds) - return userIds, BuildResponse(r) + return userIds, BuildResponse(r), nil } // PublishUserTyping publishes a user is typing websocket event based on the provided TypingRequest. -func (c *Client4) PublishUserTyping(userID string, typingRequest TypingRequest) (bool, *Response) { +func (c *Client4) PublishUserTyping(userID string, typingRequest TypingRequest) (*Response, error) { buf, err := json.Marshal(typingRequest) if err != nil { - return false, BuildErrorResponse(nil, NewAppError("PublishUserTyping", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, NewAppError("PublishUserTyping", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetPublishUserTypingRoute(userID), buf) - if appErr != nil { - return false, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetPublishUserTypingRoute(userID), buf) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) GetChannelMemberCountsByGroup(channelID string, includeTimezones bool, etag string) ([]*ChannelMemberCountByGroup, *Response) { - r, appErr := c.DoApiGet(c.GetChannelRoute(channelID)+"/member_counts_by_group?include_timezones="+strconv.FormatBool(includeTimezones), etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetChannelMemberCountsByGroup(channelID string, includeTimezones bool, etag string) ([]*ChannelMemberCountByGroup, *Response, error) { + r, err := c.DoApiGet(c.GetChannelRoute(channelID)+"/member_counts_by_group?include_timezones="+strconv.FormatBool(includeTimezones), etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var ch []*ChannelMemberCountByGroup - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("GetChannelMemberCountsByGroup", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, BuildResponse(r), NewAppError("GetChannelMemberCountsByGroup", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return ch, BuildResponse(r) + return ch, BuildResponse(r), nil } // RequestTrialLicense will request a trial license and install it in the server -func (c *Client4) RequestTrialLicense(users int) (bool, *Response) { +func (c *Client4) RequestTrialLicense(users int) (*Response, error) { b, _ := json.Marshal(map[string]interface{}{"users": users, "terms_accepted": true}) r, err := c.DoApiPost("/trial-license", string(b)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } // GetGroupStats retrieves stats for a Mattermost Group -func (c *Client4) GetGroupStats(groupID string) (*GroupStats, *Response) { - r, appErr := c.DoApiGet(c.GetGroupRoute(groupID)+"/stats", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetGroupStats(groupID string) (*GroupStats, *Response, error) { + r, err := c.DoApiGet(c.GetGroupRoute(groupID)+"/stats", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return GroupStatsFromJson(r.Body), BuildResponse(r) + return GroupStatsFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetSidebarCategoriesForTeamForUser(userID, teamID, etag string) (*OrderedSidebarCategories, *Response) { +func (c *Client4) GetSidebarCategoriesForTeamForUser(userID, teamID, etag string) (*OrderedSidebarCategories, *Response, error) { route := c.GetUserCategoryRoute(userID, teamID) - r, appErr := c.DoApiGet(route, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(route, etag) + if err != nil { + return nil, BuildResponse(r), err } var cat *OrderedSidebarCategories - err := json.NewDecoder(r.Body).Decode(&cat) + err = json.NewDecoder(r.Body).Decode(&cat) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.GetSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.GetSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return cat, BuildResponse(r) + return cat, BuildResponse(r), nil } -func (c *Client4) CreateSidebarCategoryForTeamForUser(userID, teamID string, category *SidebarCategoryWithChannels) (*SidebarCategoryWithChannels, *Response) { +func (c *Client4) CreateSidebarCategoryForTeamForUser(userID, teamID string, category *SidebarCategoryWithChannels) (*SidebarCategoryWithChannels, *Response, error) { payload, _ := json.Marshal(category) route := c.GetUserCategoryRoute(userID, teamID) - r, appErr := c.doApiPostBytes(route, payload) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(route, payload) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cat *SidebarCategoryWithChannels - err := json.NewDecoder(r.Body).Decode(&cat) + err = json.NewDecoder(r.Body).Decode(&cat) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.CreateSidebarCategoryForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.CreateSidebarCategoryForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return cat, BuildResponse(r) + return cat, BuildResponse(r), nil } -func (c *Client4) UpdateSidebarCategoriesForTeamForUser(userID, teamID string, categories []*SidebarCategoryWithChannels) ([]*SidebarCategoryWithChannels, *Response) { +func (c *Client4) UpdateSidebarCategoriesForTeamForUser(userID, teamID string, categories []*SidebarCategoryWithChannels) ([]*SidebarCategoryWithChannels, *Response, error) { payload, _ := json.Marshal(categories) route := c.GetUserCategoryRoute(userID, teamID) - r, appErr := c.doApiPutBytes(route, payload) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(route, payload) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cat []*SidebarCategoryWithChannels - err := json.NewDecoder(r.Body).Decode(&cat) + err = json.NewDecoder(r.Body).Decode(&cat) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return cat, BuildResponse(r) + return cat, BuildResponse(r), nil } -func (c *Client4) GetSidebarCategoryOrderForTeamForUser(userID, teamID, etag string) ([]string, *Response) { +func (c *Client4) GetSidebarCategoryOrderForTeamForUser(userID, teamID, etag string) ([]string, *Response, error) { route := c.GetUserCategoryRoute(userID, teamID) + "/order" r, err := c.DoApiGet(route, etag) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) UpdateSidebarCategoryOrderForTeamForUser(userID, teamID string, order []string) ([]string, *Response) { +func (c *Client4) UpdateSidebarCategoryOrderForTeamForUser(userID, teamID string, order []string) ([]string, *Response, error) { payload, _ := json.Marshal(order) route := c.GetUserCategoryRoute(userID, teamID) + "/order" r, err := c.doApiPutBytes(route, payload) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) GetSidebarCategoryForTeamForUser(userID, teamID, categoryID, etag string) (*SidebarCategoryWithChannels, *Response) { +func (c *Client4) GetSidebarCategoryForTeamForUser(userID, teamID, categoryID, etag string) (*SidebarCategoryWithChannels, *Response, error) { route := c.GetUserCategoryRoute(userID, teamID) + "/" + categoryID - r, appErr := c.DoApiGet(route, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(route, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cat *SidebarCategoryWithChannels - err := json.NewDecoder(r.Body).Decode(&cat) + err = json.NewDecoder(r.Body).Decode(&cat) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return cat, BuildResponse(r) + return cat, BuildResponse(r), nil } -func (c *Client4) UpdateSidebarCategoryForTeamForUser(userID, teamID, categoryID string, category *SidebarCategoryWithChannels) (*SidebarCategoryWithChannels, *Response) { +func (c *Client4) UpdateSidebarCategoryForTeamForUser(userID, teamID, categoryID string, category *SidebarCategoryWithChannels) (*SidebarCategoryWithChannels, *Response, error) { payload, _ := json.Marshal(category) route := c.GetUserCategoryRoute(userID, teamID) + "/" + categoryID - r, appErr := c.doApiPutBytes(route, payload) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(route, payload) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cat *SidebarCategoryWithChannels - err := json.NewDecoder(r.Body).Decode(&cat) + err = json.NewDecoder(r.Body).Decode(&cat) if err != nil { - return nil, BuildErrorResponse(r, NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode)) + return nil, BuildResponse(r), NewAppError("Client4.UpdateSidebarCategoriesForTeamForUser", "model.utils.decode_json.app_error", nil, err.Error(), r.StatusCode) } - return cat, BuildResponse(r) + return cat, BuildResponse(r), nil } // CheckIntegrity performs a database integrity check. -func (c *Client4) CheckIntegrity() ([]IntegrityCheckResult, *Response) { +func (c *Client4) CheckIntegrity() ([]IntegrityCheckResult, *Response, error) { r, err := c.DoApiPost("/integrity", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) var results []IntegrityCheckResult if err := json.NewDecoder(r.Body).Decode(&results); err != nil { - appErr := NewAppError("Api4.CheckIntegrity", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) - return nil, BuildErrorResponse(r, appErr) + return nil, BuildResponse(r), NewAppError("Api4.CheckIntegrity", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - return results, BuildResponse(r) + return results, BuildResponse(r), nil } -func (c *Client4) GetNotices(lastViewed int64, teamId string, client NoticeClientType, clientVersion, locale, etag string) (NoticeMessages, *Response) { +func (c *Client4) GetNotices(lastViewed int64, teamId string, client NoticeClientType, clientVersion, locale, etag string) (NoticeMessages, *Response, error) { url := fmt.Sprintf("/system/notices/%s?lastViewed=%d&client=%s&clientVersion=%s&locale=%s", teamId, lastViewed, client, clientVersion, locale) - r, appErr := c.DoApiGet(url, etag) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, etag) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) notices, err := UnmarshalProductNoticeMessages(r.Body) if err != nil { - return nil, &Response{StatusCode: http.StatusBadRequest, Error: NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), http.StatusForbidden)} + return nil, BuildResponse(r), err } - return notices, BuildResponse(r) + return notices, BuildResponse(r), nil } -func (c *Client4) MarkNoticesViewed(ids []string) *Response { +func (c *Client4) MarkNoticesViewed(ids []string) (*Response, error) { r, err := c.DoApiPut("/system/notices/view", ArrayToJson(ids)) if err != nil { - return BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // CreateUpload creates a new upload session. -func (c *Client4) CreateUpload(us *UploadSession) (*UploadSession, *Response) { +func (c *Client4) CreateUpload(us *UploadSession) (*UploadSession, *Response, error) { buf, err := json.Marshal(us) if err != nil { - return nil, BuildErrorResponse(nil, NewAppError("CreateUpload", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + return nil, nil, NewAppError("CreateUpload", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError) } - r, appErr := c.doApiPostBytes(c.GetUploadsRoute(), buf) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetUploadsRoute(), buf) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) - return UploadSessionFromJson(r.Body), BuildResponse(r) + return UploadSessionFromJson(r.Body), BuildResponse(r), nil } // GetUpload returns the upload session for the specified uploadId. -func (c *Client4) GetUpload(uploadId string) (*UploadSession, *Response) { +func (c *Client4) GetUpload(uploadId string) (*UploadSession, *Response, error) { r, err := c.DoApiGet(c.GetUploadRoute(uploadId), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UploadSessionFromJson(r.Body), BuildResponse(r) + return UploadSessionFromJson(r.Body), BuildResponse(r), nil } // GetUploadsForUser returns the upload sessions created by the specified // userId. -func (c *Client4) GetUploadsForUser(userId string) ([]*UploadSession, *Response) { +func (c *Client4) GetUploadsForUser(userId string) ([]*UploadSession, *Response, error) { r, err := c.DoApiGet(c.GetUserRoute(userId)+"/uploads", "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return UploadSessionsFromJson(r.Body), BuildResponse(r) + return UploadSessionsFromJson(r.Body), BuildResponse(r), nil } // UploadData performs an upload. On success it returns // a FileInfo object. -func (c *Client4) UploadData(uploadId string, data io.Reader) (*FileInfo, *Response) { +func (c *Client4) UploadData(uploadId string, data io.Reader) (*FileInfo, *Response, error) { url := c.GetUploadRoute(uploadId) r, err := c.doApiRequestReader("POST", c.ApiUrl+url, data, nil) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return FileInfoFromJson(r.Body), BuildResponse(r) + return FileInfoFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) UpdatePassword(userId, currentPassword, newPassword string) *Response { +func (c *Client4) UpdatePassword(userId, currentPassword, newPassword string) (*Response, error) { requestBody := map[string]string{"current_password": currentPassword, "new_password": newPassword} r, err := c.DoApiPut(c.GetUserRoute(userId)+"/password", MapToJson(requestBody)) if err != nil { - return BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } // Cloud Section -func (c *Client4) GetCloudProducts() ([]*Product, *Response) { - r, appErr := c.DoApiGet(c.GetCloudRoute()+"/products", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetCloudProducts() ([]*Product, *Response, error) { + r, err := c.DoApiGet(c.GetCloudRoute()+"/products", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cloudProducts []*Product json.NewDecoder(r.Body).Decode(&cloudProducts) - return cloudProducts, BuildResponse(r) + return cloudProducts, BuildResponse(r), nil } -func (c *Client4) CreateCustomerPayment() (*StripeSetupIntent, *Response) { - r, appErr := c.DoApiPost(c.GetCloudRoute()+"/payment", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) CreateCustomerPayment() (*StripeSetupIntent, *Response, error) { + r, err := c.DoApiPost(c.GetCloudRoute()+"/payment", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var setupIntent *StripeSetupIntent json.NewDecoder(r.Body).Decode(&setupIntent) - return setupIntent, BuildResponse(r) + return setupIntent, BuildResponse(r), nil } -func (c *Client4) ConfirmCustomerPayment(confirmRequest *ConfirmPaymentMethodRequest) *Response { +func (c *Client4) ConfirmCustomerPayment(confirmRequest *ConfirmPaymentMethodRequest) (*Response, error) { json, _ := json.Marshal(confirmRequest) - r, appErr := c.doApiPostBytes(c.GetCloudRoute()+"/payment/confirm", json) - if appErr != nil { - return BuildErrorResponse(r, appErr) + r, err := c.doApiPostBytes(c.GetCloudRoute()+"/payment/confirm", json) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) GetCloudCustomer() (*CloudCustomer, *Response) { - r, appErr := c.DoApiGet(c.GetCloudRoute()+"/customer", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetCloudCustomer() (*CloudCustomer, *Response, error) { + r, err := c.DoApiGet(c.GetCloudRoute()+"/customer", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var cloudCustomer *CloudCustomer json.NewDecoder(r.Body).Decode(&cloudCustomer) - return cloudCustomer, BuildResponse(r) + return cloudCustomer, BuildResponse(r), nil } -func (c *Client4) GetSubscription() (*Subscription, *Response) { - r, appErr := c.DoApiGet(c.GetCloudRoute()+"/subscription", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetSubscription() (*Subscription, *Response, error) { + r, err := c.DoApiGet(c.GetCloudRoute()+"/subscription", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var subscription *Subscription json.NewDecoder(r.Body).Decode(&subscription) - return subscription, BuildResponse(r) + return subscription, BuildResponse(r), nil } -func (c *Client4) GetSubscriptionStats() (*SubscriptionStats, *Response) { - r, appErr := c.DoApiGet(c.GetCloudRoute()+"/subscription/stats", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetSubscriptionStats() (*SubscriptionStats, *Response, error) { + r, err := c.DoApiGet(c.GetCloudRoute()+"/subscription/stats", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var stats *SubscriptionStats json.NewDecoder(r.Body).Decode(&stats) - return stats, BuildResponse(r) + return stats, BuildResponse(r), nil } -func (c *Client4) GetInvoicesForSubscription() ([]*Invoice, *Response) { - r, appErr := c.DoApiGet(c.GetCloudRoute()+"/subscription/invoices", "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) GetInvoicesForSubscription() ([]*Invoice, *Response, error) { + r, err := c.DoApiGet(c.GetCloudRoute()+"/subscription/invoices", "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var invoices []*Invoice json.NewDecoder(r.Body).Decode(&invoices) - return invoices, BuildResponse(r) + return invoices, BuildResponse(r), nil } -func (c *Client4) UpdateCloudCustomer(customerInfo *CloudCustomerInfo) (*CloudCustomer, *Response) { +func (c *Client4) UpdateCloudCustomer(customerInfo *CloudCustomerInfo) (*CloudCustomer, *Response, error) { customerBytes, _ := json.Marshal(customerInfo) - r, appErr := c.doApiPutBytes(c.GetCloudRoute()+"/customer", customerBytes) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetCloudRoute()+"/customer", customerBytes) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var customer *CloudCustomer json.NewDecoder(r.Body).Decode(&customer) - return customer, BuildResponse(r) + return customer, BuildResponse(r), nil } -func (c *Client4) UpdateCloudCustomerAddress(address *Address) (*CloudCustomer, *Response) { +func (c *Client4) UpdateCloudCustomerAddress(address *Address) (*CloudCustomer, *Response, error) { addressBytes, _ := json.Marshal(address) - r, appErr := c.doApiPutBytes(c.GetCloudRoute()+"/customer/address", addressBytes) - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.doApiPutBytes(c.GetCloudRoute()+"/customer/address", addressBytes) + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var customer *CloudCustomer json.NewDecoder(r.Body).Decode(&customer) - return customer, BuildResponse(r) + return customer, BuildResponse(r), nil } -func (c *Client4) ListImports() ([]string, *Response) { +func (c *Client4) ListImports() ([]string, *Response, error) { r, err := c.DoApiGet(c.GetImportsRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) ListExports() ([]string, *Response) { +func (c *Client4) ListExports() ([]string, *Response, error) { r, err := c.DoApiGet(c.GetExportsRoute(), "") if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildResponse(r), err } defer closeBody(r) - return ArrayFromJson(r.Body), BuildResponse(r) + return ArrayFromJson(r.Body), BuildResponse(r), nil } -func (c *Client4) DeleteExport(name string) (bool, *Response) { +func (c *Client4) DeleteExport(name string) (*Response, error) { r, err := c.DoApiDelete(c.GetExportRoute(name)) if err != nil { - return false, BuildErrorResponse(r, err) + return BuildResponse(r), err } defer closeBody(r) - return CheckStatusOK(r), BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) DownloadExport(name string, wr io.Writer, offset int64) (int64, *Response) { +func (c *Client4) DownloadExport(name string, wr io.Writer, offset int64) (int64, *Response, error) { var headers map[string]string if offset > 0 { headers = map[string]string{ HeaderRange: fmt.Sprintf("bytes=%d-", offset), } } - r, appErr := c.DoApiRequestWithHeaders(http.MethodGet, c.ApiUrl+c.GetExportRoute(name), "", headers) - if appErr != nil { - return 0, BuildErrorResponse(r, appErr) + r, err := c.DoApiRequestWithHeaders(http.MethodGet, c.ApiUrl+c.GetExportRoute(name), "", headers) + if err != nil { + return 0, BuildResponse(r), err } defer closeBody(r) n, err := io.Copy(wr, r.Body) if err != nil { - return n, BuildErrorResponse(r, NewAppError("DownloadExport", "model.client.copy.app_error", nil, err.Error(), r.StatusCode)) + return n, BuildResponse(r), NewAppError("DownloadExport", "model.client.copy.app_error", nil, err.Error(), r.StatusCode) } - return n, BuildResponse(r) + return n, BuildResponse(r), nil } -func (c *Client4) GetUserThreads(userId, teamId string, options GetUserThreadsOpts) (*Threads, *Response) { +func (c *Client4) GetUserThreads(userId, teamId string, options GetUserThreadsOpts) (*Threads, *Response, error) { v := url.Values{} if options.Since != 0 { v.Set("since", fmt.Sprintf("%d", options.Since)) @@ -6672,130 +6629,130 @@ func (c *Client4) GetUserThreads(userId, teamId string, options GetUserThreadsOp url += "?" + v.Encode() } - r, appErr := c.DoApiGet(url, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var threads Threads json.NewDecoder(r.Body).Decode(&threads) - return &threads, BuildResponse(r) + return &threads, BuildResponse(r), nil } -func (c *Client4) GetUserThread(userId, teamId, threadId string, extended bool) (*ThreadResponse, *Response) { +func (c *Client4) GetUserThread(userId, teamId, threadId string, extended bool) (*ThreadResponse, *Response, error) { url := c.GetUserThreadRoute(userId, teamId, threadId) if extended { url += "?extended=true" } - r, appErr := c.DoApiGet(url, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var thread ThreadResponse json.NewDecoder(r.Body).Decode(&thread) - return &thread, BuildResponse(r) + return &thread, BuildResponse(r), nil } -func (c *Client4) UpdateThreadsReadForUser(userId, teamId string) *Response { - r, appErr := c.DoApiPut(fmt.Sprintf("%s/read", c.GetUserThreadsRoute(userId, teamId)), "") - if appErr != nil { - return BuildErrorResponse(r, appErr) +func (c *Client4) UpdateThreadsReadForUser(userId, teamId string) (*Response, error) { + r, err := c.DoApiPut(fmt.Sprintf("%s/read", c.GetUserThreadsRoute(userId, teamId)), "") + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) UpdateThreadReadForUser(userId, teamId, threadId string, timestamp int64) (*ThreadResponse, *Response) { - r, appErr := c.DoApiPut(fmt.Sprintf("%s/read/%d", c.GetUserThreadRoute(userId, teamId, threadId), timestamp), "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) +func (c *Client4) UpdateThreadReadForUser(userId, teamId, threadId string, timestamp int64) (*ThreadResponse, *Response, error) { + r, err := c.DoApiPut(fmt.Sprintf("%s/read/%d", c.GetUserThreadRoute(userId, teamId, threadId), timestamp), "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var thread ThreadResponse json.NewDecoder(r.Body).Decode(&thread) - return &thread, BuildResponse(r) + return &thread, BuildResponse(r), nil } -func (c *Client4) UpdateThreadFollowForUser(userId, teamId, threadId string, state bool) *Response { - var appErr *AppError +func (c *Client4) UpdateThreadFollowForUser(userId, teamId, threadId string, state bool) (*Response, error) { + var err error var r *http.Response if state { - r, appErr = c.DoApiPut(c.GetUserThreadRoute(userId, teamId, threadId)+"/following", "") + r, err = c.DoApiPut(c.GetUserThreadRoute(userId, teamId, threadId)+"/following", "") } else { - r, appErr = c.DoApiDelete(c.GetUserThreadRoute(userId, teamId, threadId) + "/following") + r, err = c.DoApiDelete(c.GetUserThreadRoute(userId, teamId, threadId) + "/following") } - if appErr != nil { - return BuildErrorResponse(r, appErr) + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) SendAdminUpgradeRequestEmail() *Response { - r, appErr := c.DoApiPost(c.GetCloudRoute()+"/subscription/limitreached/invite", "") - if appErr != nil { - return BuildErrorResponse(r, appErr) +func (c *Client4) SendAdminUpgradeRequestEmail() (*Response, error) { + r, err := c.DoApiPost(c.GetCloudRoute()+"/subscription/limitreached/invite", "") + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) SendAdminUpgradeRequestEmailOnJoin() *Response { - r, appErr := c.DoApiPost(c.GetCloudRoute()+"/subscription/limitreached/join", "") - if appErr != nil { - return BuildErrorResponse(r, appErr) +func (c *Client4) SendAdminUpgradeRequestEmailOnJoin() (*Response, error) { + r, err := c.DoApiPost(c.GetCloudRoute()+"/subscription/limitreached/join", "") + if err != nil { + return BuildResponse(r), err } defer closeBody(r) - return BuildResponse(r) + return BuildResponse(r), nil } -func (c *Client4) GetAllSharedChannels(teamID string, page, perPage int) ([]*SharedChannel, *Response) { +func (c *Client4) GetAllSharedChannels(teamID string, page, perPage int) ([]*SharedChannel, *Response, error) { url := fmt.Sprintf("%s/%s?page=%d&per_page=%d", c.GetSharedChannelsRoute(), teamID, page, perPage) - r, appErr := c.DoApiGet(url, "") - if appErr != nil { - return nil, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, "") + if err != nil { + return nil, BuildResponse(r), err } defer closeBody(r) var channels []*SharedChannel json.NewDecoder(r.Body).Decode(&channels) - return channels, BuildResponse(r) + return channels, BuildResponse(r), nil } -func (c *Client4) GetRemoteClusterInfo(remoteID string) (RemoteClusterInfo, *Response) { +func (c *Client4) GetRemoteClusterInfo(remoteID string) (RemoteClusterInfo, *Response, error) { url := fmt.Sprintf("%s/remote_info/%s", c.GetSharedChannelsRoute(), remoteID) - r, appErr := c.DoApiGet(url, "") - if appErr != nil { - return RemoteClusterInfo{}, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, "") + if err != nil { + return RemoteClusterInfo{}, BuildResponse(r), err } defer closeBody(r) var rci RemoteClusterInfo json.NewDecoder(r.Body).Decode(&rci) - return rci, BuildResponse(r) + return rci, BuildResponse(r), nil } -func (c *Client4) GetAncillaryPermissions(subsectionPermissions []string) ([]string, *Response) { +func (c *Client4) GetAncillaryPermissions(subsectionPermissions []string) ([]string, *Response, error) { var returnedPermissions []string url := fmt.Sprintf("%s/ancillary?subsection_permissions=%s", c.GetPermissionsRoute(), strings.Join(subsectionPermissions, ",")) - r, appErr := c.DoApiGet(url, "") - if appErr != nil { - return returnedPermissions, BuildErrorResponse(r, appErr) + r, err := c.DoApiGet(url, "") + if err != nil { + return returnedPermissions, BuildResponse(r), err } defer closeBody(r) json.NewDecoder(r.Body).Decode(&returnedPermissions) - return returnedPermissions, BuildResponse(r) + return returnedPermissions, BuildResponse(r), nil } diff --git a/model/client4_test.go b/model/client4_test.go index d1889bded5..d9597f3806 100644 --- a/model/client4_test.go +++ b/model/client4_test.go @@ -67,7 +67,8 @@ func TestClient4CreatePost(t *testing.T) { })) client := NewAPIv4Client(server.URL) - _, resp := client.CreatePost(post) + _, resp, err := client.CreatePost(post) + assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) } @@ -89,7 +90,8 @@ func TestClient4SetToken(t *testing.T) { client := NewAPIv4Client(server.URL) client.SetToken(expected) - _, resp := client.GetMe("") + _, resp, err := client.GetMe("") + assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) } @@ -111,6 +113,7 @@ func TestClient4MockSession(t *testing.T) { client := NewAPIv4Client(server.URL) client.MockSession(expected) - _, resp := client.GetMe("") + _, resp, err := client.GetMe("") + assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) } diff --git a/model/websocket_client.go b/model/websocket_client.go index 2132d47813..d1259231a0 100644 --- a/model/websocket_client.go +++ b/model/websocket_client.go @@ -59,13 +59,13 @@ type WebSocketClient struct { // NewWebSocketClient constructs a new WebSocket client with convenience // methods for talking to the server. -func NewWebSocketClient(url, authToken string) (*WebSocketClient, *AppError) { +func NewWebSocketClient(url, authToken string) (*WebSocketClient, error) { return NewWebSocketClientWithDialer(websocket.DefaultDialer, url, authToken) } // NewWebSocketClientWithDialer constructs a new WebSocket client with convenience // methods for talking to the server using a custom dialer. -func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken string) (*WebSocketClient, *AppError) { +func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken string) (*WebSocketClient, error) { conn, _, err := dialer.Dial(url+ApiUrlSuffix+"/websocket", nil) if err != nil { return nil, NewAppError("NewWebSocketClient", "model.websocket_client.connect_fail.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -97,13 +97,13 @@ func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken strin // NewWebSocketClient4 constructs a new WebSocket client with convenience // methods for talking to the server. Uses the v4 endpoint. -func NewWebSocketClient4(url, authToken string) (*WebSocketClient, *AppError) { +func NewWebSocketClient4(url, authToken string) (*WebSocketClient, error) { return NewWebSocketClient4WithDialer(websocket.DefaultDialer, url, authToken) } // NewWebSocketClient4WithDialer constructs a new WebSocket client with convenience // methods for talking to the server using a custom dialer. Uses the v4 endpoint. -func NewWebSocketClient4WithDialer(dialer *websocket.Dialer, url, authToken string) (*WebSocketClient, *AppError) { +func NewWebSocketClient4WithDialer(dialer *websocket.Dialer, url, authToken string) (*WebSocketClient, error) { return NewWebSocketClientWithDialer(dialer, url, authToken) } diff --git a/model/websocket_client_test.go b/model/websocket_client_test.go index 023a577179..28d5ffb7ee 100644 --- a/model/websocket_client_test.go +++ b/model/websocket_client_test.go @@ -46,7 +46,7 @@ func TestWebSocketRace(t *testing.T) { url := strings.Replace(s.URL, "http://", "ws://", 1) cli, err := NewWebSocketClient4(url, "authToken") - require.Nil(t, err) + require.NoError(t, err) cli.Listen() @@ -110,7 +110,7 @@ func TestWebSocketClose(t *testing.T) { t.Run("SuddenClose", func(t *testing.T) { cli, err := NewWebSocketClient4(url, "authToken") - require.Nil(t, err) + require.NoError(t, err) cli.Listen() @@ -132,7 +132,7 @@ func TestWebSocketClose(t *testing.T) { t.Run("ExplicitClose", func(t *testing.T) { cli, err := NewWebSocketClient4(url, "authToken") - require.Nil(t, err) + require.NoError(t, err) cli.Listen() diff --git a/web/oauth_test.go b/web/oauth_test.go index 5d8080deb2..de2309db0f 100644 --- a/web/oauth_test.go +++ b/web/oauth_test.go @@ -82,8 +82,8 @@ func TestAuthorizeOAuthApp(t *testing.T) { } // Test auth code flow - ruri, resp := ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + ruri, _, err := ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) require.NotEmpty(t, ruri, "redirect url should be set") @@ -94,8 +94,8 @@ func TestAuthorizeOAuthApp(t *testing.T) { // Test implicit flow authRequest.ResponseType = model.ImplicitResponseType - ruri, resp = ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + ruri, _, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) require.False(t, ruri == "", "redirect url should be set") ru, _ = url.Parse(ruri) @@ -107,44 +107,40 @@ func TestAuthorizeOAuthApp(t *testing.T) { oldToken := ApiClient.AuthToken ApiClient.AuthToken = values.Get("access_token") - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err := ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckForbiddenStatus(t, resp) ApiClient.AuthToken = oldToken authRequest.RedirectUri = "" - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckBadRequestStatus(t, resp) authRequest.RedirectUri = "http://somewhereelse.com" - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckBadRequestStatus(t, resp) authRequest.RedirectUri = rapp.CallbackUrls[0] authRequest.ResponseType = "" - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckBadRequestStatus(t, resp) authRequest.ResponseType = model.AuthCodeResponseType authRequest.ClientId = "" - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckBadRequestStatus(t, resp) authRequest.ClientId = model.NewId() - _, resp = ApiClient.AuthorizeOAuthApp(authRequest) + _, resp, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.Error(t, err) CheckNotFoundStatus(t, resp) } -func TestNilAuthorizeOAuthApp(t *testing.T) { - th := Setup(t).InitBasic() - th.Login(ApiClient, th.SystemAdminUser) - defer th.TearDown() - - _, resp := ApiClient.AuthorizeOAuthApp(nil) - require.NotNil(t, resp.Error) - assert.Equal(t, "api.context.invalid_body_param.app_error", resp.Error.Id) -} - func TestDeauthorizeOAuthApp(t *testing.T) { th := Setup(t).InitBasic() th.Login(ApiClient, th.SystemAdminUser) @@ -175,22 +171,22 @@ func TestDeauthorizeOAuthApp(t *testing.T) { State: "123", } - _, resp := ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + _, _, err := ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) - pass, resp := ApiClient.DeauthorizeOAuthApp(rapp.Id) - require.Nil(t, resp.Error) + _, err = ApiClient.DeauthorizeOAuthApp(rapp.Id) + require.NoError(t, err) - require.True(t, pass, "should have passed") - - _, resp = ApiClient.DeauthorizeOAuthApp("junk") + resp, err := ApiClient.DeauthorizeOAuthApp("junk") + require.Error(t, err) CheckBadRequestStatus(t, resp) - _, resp = ApiClient.DeauthorizeOAuthApp(model.NewId()) - require.Nil(t, resp.Error) + _, err = ApiClient.DeauthorizeOAuthApp(model.NewId()) + require.NoError(t, err) th.Logout(ApiClient) - _, resp = ApiClient.DeauthorizeOAuthApp(rapp.Id) + resp, err = ApiClient.DeauthorizeOAuthApp(rapp.Id) + require.Error(t, err) CheckUnauthorizedStatus(t, resp) } @@ -229,8 +225,8 @@ func TestOAuthAccessToken(t *testing.T) { th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = false }) data := url.Values{"grant_type": []string{"junk"}, "client_id": []string{"12345678901234567890123456"}, "client_secret": []string{"12345678901234567890123456"}, "code": []string{"junk"}, "redirect_uri": []string{oauthApp.CallbackUrls[0]}} - _, resp := ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - oauth providing turned off - response status code: %v", resp.StatusCode) + _, _, err := ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - oauth providing turned off") th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOAuthServiceProvider = true }) authRequest := &model.AuthorizeRequest{ @@ -241,48 +237,48 @@ func TestOAuthAccessToken(t *testing.T) { State: "123", } - redirect, resp := ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err := ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ := url.Parse(redirect) ApiClient.Logout() data = url.Values{"grant_type": []string{"junk"}, "client_id": []string{oauthApp.Id}, "client_secret": []string{oauthApp.ClientSecret}, "code": []string{rurl.Query().Get("code")}, "redirect_uri": []string{oauthApp.CallbackUrls[0]}} - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - bad grant type") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - bad grant type") data.Set("grant_type", model.AccessTokenGrantType) data.Set("client_id", "") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - missing client id") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - missing client id") data.Set("client_id", "junk") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - bad client id") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - bad client id") data.Set("client_id", oauthApp.Id) data.Set("client_secret", "") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - missing client secret") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - missing client secret") data.Set("client_secret", "junk") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - bad client secret") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - bad client secret") data.Set("client_secret", oauthApp.ClientSecret) data.Set("code", "") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - missing code") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - missing code") data.Set("code", "junk") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - bad code") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - bad code") data.Set("code", rurl.Query().Get("code")) data.Set("redirect_uri", "junk") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - non-matching redirect uri") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - non-matching redirect uri") // reset data for successful request data.Set("grant_type", model.AccessTokenGrantType) @@ -293,30 +289,30 @@ func TestOAuthAccessToken(t *testing.T) { token := "" refreshToken := "" - rsp, resp := ApiClient.GetOAuthAccessToken(data) - require.Nil(t, resp.Error) + rsp, _, err := ApiClient.GetOAuthAccessToken(data) + require.NoError(t, err) require.NotEmpty(t, rsp.AccessToken, "access token not returned") require.NotEmpty(t, rsp.RefreshToken, "refresh token not returned") token, refreshToken = rsp.AccessToken, rsp.RefreshToken require.Equal(t, rsp.TokenType, model.AccessTokenType, "access token type incorrect") - _, err := ApiClient.DoApiGet("/oauth_test", "") - require.Nil(t, err) + _, err = ApiClient.DoApiGet("/oauth_test", "") + require.NoError(t, err) ApiClient.SetOAuthToken("") _, err = ApiClient.DoApiGet("/oauth_test", "") - require.NotNil(t, err, "should have failed - no access token provided") + require.Error(t, err, "should have failed - no access token provided") ApiClient.SetOAuthToken("badtoken") _, err = ApiClient.DoApiGet("/oauth_test", "") - require.NotNil(t, err, "should have failed - bad token provided") + require.Error(t, err, "should have failed - bad token provided") ApiClient.SetOAuthToken(token) _, err = ApiClient.DoApiGet("/oauth_test", "") - require.Nil(t, err) + require.NoError(t, err) - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "should have failed - tried to reuse auth code") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "should have failed - tried to reuse auth code") data.Set("grant_type", model.RefreshTokenGrantType) data.Set("client_id", oauthApp.Id) @@ -324,12 +320,12 @@ func TestOAuthAccessToken(t *testing.T) { data.Set("refresh_token", "") data.Set("redirect_uri", oauthApp.CallbackUrls[0]) data.Del("code") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "Should have failed - refresh token empty") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "Should have failed - refresh token empty") data.Set("refresh_token", refreshToken) - rsp, resp = ApiClient.GetOAuthAccessToken(data) - require.Nil(t, resp.Error) + rsp, _, err = ApiClient.GetOAuthAccessToken(data) + require.NoError(t, err) require.NotEmpty(t, rsp.AccessToken, "access token not returned") require.NotEmpty(t, rsp.RefreshToken, "refresh token not returned") require.NotEqual(t, rsp.RefreshToken, refreshToken, "refresh token did not update") @@ -337,11 +333,11 @@ func TestOAuthAccessToken(t *testing.T) { ApiClient.SetOAuthToken(rsp.AccessToken) _, err = ApiClient.DoApiGet("/oauth_test", "") - require.Nil(t, err) + require.NoError(t, err) data.Set("refresh_token", rsp.RefreshToken) - rsp, resp = ApiClient.GetOAuthAccessToken(data) - require.Nil(t, resp.Error) + rsp, _, err = ApiClient.GetOAuthAccessToken(data) + require.NoError(t, err) require.NotEmpty(t, rsp.AccessToken, "access token not returned") require.NotEmpty(t, rsp.RefreshToken, "refresh token not returned") require.NotEqual(t, rsp.RefreshToken, refreshToken, "refresh token did not update") @@ -349,11 +345,11 @@ func TestOAuthAccessToken(t *testing.T) { ApiClient.SetOAuthToken(rsp.AccessToken) _, err = ApiClient.DoApiGet("/oauth_test", "") - require.Nil(t, err) + require.NoError(t, err) authData := &model.AuthData{ClientId: oauthApp.Id, RedirectUri: oauthApp.CallbackUrls[0], UserId: th.BasicUser.Id, Code: model.NewId(), ExpiresIn: -1} - _, nErr := th.App.Srv().Store.OAuth().SaveAuthData(authData) - require.NoError(t, nErr) + _, err = th.App.Srv().Store.OAuth().SaveAuthData(authData) + require.NoError(t, err) data.Set("grant_type", model.AccessTokenGrantType) data.Set("client_id", oauthApp.Id) @@ -361,8 +357,8 @@ func TestOAuthAccessToken(t *testing.T) { data.Set("redirect_uri", oauthApp.CallbackUrls[0]) data.Set("code", authData.Code) data.Del("refresh_token") - _, resp = ApiClient.GetOAuthAccessToken(data) - require.NotNil(t, resp.Error, "Should have failed - code is expired") + _, _, err = ApiClient.GetOAuthAccessToken(data) + require.Error(t, err, "Should have failed - code is expired") ApiClient.ClearOAuthToken() } @@ -440,12 +436,12 @@ func TestOAuthComplete(t *testing.T) { }() r, err := HTTPGet(ApiClient.Url+"/login/gitlab/complete?code=123", ApiClient.HTTPClient, "", true) - assert.NotNil(t, err) + assert.Error(t, err) closeBody(r) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GitLabSettings.Enable = true }) r, err = HTTPGet(ApiClient.Url+"/login/gitlab/complete?code=123&state=!#$#F@#Yˆ&~ñ", ApiClient.HTTPClient, "", true) - assert.NotNil(t, err) + assert.Error(t, err) closeBody(r) th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GitLabSettings.AuthEndpoint = ApiClient.Url + "/oauth/authorize" }) @@ -458,13 +454,13 @@ func TestOAuthComplete(t *testing.T) { state := base64.StdEncoding.EncodeToString([]byte(model.MapToJson(stateProps))) r, err = HTTPGet(ApiClient.Url+"/login/gitlab/complete?code=123&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", true) - assert.NotNil(t, err) + assert.Error(t, err) closeBody(r) stateProps["hash"] = utils.HashSha256(*th.App.Config().GitLabSettings.Id) state = base64.StdEncoding.EncodeToString([]byte(model.MapToJson(stateProps))) r, err = HTTPGet(ApiClient.Url+"/login/gitlab/complete?code=123&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", true) - assert.NotNil(t, err) + assert.Error(t, err) closeBody(r) // We are going to use mattermost as the provider emulating gitlab @@ -507,8 +503,8 @@ func TestOAuthComplete(t *testing.T) { State: "123", } - redirect, resp := ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err := ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ := url.Parse(redirect) code := rurl.Query().Get("code") @@ -525,8 +521,8 @@ func TestOAuthComplete(t *testing.T) { einterfaces.RegisterOAuthProvider(model.ServiceGitlab, provider) - redirect, resp = ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ = url.Parse(redirect) code = rurl.Query().Get("code") @@ -539,30 +535,30 @@ func TestOAuthComplete(t *testing.T) { th.BasicUser.Id, model.ServiceGitlab, &th.BasicUser.Email, th.BasicUser.Email, true) require.NoError(t, nErr) - redirect, resp = ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ = url.Parse(redirect) code = rurl.Query().Get("code") stateProps["action"] = model.OAuthActionLogin state = base64.StdEncoding.EncodeToString([]byte(model.MapToJson(stateProps))) - if r, err := HTTPGet(ApiClient.Url+"/login/"+model.ServiceGitlab+"/complete?code="+url.QueryEscape(code)+"&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", false); err == nil { + if r, err = HTTPGet(ApiClient.Url+"/login/"+model.ServiceGitlab+"/complete?code="+url.QueryEscape(code)+"&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", false); err == nil { closeBody(r) } - redirect, resp = ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ = url.Parse(redirect) code = rurl.Query().Get("code") delete(stateProps, "action") state = base64.StdEncoding.EncodeToString([]byte(model.MapToJson(stateProps))) - if r, err := HTTPGet(ApiClient.Url+"/login/"+model.ServiceGitlab+"/complete?code="+url.QueryEscape(code)+"&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", false); err == nil { + if r, err = HTTPGet(ApiClient.Url+"/login/"+model.ServiceGitlab+"/complete?code="+url.QueryEscape(code)+"&state="+url.QueryEscape(state), ApiClient.HTTPClient, "", false); err == nil { closeBody(r) } - redirect, resp = ApiClient.AuthorizeOAuthApp(authRequest) - require.Nil(t, resp.Error) + redirect, _, err = ApiClient.AuthorizeOAuthApp(authRequest) + require.NoError(t, err) rurl, _ = url.Parse(redirect) code = rurl.Query().Get("code") @@ -612,7 +608,7 @@ func TestOAuthComplete_ErrorMessages(t *testing.T) { assert.Contains(t, responseWriter.Body.String(), "") } -func HTTPGet(url string, httpClient *http.Client, authToken string, followRedirect bool) (*http.Response, *model.AppError) { +func HTTPGet(url string, httpClient *http.Client, authToken string, followRedirect bool) (*http.Response, error) { rq, _ := http.NewRequest("GET", url, nil) rq.Close = true @@ -627,7 +623,7 @@ func HTTPGet(url string, httpClient *http.Client, authToken string, followRedire } if rp, err := httpClient.Do(rq); err != nil { - return nil, model.NewAppError(url, "model.client.connecting.app_error", nil, err.Error(), 0) + return nil, err } else if rp.StatusCode == 304 { return rp, nil } else if rp.StatusCode == 307 { @@ -675,11 +671,9 @@ func GenerateTestAppName() string { func checkHTTPStatus(t *testing.T, resp *model.Response, expectedStatus int) { t.Helper() - require.NotNil(t, resp, "Unexpected nil response, expected http:%v, expectError:%v)", expectedStatus, true) + require.NotNilf(t, resp, "Unexpected nil response, expected http status:%v", expectedStatus) - require.NotNil(t, resp.Error, "Expected a non-nil error and http status:%v, got nil, %v", expectedStatus, resp.StatusCode) - - require.Equal(t, resp.StatusCode, expectedStatus, "Expected http status:%v, got %v (err: %q)", expectedStatus, resp.StatusCode, resp.Error) + require.Equalf(t, expectedStatus, resp.StatusCode, "Expected http status:%v, got %v", expectedStatus, resp.StatusCode) } func CheckForbiddenStatus(t *testing.T, resp *model.Response) {