github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/api4/apitestlib.go (about)

     1  // Copyright (c) 2017-present Xenia, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"net"
    10  	"net/http"
    11  	"os"
    12  	"path/filepath"
    13  	"reflect"
    14  	"strconv"
    15  	"strings"
    16  	"testing"
    17  	"time"
    18  
    19  	"github.com/xzl8028/xenia-server/app"
    20  	"github.com/xzl8028/xenia-server/config"
    21  	"github.com/xzl8028/xenia-server/mlog"
    22  	"github.com/xzl8028/xenia-server/model"
    23  	"github.com/xzl8028/xenia-server/store"
    24  	"github.com/xzl8028/xenia-server/utils"
    25  	"github.com/xzl8028/xenia-server/web"
    26  	"github.com/xzl8028/xenia-server/wsapi"
    27  
    28  	s3 "github.com/minio/minio-go"
    29  	"github.com/minio/minio-go/pkg/credentials"
    30  )
    31  
    32  type TestHelper struct {
    33  	App         *app.App
    34  	Server      *app.Server
    35  	ConfigStore config.Store
    36  
    37  	Client              *model.Client4
    38  	BasicUser           *model.User
    39  	BasicUser2          *model.User
    40  	TeamAdminUser       *model.User
    41  	BasicTeam           *model.Team
    42  	BasicChannel        *model.Channel
    43  	BasicPrivateChannel *model.Channel
    44  	BasicDeletedChannel *model.Channel
    45  	BasicChannel2       *model.Channel
    46  	BasicPost           *model.Post
    47  	Group               *model.Group
    48  
    49  	SystemAdminClient *model.Client4
    50  	SystemAdminUser   *model.User
    51  	tempWorkspace     string
    52  }
    53  
    54  // testStore tracks the active test store.
    55  // This is a bridge between the new testlib ownership of the test store and the existing usage
    56  // of the api4 test helper by many packages. In the future, this test helper would ideally belong
    57  // to the testlib altogether.
    58  var testStore store.Store
    59  
    60  func UseTestStore(store store.Store) {
    61  	testStore = store
    62  }
    63  
    64  func setupTestHelper(enterprise bool, updateConfig func(*model.Config)) *TestHelper {
    65  	testStore.DropAllTables()
    66  
    67  	memoryStore, err := config.NewMemoryStore()
    68  	if err != nil {
    69  		panic("failed to initialize memory store: " + err.Error())
    70  	}
    71  
    72  	var options []app.Option
    73  	options = append(options, app.ConfigStore(memoryStore))
    74  	options = append(options, app.StoreOverride(testStore))
    75  
    76  	s, err := app.NewServer(options...)
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  
    81  	th := &TestHelper{
    82  		App:         s.FakeApp(),
    83  		Server:      s,
    84  		ConfigStore: memoryStore,
    85  	}
    86  
    87  	th.App.UpdateConfig(func(cfg *model.Config) {
    88  		*cfg.TeamSettings.MaxUsersPerTeam = 50
    89  		*cfg.RateLimitSettings.Enable = false
    90  		*cfg.EmailSettings.SendEmailNotifications = true
    91  	})
    92  	prevListenAddress := *th.App.Config().ServiceSettings.ListenAddress
    93  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" })
    94  	if updateConfig != nil {
    95  		th.App.UpdateConfig(updateConfig)
    96  	}
    97  	serverErr := th.Server.Start()
    98  	if serverErr != nil {
    99  		panic(serverErr)
   100  	}
   101  
   102  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress })
   103  	Init(th.Server, th.Server.AppOptions, th.App.Srv.Router)
   104  	web.New(th.Server, th.Server.AppOptions, th.App.Srv.Router)
   105  	wsapi.Init(th.App, th.App.Srv.WebSocketRouter)
   106  	th.App.Srv.Store.MarkSystemRanUnitTests()
   107  	th.App.DoAppMigrations()
   108  
   109  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = true })
   110  
   111  	// Disable strict password requirements for test
   112  	th.App.UpdateConfig(func(cfg *model.Config) {
   113  		*cfg.PasswordSettings.MinimumLength = 5
   114  		*cfg.PasswordSettings.Lowercase = false
   115  		*cfg.PasswordSettings.Uppercase = false
   116  		*cfg.PasswordSettings.Symbol = false
   117  		*cfg.PasswordSettings.Number = false
   118  	})
   119  
   120  	if enterprise {
   121  		th.App.SetLicense(model.NewTestLicense())
   122  	} else {
   123  		th.App.SetLicense(nil)
   124  	}
   125  
   126  	th.Client = th.CreateClient()
   127  	th.SystemAdminClient = th.CreateClient()
   128  
   129  	if th.tempWorkspace == "" {
   130  		dir, err := ioutil.TempDir("", "apptest")
   131  		if err != nil {
   132  			panic(err)
   133  		}
   134  		th.tempWorkspace = dir
   135  	}
   136  
   137  	pluginDir := filepath.Join(th.tempWorkspace, "plugins")
   138  	webappDir := filepath.Join(th.tempWorkspace, "webapp")
   139  
   140  	th.App.UpdateConfig(func(cfg *model.Config) {
   141  		*cfg.PluginSettings.Directory = pluginDir
   142  		*cfg.PluginSettings.ClientDirectory = webappDir
   143  	})
   144  
   145  	th.App.InitPlugins(pluginDir, webappDir)
   146  
   147  	return th
   148  }
   149  
   150  func SetupEnterprise() *TestHelper {
   151  	return setupTestHelper(true, nil)
   152  }
   153  
   154  func Setup() *TestHelper {
   155  	return setupTestHelper(false, nil)
   156  }
   157  
   158  func SetupConfig(updateConfig func(cfg *model.Config)) *TestHelper {
   159  	return setupTestHelper(false, updateConfig)
   160  }
   161  
   162  func (me *TestHelper) ShutdownApp() {
   163  	done := make(chan bool)
   164  	go func() {
   165  		me.Server.Shutdown()
   166  		close(done)
   167  	}()
   168  
   169  	select {
   170  	case <-done:
   171  	case <-time.After(30 * time.Second):
   172  		// panic instead of t.Fatal to terminate all tests in this package, otherwise the
   173  		// still running App could spuriously fail subsequent tests.
   174  		panic("failed to shutdown App within 30 seconds")
   175  	}
   176  }
   177  
   178  func (me *TestHelper) TearDown() {
   179  	utils.DisableDebugLogForTest()
   180  
   181  	me.ShutdownApp()
   182  
   183  	utils.EnableDebugLogForTest()
   184  
   185  	if err := recover(); err != nil {
   186  		panic(err)
   187  	}
   188  }
   189  
   190  func (me *TestHelper) InitBasic() *TestHelper {
   191  	me.waitForConnectivity()
   192  
   193  	me.SystemAdminUser = me.CreateUser()
   194  	me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false)
   195  	me.LoginSystemAdmin()
   196  
   197  	me.TeamAdminUser = me.CreateUser()
   198  	me.App.UpdateUserRoles(me.TeamAdminUser.Id, model.SYSTEM_USER_ROLE_ID, false)
   199  	me.LoginTeamAdmin()
   200  
   201  	me.BasicTeam = me.CreateTeam()
   202  	me.BasicChannel = me.CreatePublicChannel()
   203  	me.BasicPrivateChannel = me.CreatePrivateChannel()
   204  	me.BasicDeletedChannel = me.CreatePublicChannel()
   205  	me.BasicChannel2 = me.CreatePublicChannel()
   206  	me.BasicPost = me.CreatePost()
   207  	me.BasicUser = me.CreateUser()
   208  	me.LinkUserToTeam(me.BasicUser, me.BasicTeam)
   209  	me.BasicUser2 = me.CreateUser()
   210  	me.LinkUserToTeam(me.BasicUser2, me.BasicTeam)
   211  	me.App.AddUserToChannel(me.BasicUser, me.BasicChannel)
   212  	me.App.AddUserToChannel(me.BasicUser2, me.BasicChannel)
   213  	me.App.AddUserToChannel(me.BasicUser, me.BasicChannel2)
   214  	me.App.AddUserToChannel(me.BasicUser2, me.BasicChannel2)
   215  	me.App.AddUserToChannel(me.BasicUser, me.BasicPrivateChannel)
   216  	me.App.AddUserToChannel(me.BasicUser2, me.BasicPrivateChannel)
   217  	me.App.AddUserToChannel(me.BasicUser, me.BasicDeletedChannel)
   218  	me.App.AddUserToChannel(me.BasicUser2, me.BasicDeletedChannel)
   219  	me.App.UpdateUserRoles(me.BasicUser.Id, model.SYSTEM_USER_ROLE_ID, false)
   220  	me.Client.DeleteChannel(me.BasicDeletedChannel.Id)
   221  	me.LoginBasic()
   222  	me.Group = me.CreateGroup()
   223  
   224  	return me
   225  }
   226  
   227  func (me *TestHelper) waitForConnectivity() {
   228  	for i := 0; i < 1000; i++ {
   229  		conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%v", me.App.Srv.ListenAddr.Port))
   230  		if err == nil {
   231  			conn.Close()
   232  			return
   233  		}
   234  		time.Sleep(time.Millisecond * 20)
   235  	}
   236  	panic("unable to connect")
   237  }
   238  
   239  func (me *TestHelper) CreateClient() *model.Client4 {
   240  	return model.NewAPIv4Client(fmt.Sprintf("http://localhost:%v", me.App.Srv.ListenAddr.Port))
   241  }
   242  
   243  func (me *TestHelper) CreateWebSocketClient() (*model.WebSocketClient, *model.AppError) {
   244  	return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", me.App.Srv.ListenAddr.Port), me.Client.AuthToken)
   245  }
   246  
   247  func (me *TestHelper) CreateWebSocketSystemAdminClient() (*model.WebSocketClient, *model.AppError) {
   248  	return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", me.App.Srv.ListenAddr.Port), me.SystemAdminClient.AuthToken)
   249  }
   250  
   251  func (me *TestHelper) CreateUser() *model.User {
   252  	return me.CreateUserWithClient(me.Client)
   253  }
   254  
   255  func (me *TestHelper) CreateTeam() *model.Team {
   256  	return me.CreateTeamWithClient(me.Client)
   257  }
   258  
   259  func (me *TestHelper) CreateTeamWithClient(client *model.Client4) *model.Team {
   260  	id := model.NewId()
   261  	team := &model.Team{
   262  		DisplayName: "dn_" + id,
   263  		Name:        GenerateTestTeamName(),
   264  		Email:       me.GenerateTestEmail(),
   265  		Type:        model.TEAM_OPEN,
   266  	}
   267  
   268  	utils.DisableDebugLogForTest()
   269  	rteam, resp := client.CreateTeam(team)
   270  	if resp.Error != nil {
   271  		panic(resp.Error)
   272  	}
   273  	utils.EnableDebugLogForTest()
   274  	return rteam
   275  }
   276  
   277  func (me *TestHelper) CreateUserWithClient(client *model.Client4) *model.User {
   278  	id := model.NewId()
   279  
   280  	user := &model.User{
   281  		Email:     me.GenerateTestEmail(),
   282  		Username:  GenerateTestUsername(),
   283  		Nickname:  "nn_" + id,
   284  		FirstName: "f_" + id,
   285  		LastName:  "l_" + id,
   286  		Password:  "Pa$$word11",
   287  	}
   288  
   289  	utils.DisableDebugLogForTest()
   290  	ruser, response := client.CreateUser(user)
   291  	if response.Error != nil {
   292  		panic(response.Error)
   293  	}
   294  
   295  	ruser.Password = "Pa$$word11"
   296  	_, err := me.App.Srv.Store.User().VerifyEmail(ruser.Id, ruser.Email)
   297  	if err != nil {
   298  		return nil
   299  	}
   300  	utils.EnableDebugLogForTest()
   301  	return ruser
   302  }
   303  
   304  func (me *TestHelper) CreatePublicChannel() *model.Channel {
   305  	return me.CreateChannelWithClient(me.Client, model.CHANNEL_OPEN)
   306  }
   307  
   308  func (me *TestHelper) CreatePrivateChannel() *model.Channel {
   309  	return me.CreateChannelWithClient(me.Client, model.CHANNEL_PRIVATE)
   310  }
   311  
   312  func (me *TestHelper) CreateChannelWithClient(client *model.Client4, channelType string) *model.Channel {
   313  	return me.CreateChannelWithClientAndTeam(client, channelType, me.BasicTeam.Id)
   314  }
   315  
   316  func (me *TestHelper) CreateChannelWithClientAndTeam(client *model.Client4, channelType string, teamId string) *model.Channel {
   317  	id := model.NewId()
   318  
   319  	channel := &model.Channel{
   320  		DisplayName: "dn_" + id,
   321  		Name:        GenerateTestChannelName(),
   322  		Type:        channelType,
   323  		TeamId:      teamId,
   324  	}
   325  
   326  	utils.DisableDebugLogForTest()
   327  	rchannel, resp := client.CreateChannel(channel)
   328  	if resp.Error != nil {
   329  		panic(resp.Error)
   330  	}
   331  	utils.EnableDebugLogForTest()
   332  	return rchannel
   333  }
   334  
   335  func (me *TestHelper) CreatePost() *model.Post {
   336  	return me.CreatePostWithClient(me.Client, me.BasicChannel)
   337  }
   338  
   339  func (me *TestHelper) CreatePinnedPost() *model.Post {
   340  	return me.CreatePinnedPostWithClient(me.Client, me.BasicChannel)
   341  }
   342  
   343  func (me *TestHelper) CreateMessagePost(message string) *model.Post {
   344  	return me.CreateMessagePostWithClient(me.Client, me.BasicChannel, message)
   345  }
   346  
   347  func (me *TestHelper) CreatePostWithClient(client *model.Client4, channel *model.Channel) *model.Post {
   348  	id := model.NewId()
   349  
   350  	post := &model.Post{
   351  		ChannelId: channel.Id,
   352  		Message:   "message_" + id,
   353  	}
   354  
   355  	utils.DisableDebugLogForTest()
   356  	rpost, resp := client.CreatePost(post)
   357  	if resp.Error != nil {
   358  		panic(resp.Error)
   359  	}
   360  	utils.EnableDebugLogForTest()
   361  	return rpost
   362  }
   363  
   364  func (me *TestHelper) CreatePinnedPostWithClient(client *model.Client4, channel *model.Channel) *model.Post {
   365  	id := model.NewId()
   366  
   367  	post := &model.Post{
   368  		ChannelId: channel.Id,
   369  		Message:   "message_" + id,
   370  		IsPinned:  true,
   371  	}
   372  
   373  	utils.DisableDebugLogForTest()
   374  	rpost, resp := client.CreatePost(post)
   375  	if resp.Error != nil {
   376  		panic(resp.Error)
   377  	}
   378  	utils.EnableDebugLogForTest()
   379  	return rpost
   380  }
   381  
   382  func (me *TestHelper) CreateMessagePostWithClient(client *model.Client4, channel *model.Channel, message string) *model.Post {
   383  	post := &model.Post{
   384  		ChannelId: channel.Id,
   385  		Message:   message,
   386  	}
   387  
   388  	utils.DisableDebugLogForTest()
   389  	rpost, resp := client.CreatePost(post)
   390  	if resp.Error != nil {
   391  		panic(resp.Error)
   392  	}
   393  	utils.EnableDebugLogForTest()
   394  	return rpost
   395  }
   396  
   397  func (me *TestHelper) CreateMessagePostNoClient(channel *model.Channel, message string, createAtTime int64) *model.Post {
   398  	post, err := me.App.Srv.Store.Post().Save(&model.Post{
   399  		UserId:    me.BasicUser.Id,
   400  		ChannelId: channel.Id,
   401  		Message:   message,
   402  		CreateAt:  createAtTime,
   403  	})
   404  
   405  	if err != nil {
   406  		panic(err)
   407  	}
   408  
   409  	return post
   410  }
   411  
   412  func (me *TestHelper) CreateDmChannel(user *model.User) *model.Channel {
   413  	utils.DisableDebugLogForTest()
   414  	var err *model.AppError
   415  	var channel *model.Channel
   416  	if channel, err = me.App.GetOrCreateDirectChannel(me.BasicUser.Id, user.Id); err != nil {
   417  		mlog.Error(err.Error())
   418  
   419  		time.Sleep(time.Second)
   420  		panic(err)
   421  	}
   422  	utils.EnableDebugLogForTest()
   423  	return channel
   424  }
   425  
   426  func (me *TestHelper) LoginBasic() {
   427  	me.LoginBasicWithClient(me.Client)
   428  }
   429  
   430  func (me *TestHelper) LoginBasic2() {
   431  	me.LoginBasic2WithClient(me.Client)
   432  }
   433  
   434  func (me *TestHelper) LoginTeamAdmin() {
   435  	me.LoginTeamAdminWithClient(me.Client)
   436  }
   437  
   438  func (me *TestHelper) LoginSystemAdmin() {
   439  	me.LoginSystemAdminWithClient(me.SystemAdminClient)
   440  }
   441  
   442  func (me *TestHelper) LoginBasicWithClient(client *model.Client4) {
   443  	utils.DisableDebugLogForTest()
   444  	_, resp := client.Login(me.BasicUser.Email, me.BasicUser.Password)
   445  	if resp.Error != nil {
   446  		panic(resp.Error)
   447  	}
   448  	utils.EnableDebugLogForTest()
   449  }
   450  
   451  func (me *TestHelper) LoginBasic2WithClient(client *model.Client4) {
   452  	utils.DisableDebugLogForTest()
   453  	_, resp := client.Login(me.BasicUser2.Email, me.BasicUser2.Password)
   454  	if resp.Error != nil {
   455  		panic(resp.Error)
   456  	}
   457  	utils.EnableDebugLogForTest()
   458  }
   459  
   460  func (me *TestHelper) LoginTeamAdminWithClient(client *model.Client4) {
   461  	utils.DisableDebugLogForTest()
   462  	_, resp := client.Login(me.TeamAdminUser.Email, me.TeamAdminUser.Password)
   463  	if resp.Error != nil {
   464  		panic(resp.Error)
   465  	}
   466  	utils.EnableDebugLogForTest()
   467  }
   468  
   469  func (me *TestHelper) LoginSystemAdminWithClient(client *model.Client4) {
   470  	utils.DisableDebugLogForTest()
   471  	_, resp := client.Login(me.SystemAdminUser.Email, me.SystemAdminUser.Password)
   472  	if resp.Error != nil {
   473  		panic(resp.Error)
   474  	}
   475  	utils.EnableDebugLogForTest()
   476  }
   477  
   478  func (me *TestHelper) UpdateActiveUser(user *model.User, active bool) {
   479  	utils.DisableDebugLogForTest()
   480  
   481  	_, err := me.App.UpdateActive(user, active)
   482  	if err != nil {
   483  		mlog.Error(err.Error())
   484  
   485  		time.Sleep(time.Second)
   486  		panic(err)
   487  	}
   488  
   489  	utils.EnableDebugLogForTest()
   490  }
   491  
   492  func (me *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
   493  	utils.DisableDebugLogForTest()
   494  
   495  	err := me.App.JoinUserToTeam(team, user, "")
   496  	if err != nil {
   497  		mlog.Error(err.Error())
   498  
   499  		time.Sleep(time.Second)
   500  		panic(err)
   501  	}
   502  
   503  	utils.EnableDebugLogForTest()
   504  }
   505  
   506  func (me *TestHelper) AddUserToChannel(user *model.User, channel *model.Channel) *model.ChannelMember {
   507  	utils.DisableDebugLogForTest()
   508  
   509  	member, err := me.App.AddUserToChannel(user, channel)
   510  	if err != nil {
   511  		mlog.Error(err.Error())
   512  
   513  		time.Sleep(time.Second)
   514  		panic(err)
   515  	}
   516  
   517  	utils.EnableDebugLogForTest()
   518  
   519  	return member
   520  }
   521  
   522  func (me *TestHelper) GenerateTestEmail() string {
   523  	if *me.App.Config().EmailSettings.SMTPServer != "dockerhost" && os.Getenv("CI_INBUCKET_PORT") == "" {
   524  		return strings.ToLower("success+" + model.NewId() + "@simulator.amazonses.com")
   525  	}
   526  	return strings.ToLower(model.NewId() + "@dockerhost")
   527  }
   528  
   529  func (me *TestHelper) CreateGroup() *model.Group {
   530  	id := model.NewId()
   531  	group := &model.Group{
   532  		Name:        "n-" + id,
   533  		DisplayName: "dn_" + id,
   534  		Source:      model.GroupSourceLdap,
   535  		RemoteId:    "ri_" + id,
   536  	}
   537  
   538  	utils.DisableDebugLogForTest()
   539  	group, err := me.App.CreateGroup(group)
   540  	if err != nil {
   541  		panic(err)
   542  	}
   543  	utils.EnableDebugLogForTest()
   544  	return group
   545  }
   546  
   547  func GenerateTestUsername() string {
   548  	return "fakeuser" + model.NewRandomString(10)
   549  }
   550  
   551  func GenerateTestTeamName() string {
   552  	return "faketeam" + model.NewRandomString(6)
   553  }
   554  
   555  func GenerateTestChannelName() string {
   556  	return "fakechannel" + model.NewRandomString(10)
   557  }
   558  
   559  func GenerateTestAppName() string {
   560  	return "fakeoauthapp" + model.NewRandomString(10)
   561  }
   562  
   563  func GenerateTestId() string {
   564  	return model.NewId()
   565  }
   566  
   567  func CheckUserSanitization(t *testing.T, user *model.User) {
   568  	t.Helper()
   569  
   570  	if user.Password != "" {
   571  		t.Fatal("password wasn't blank")
   572  	}
   573  
   574  	if user.AuthData != nil && *user.AuthData != "" {
   575  		t.Fatal("auth data wasn't blank")
   576  	}
   577  
   578  	if user.MfaSecret != "" {
   579  		t.Fatal("mfa secret wasn't blank")
   580  	}
   581  }
   582  
   583  func CheckEtag(t *testing.T, data interface{}, resp *model.Response) {
   584  	t.Helper()
   585  
   586  	if !reflect.ValueOf(data).IsNil() {
   587  		t.Fatal("etag data was not nil")
   588  	}
   589  
   590  	if resp.StatusCode != http.StatusNotModified {
   591  		t.Log("actual: " + strconv.Itoa(resp.StatusCode))
   592  		t.Log("expected: " + strconv.Itoa(http.StatusNotModified))
   593  		t.Fatal("wrong status code for etag")
   594  	}
   595  }
   596  
   597  func CheckNoError(t *testing.T, resp *model.Response) {
   598  	t.Helper()
   599  
   600  	if resp.Error != nil {
   601  		t.Fatalf("Expected no error, got %q", resp.Error.Error())
   602  	}
   603  }
   604  
   605  func checkHTTPStatus(t *testing.T, resp *model.Response, expectedStatus int, expectError bool) {
   606  	t.Helper()
   607  
   608  	switch {
   609  	case resp == nil:
   610  		t.Fatalf("Unexpected nil response, expected http:%v, expectError:%v)", expectedStatus, expectError)
   611  
   612  	case expectError && resp.Error == nil:
   613  		t.Fatalf("Expected a non-nil error and http status:%v, got nil, %v", expectedStatus, resp.StatusCode)
   614  
   615  	case !expectError && resp.Error != nil:
   616  		t.Fatalf("Expected no error and http status:%v, got %q, http:%v", expectedStatus, resp.Error, resp.StatusCode)
   617  
   618  	case resp.StatusCode != expectedStatus:
   619  		t.Fatalf("Expected http status:%v, got %v (err: %q)", expectedStatus, resp.StatusCode, resp.Error)
   620  	}
   621  }
   622  
   623  func CheckOKStatus(t *testing.T, resp *model.Response) {
   624  	t.Helper()
   625  	checkHTTPStatus(t, resp, http.StatusOK, false)
   626  }
   627  
   628  func CheckCreatedStatus(t *testing.T, resp *model.Response) {
   629  	t.Helper()
   630  	checkHTTPStatus(t, resp, http.StatusCreated, false)
   631  }
   632  
   633  func CheckForbiddenStatus(t *testing.T, resp *model.Response) {
   634  	t.Helper()
   635  	checkHTTPStatus(t, resp, http.StatusForbidden, true)
   636  }
   637  
   638  func CheckUnauthorizedStatus(t *testing.T, resp *model.Response) {
   639  	t.Helper()
   640  	checkHTTPStatus(t, resp, http.StatusUnauthorized, true)
   641  }
   642  
   643  func CheckNotFoundStatus(t *testing.T, resp *model.Response) {
   644  	t.Helper()
   645  	checkHTTPStatus(t, resp, http.StatusNotFound, true)
   646  }
   647  
   648  func CheckBadRequestStatus(t *testing.T, resp *model.Response) {
   649  	t.Helper()
   650  	checkHTTPStatus(t, resp, http.StatusBadRequest, true)
   651  }
   652  
   653  func CheckNotImplementedStatus(t *testing.T, resp *model.Response) {
   654  	t.Helper()
   655  	checkHTTPStatus(t, resp, http.StatusNotImplemented, true)
   656  }
   657  
   658  func CheckRequestEntityTooLargeStatus(t *testing.T, resp *model.Response) {
   659  	t.Helper()
   660  	checkHTTPStatus(t, resp, http.StatusRequestEntityTooLarge, true)
   661  }
   662  
   663  func CheckInternalErrorStatus(t *testing.T, resp *model.Response) {
   664  	t.Helper()
   665  	checkHTTPStatus(t, resp, http.StatusInternalServerError, true)
   666  }
   667  
   668  func CheckErrorMessage(t *testing.T, resp *model.Response, errorId string) {
   669  	t.Helper()
   670  
   671  	if resp.Error == nil {
   672  		t.Fatal("should have errored with message:" + errorId)
   673  		return
   674  	}
   675  
   676  	if resp.Error.Id != errorId {
   677  		t.Log("actual: " + resp.Error.Id)
   678  		t.Log("expected: " + errorId)
   679  		t.Fatal("incorrect error message")
   680  	}
   681  }
   682  
   683  // Similar to s3.New() but allows initialization of signature v2 or signature v4 client.
   684  // If signV2 input is false, function always returns signature v4.
   685  //
   686  // Additionally this function also takes a user defined region, if set
   687  // disables automatic region lookup.
   688  func s3New(endpoint, accessKey, secretKey string, secure bool, signV2 bool, region string) (*s3.Client, error) {
   689  	var creds *credentials.Credentials
   690  	if signV2 {
   691  		creds = credentials.NewStatic(accessKey, secretKey, "", credentials.SignatureV2)
   692  	} else {
   693  		creds = credentials.NewStatic(accessKey, secretKey, "", credentials.SignatureV4)
   694  	}
   695  	return s3.NewWithCredentials(endpoint, creds, secure, region)
   696  }
   697  
   698  func (me *TestHelper) cleanupTestFile(info *model.FileInfo) error {
   699  	cfg := me.App.Config()
   700  	if *cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 {
   701  		endpoint := *cfg.FileSettings.AmazonS3Endpoint
   702  		accessKey := *cfg.FileSettings.AmazonS3AccessKeyId
   703  		secretKey := *cfg.FileSettings.AmazonS3SecretAccessKey
   704  		secure := *cfg.FileSettings.AmazonS3SSL
   705  		signV2 := *cfg.FileSettings.AmazonS3SignV2
   706  		region := *cfg.FileSettings.AmazonS3Region
   707  		s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2, region)
   708  		if err != nil {
   709  			return err
   710  		}
   711  		bucket := *cfg.FileSettings.AmazonS3Bucket
   712  		if err := s3Clnt.RemoveObject(bucket, info.Path); err != nil {
   713  			return err
   714  		}
   715  
   716  		if info.ThumbnailPath != "" {
   717  			if err := s3Clnt.RemoveObject(bucket, info.ThumbnailPath); err != nil {
   718  				return err
   719  			}
   720  		}
   721  
   722  		if info.PreviewPath != "" {
   723  			if err := s3Clnt.RemoveObject(bucket, info.PreviewPath); err != nil {
   724  				return err
   725  			}
   726  		}
   727  	} else if *cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL {
   728  		if err := os.Remove(*cfg.FileSettings.Directory + info.Path); err != nil {
   729  			return err
   730  		}
   731  
   732  		if info.ThumbnailPath != "" {
   733  			if err := os.Remove(*cfg.FileSettings.Directory + info.ThumbnailPath); err != nil {
   734  				return err
   735  			}
   736  		}
   737  
   738  		if info.PreviewPath != "" {
   739  			if err := os.Remove(*cfg.FileSettings.Directory + info.PreviewPath); err != nil {
   740  				return err
   741  			}
   742  		}
   743  	}
   744  
   745  	return nil
   746  }
   747  
   748  func (me *TestHelper) MakeUserChannelAdmin(user *model.User, channel *model.Channel) {
   749  	utils.DisableDebugLogForTest()
   750  
   751  	if cm, err := me.App.Srv.Store.Channel().GetMember(channel.Id, user.Id); err == nil {
   752  		cm.SchemeAdmin = true
   753  		if _, err = me.App.Srv.Store.Channel().UpdateMember(cm); err != nil {
   754  			utils.EnableDebugLogForTest()
   755  			panic(err)
   756  		}
   757  	} else {
   758  		utils.EnableDebugLogForTest()
   759  		panic(err)
   760  	}
   761  
   762  	utils.EnableDebugLogForTest()
   763  }
   764  
   765  func (me *TestHelper) UpdateUserToTeamAdmin(user *model.User, team *model.Team) {
   766  	utils.DisableDebugLogForTest()
   767  
   768  	if tm, err := me.App.Srv.Store.Team().GetMember(team.Id, user.Id); err == nil {
   769  		tm.SchemeAdmin = true
   770  		if _, err = me.App.Srv.Store.Team().UpdateMember(tm); err != nil {
   771  			utils.EnableDebugLogForTest()
   772  			panic(err)
   773  		}
   774  	} else {
   775  		utils.EnableDebugLogForTest()
   776  		mlog.Error(err.Error())
   777  
   778  		time.Sleep(time.Second)
   779  		panic(err)
   780  	}
   781  
   782  	utils.EnableDebugLogForTest()
   783  }
   784  
   785  func (me *TestHelper) UpdateUserToNonTeamAdmin(user *model.User, team *model.Team) {
   786  	utils.DisableDebugLogForTest()
   787  
   788  	if tm, err := me.App.Srv.Store.Team().GetMember(team.Id, user.Id); err == nil {
   789  		tm.SchemeAdmin = false
   790  		if _, err = me.App.Srv.Store.Team().UpdateMember(tm); err != nil {
   791  			utils.EnableDebugLogForTest()
   792  			panic(err)
   793  		}
   794  	} else {
   795  		utils.EnableDebugLogForTest()
   796  		mlog.Error(err.Error())
   797  
   798  		time.Sleep(time.Second)
   799  		panic(err)
   800  	}
   801  
   802  	utils.EnableDebugLogForTest()
   803  }
   804  
   805  func (me *TestHelper) SaveDefaultRolePermissions() map[string][]string {
   806  	utils.DisableDebugLogForTest()
   807  
   808  	results := make(map[string][]string)
   809  
   810  	for _, roleName := range []string{
   811  		"system_user",
   812  		"system_admin",
   813  		"team_user",
   814  		"team_admin",
   815  		"channel_user",
   816  		"channel_admin",
   817  	} {
   818  		role, err1 := me.App.GetRoleByName(roleName)
   819  		if err1 != nil {
   820  			utils.EnableDebugLogForTest()
   821  			panic(err1)
   822  		}
   823  
   824  		results[roleName] = role.Permissions
   825  	}
   826  
   827  	utils.EnableDebugLogForTest()
   828  	return results
   829  }
   830  
   831  func (me *TestHelper) RestoreDefaultRolePermissions(data map[string][]string) {
   832  	utils.DisableDebugLogForTest()
   833  
   834  	for roleName, permissions := range data {
   835  		role, err1 := me.App.GetRoleByName(roleName)
   836  		if err1 != nil {
   837  			utils.EnableDebugLogForTest()
   838  			panic(err1)
   839  		}
   840  
   841  		if strings.Join(role.Permissions, " ") == strings.Join(permissions, " ") {
   842  			continue
   843  		}
   844  
   845  		role.Permissions = permissions
   846  
   847  		_, err2 := me.App.UpdateRole(role)
   848  		if err2 != nil {
   849  			utils.EnableDebugLogForTest()
   850  			panic(err2)
   851  		}
   852  	}
   853  
   854  	utils.EnableDebugLogForTest()
   855  }
   856  
   857  func (me *TestHelper) RemovePermissionFromRole(permission string, roleName string) {
   858  	utils.DisableDebugLogForTest()
   859  
   860  	role, err1 := me.App.GetRoleByName(roleName)
   861  	if err1 != nil {
   862  		utils.EnableDebugLogForTest()
   863  		panic(err1)
   864  	}
   865  
   866  	var newPermissions []string
   867  	for _, p := range role.Permissions {
   868  		if p != permission {
   869  			newPermissions = append(newPermissions, p)
   870  		}
   871  	}
   872  
   873  	if strings.Join(role.Permissions, " ") == strings.Join(newPermissions, " ") {
   874  		utils.EnableDebugLogForTest()
   875  		return
   876  	}
   877  
   878  	role.Permissions = newPermissions
   879  
   880  	_, err2 := me.App.UpdateRole(role)
   881  	if err2 != nil {
   882  		utils.EnableDebugLogForTest()
   883  		panic(err2)
   884  	}
   885  
   886  	utils.EnableDebugLogForTest()
   887  }
   888  
   889  func (me *TestHelper) AddPermissionToRole(permission string, roleName string) {
   890  	utils.DisableDebugLogForTest()
   891  
   892  	role, err1 := me.App.GetRoleByName(roleName)
   893  	if err1 != nil {
   894  		utils.EnableDebugLogForTest()
   895  		panic(err1)
   896  	}
   897  
   898  	for _, existingPermission := range role.Permissions {
   899  		if existingPermission == permission {
   900  			utils.EnableDebugLogForTest()
   901  			return
   902  		}
   903  	}
   904  
   905  	role.Permissions = append(role.Permissions, permission)
   906  
   907  	_, err2 := me.App.UpdateRole(role)
   908  	if err2 != nil {
   909  		utils.EnableDebugLogForTest()
   910  		panic(err2)
   911  	}
   912  
   913  	utils.EnableDebugLogForTest()
   914  }