github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/helper_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"bytes"
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"sync"
    13  	"time"
    14  
    15  	"testing"
    16  
    17  	"github.com/mattermost/mattermost-server/v5/config"
    18  	"github.com/mattermost/mattermost-server/v5/mlog"
    19  	"github.com/mattermost/mattermost-server/v5/model"
    20  	"github.com/mattermost/mattermost-server/v5/store"
    21  	"github.com/mattermost/mattermost-server/v5/store/localcachelayer"
    22  	"github.com/mattermost/mattermost-server/v5/store/sqlstore"
    23  	"github.com/mattermost/mattermost-server/v5/store/storetest/mocks"
    24  	"github.com/mattermost/mattermost-server/v5/testlib"
    25  	"github.com/mattermost/mattermost-server/v5/utils"
    26  	"github.com/stretchr/testify/require"
    27  )
    28  
    29  type TestHelper struct {
    30  	App          *App
    31  	Server       *Server
    32  	BasicTeam    *model.Team
    33  	BasicUser    *model.User
    34  	BasicUser2   *model.User
    35  	BasicChannel *model.Channel
    36  	BasicPost    *model.Post
    37  
    38  	SystemAdminUser   *model.User
    39  	LogBuffer         *bytes.Buffer
    40  	IncludeCacheLayer bool
    41  
    42  	tempWorkspace string
    43  }
    44  
    45  func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer bool, tb testing.TB, configSet func(*model.Config)) *TestHelper {
    46  	tempWorkspace, err := ioutil.TempDir("", "apptest")
    47  	if err != nil {
    48  		panic(err)
    49  	}
    50  
    51  	memoryStore, err := config.NewMemoryStoreWithOptions(&config.MemoryStoreOptions{IgnoreEnvironmentOverrides: true})
    52  	if err != nil {
    53  		panic("failed to initialize memory store: " + err.Error())
    54  	}
    55  
    56  	config := memoryStore.Get()
    57  	if configSet != nil {
    58  		configSet(config)
    59  	}
    60  	*config.PluginSettings.Directory = filepath.Join(tempWorkspace, "plugins")
    61  	*config.PluginSettings.ClientDirectory = filepath.Join(tempWorkspace, "webapp")
    62  	*config.LogSettings.EnableSentry = false // disable error reporting during tests
    63  	memoryStore.Set(config)
    64  
    65  	buffer := &bytes.Buffer{}
    66  
    67  	var options []Option
    68  	options = append(options, ConfigStore(memoryStore))
    69  	options = append(options, StoreOverride(dbStore))
    70  	options = append(options, SetLogger(mlog.NewTestingLogger(tb, buffer)))
    71  
    72  	s, err := NewServer(options...)
    73  	if err != nil {
    74  		panic(err)
    75  	}
    76  
    77  	if includeCacheLayer {
    78  		// Adds the cache layer to the test store
    79  		s.Store = localcachelayer.NewLocalCacheLayer(s.Store, s.Metrics, s.Cluster, s.CacheProvider)
    80  	}
    81  
    82  	th := &TestHelper{
    83  		App:               New(ServerConnector(s)),
    84  		Server:            s,
    85  		LogBuffer:         buffer,
    86  		IncludeCacheLayer: includeCacheLayer,
    87  	}
    88  
    89  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.MaxUsersPerTeam = 50 })
    90  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.RateLimitSettings.Enable = false })
    91  	prevListenAddress := *th.App.Config().ServiceSettings.ListenAddress
    92  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" })
    93  	serverErr := th.Server.Start()
    94  	if serverErr != nil {
    95  		panic(serverErr)
    96  	}
    97  
    98  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress })
    99  
   100  	th.App.Srv().SearchEngine = mainHelper.SearchEngine
   101  
   102  	th.App.Srv().Store.MarkSystemRanUnitTests()
   103  
   104  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = true })
   105  
   106  	// Disable strict password requirements for test
   107  	th.App.UpdateConfig(func(cfg *model.Config) {
   108  		*cfg.PasswordSettings.MinimumLength = 5
   109  		*cfg.PasswordSettings.Lowercase = false
   110  		*cfg.PasswordSettings.Uppercase = false
   111  		*cfg.PasswordSettings.Symbol = false
   112  		*cfg.PasswordSettings.Number = false
   113  	})
   114  
   115  	if enterprise {
   116  		th.App.Srv().SetLicense(model.NewTestLicense())
   117  	} else {
   118  		th.App.Srv().SetLicense(nil)
   119  	}
   120  
   121  	if th.tempWorkspace == "" {
   122  		th.tempWorkspace = tempWorkspace
   123  	}
   124  
   125  	th.App.InitServer()
   126  
   127  	return th
   128  }
   129  
   130  func SetupEnterprise(tb testing.TB) *TestHelper {
   131  	if testing.Short() {
   132  		tb.SkipNow()
   133  	}
   134  	dbStore := mainHelper.GetStore()
   135  	dbStore.DropAllTables()
   136  	dbStore.MarkSystemRanUnitTests()
   137  
   138  	return setupTestHelper(dbStore, true, true, tb, nil)
   139  }
   140  
   141  func Setup(tb testing.TB) *TestHelper {
   142  	if testing.Short() {
   143  		tb.SkipNow()
   144  	}
   145  	dbStore := mainHelper.GetStore()
   146  	dbStore.DropAllTables()
   147  	dbStore.MarkSystemRanUnitTests()
   148  
   149  	return setupTestHelper(dbStore, false, true, tb, nil)
   150  }
   151  
   152  func SetupWithStoreMock(tb testing.TB) *TestHelper {
   153  	mockStore := testlib.GetMockStoreForSetupFunctions()
   154  	th := setupTestHelper(mockStore, false, false, tb, nil)
   155  	emptyMockStore := mocks.Store{}
   156  	emptyMockStore.On("Close").Return(nil)
   157  	th.App.Srv().Store = &emptyMockStore
   158  	return th
   159  }
   160  
   161  func SetupEnterpriseWithStoreMock(tb testing.TB) *TestHelper {
   162  	mockStore := testlib.GetMockStoreForSetupFunctions()
   163  	th := setupTestHelper(mockStore, true, false, tb, nil)
   164  	emptyMockStore := mocks.Store{}
   165  	emptyMockStore.On("Close").Return(nil)
   166  	th.App.Srv().Store = &emptyMockStore
   167  	return th
   168  }
   169  
   170  func SetupWithCustomConfig(tb testing.TB, configSet func(*model.Config)) *TestHelper {
   171  	if testing.Short() {
   172  		tb.SkipNow()
   173  	}
   174  	dbStore := mainHelper.GetStore()
   175  	dbStore.DropAllTables()
   176  	dbStore.MarkSystemRanUnitTests()
   177  
   178  	return setupTestHelper(dbStore, false, true, tb, configSet)
   179  }
   180  
   181  var initBasicOnce sync.Once
   182  var userCache struct {
   183  	SystemAdminUser *model.User
   184  	BasicUser       *model.User
   185  	BasicUser2      *model.User
   186  }
   187  
   188  func (me *TestHelper) InitBasic() *TestHelper {
   189  	// create users once and cache them because password hashing is slow
   190  	initBasicOnce.Do(func() {
   191  		me.SystemAdminUser = me.CreateUser()
   192  		me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false)
   193  		me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id)
   194  		userCache.SystemAdminUser = me.SystemAdminUser.DeepCopy()
   195  
   196  		me.BasicUser = me.CreateUser()
   197  		me.BasicUser, _ = me.App.GetUser(me.BasicUser.Id)
   198  		userCache.BasicUser = me.BasicUser.DeepCopy()
   199  
   200  		me.BasicUser2 = me.CreateUser()
   201  		me.BasicUser2, _ = me.App.GetUser(me.BasicUser2.Id)
   202  		userCache.BasicUser2 = me.BasicUser2.DeepCopy()
   203  	})
   204  	// restore cached users
   205  	me.SystemAdminUser = userCache.SystemAdminUser.DeepCopy()
   206  	me.BasicUser = userCache.BasicUser.DeepCopy()
   207  	me.BasicUser2 = userCache.BasicUser2.DeepCopy()
   208  	mainHelper.GetSQLSupplier().GetMaster().Insert(me.SystemAdminUser, me.BasicUser, me.BasicUser2)
   209  
   210  	me.BasicTeam = me.CreateTeam()
   211  
   212  	me.LinkUserToTeam(me.BasicUser, me.BasicTeam)
   213  	me.LinkUserToTeam(me.BasicUser2, me.BasicTeam)
   214  	me.BasicChannel = me.CreateChannel(me.BasicTeam)
   215  	me.BasicPost = me.CreatePost(me.BasicChannel)
   216  	return me
   217  }
   218  
   219  func (me *TestHelper) MakeEmail() string {
   220  	return "success_" + model.NewId() + "@simulator.amazonses.com"
   221  }
   222  
   223  func (me *TestHelper) CreateTeam() *model.Team {
   224  	id := model.NewId()
   225  	team := &model.Team{
   226  		DisplayName: "dn_" + id,
   227  		Name:        "name" + id,
   228  		Email:       "success+" + id + "@simulator.amazonses.com",
   229  		Type:        model.TEAM_OPEN,
   230  	}
   231  
   232  	utils.DisableDebugLogForTest()
   233  	var err *model.AppError
   234  	if team, err = me.App.CreateTeam(team); err != nil {
   235  		mlog.Error(err.Error())
   236  
   237  		time.Sleep(time.Second)
   238  		panic(err)
   239  	}
   240  	utils.EnableDebugLogForTest()
   241  	return team
   242  }
   243  
   244  func (me *TestHelper) CreateUser() *model.User {
   245  	return me.CreateUserOrGuest(false)
   246  }
   247  
   248  func (me *TestHelper) CreateGuest() *model.User {
   249  	return me.CreateUserOrGuest(true)
   250  }
   251  
   252  func (me *TestHelper) CreateUserOrGuest(guest bool) *model.User {
   253  	id := model.NewId()
   254  
   255  	user := &model.User{
   256  		Email:         "success+" + id + "@simulator.amazonses.com",
   257  		Username:      "un_" + id,
   258  		Nickname:      "nn_" + id,
   259  		Password:      "Password1",
   260  		EmailVerified: true,
   261  	}
   262  
   263  	utils.DisableDebugLogForTest()
   264  	var err *model.AppError
   265  	if guest {
   266  		if user, err = me.App.CreateGuest(user); err != nil {
   267  			mlog.Error(err.Error())
   268  
   269  			time.Sleep(time.Second)
   270  			panic(err)
   271  		}
   272  	} else {
   273  		if user, err = me.App.CreateUser(user); err != nil {
   274  			mlog.Error(err.Error())
   275  
   276  			time.Sleep(time.Second)
   277  			panic(err)
   278  		}
   279  	}
   280  	utils.EnableDebugLogForTest()
   281  	return user
   282  }
   283  
   284  func (me *TestHelper) CreateBot() *model.Bot {
   285  	id := model.NewId()
   286  
   287  	bot := &model.Bot{
   288  		Username:    "bot" + id,
   289  		DisplayName: "a bot",
   290  		Description: "bot",
   291  		OwnerId:     me.BasicUser.Id,
   292  	}
   293  
   294  	me.App.Log().SetConsoleLevel(mlog.LevelError)
   295  	bot, err := me.App.CreateBot(bot)
   296  	if err != nil {
   297  		mlog.Error(err.Error())
   298  
   299  		time.Sleep(time.Second)
   300  		panic(err)
   301  	}
   302  	me.App.Log().SetConsoleLevel(mlog.LevelDebug)
   303  	return bot
   304  }
   305  
   306  func (me *TestHelper) CreateChannel(team *model.Team) *model.Channel {
   307  	return me.createChannel(team, model.CHANNEL_OPEN)
   308  }
   309  
   310  func (me *TestHelper) CreatePrivateChannel(team *model.Team) *model.Channel {
   311  	return me.createChannel(team, model.CHANNEL_PRIVATE)
   312  }
   313  
   314  func (me *TestHelper) createChannel(team *model.Team, channelType string) *model.Channel {
   315  	id := model.NewId()
   316  
   317  	channel := &model.Channel{
   318  		DisplayName: "dn_" + id,
   319  		Name:        "name_" + id,
   320  		Type:        channelType,
   321  		TeamId:      team.Id,
   322  		CreatorId:   me.BasicUser.Id,
   323  	}
   324  
   325  	utils.DisableDebugLogForTest()
   326  	var err *model.AppError
   327  	if channel, err = me.App.CreateChannel(channel, true); err != nil {
   328  		mlog.Error(err.Error())
   329  
   330  		time.Sleep(time.Second)
   331  		panic(err)
   332  	}
   333  	utils.EnableDebugLogForTest()
   334  	return channel
   335  }
   336  
   337  func (me *TestHelper) createChannelWithAnotherUser(team *model.Team, channelType, userId string) *model.Channel {
   338  	id := model.NewId()
   339  
   340  	channel := &model.Channel{
   341  		DisplayName: "dn_" + id,
   342  		Name:        "name_" + id,
   343  		Type:        channelType,
   344  		TeamId:      team.Id,
   345  		CreatorId:   userId,
   346  	}
   347  
   348  	utils.DisableDebugLogForTest()
   349  	var err *model.AppError
   350  	if channel, err = me.App.CreateChannel(channel, true); err != nil {
   351  		mlog.Error(err.Error())
   352  
   353  		time.Sleep(time.Second)
   354  		panic(err)
   355  	}
   356  	utils.EnableDebugLogForTest()
   357  	return channel
   358  }
   359  
   360  func (me *TestHelper) CreateDmChannel(user *model.User) *model.Channel {
   361  	utils.DisableDebugLogForTest()
   362  	var err *model.AppError
   363  	var channel *model.Channel
   364  	if channel, err = me.App.GetOrCreateDirectChannel(me.BasicUser.Id, user.Id); err != nil {
   365  		mlog.Error(err.Error())
   366  
   367  		time.Sleep(time.Second)
   368  		panic(err)
   369  	}
   370  	utils.EnableDebugLogForTest()
   371  	return channel
   372  }
   373  
   374  func (me *TestHelper) CreateGroupChannel(user1 *model.User, user2 *model.User) *model.Channel {
   375  	utils.DisableDebugLogForTest()
   376  	var err *model.AppError
   377  	var channel *model.Channel
   378  	if channel, err = me.App.CreateGroupChannel([]string{me.BasicUser.Id, user1.Id, user2.Id}, me.BasicUser.Id); err != nil {
   379  		mlog.Error(err.Error())
   380  
   381  		time.Sleep(time.Second)
   382  		panic(err)
   383  	}
   384  	utils.EnableDebugLogForTest()
   385  	return channel
   386  }
   387  
   388  func (me *TestHelper) CreatePost(channel *model.Channel) *model.Post {
   389  	id := model.NewId()
   390  
   391  	post := &model.Post{
   392  		UserId:    me.BasicUser.Id,
   393  		ChannelId: channel.Id,
   394  		Message:   "message_" + id,
   395  		CreateAt:  model.GetMillis() - 10000,
   396  	}
   397  
   398  	utils.DisableDebugLogForTest()
   399  	var err *model.AppError
   400  	if post, err = me.App.CreatePost(post, channel, false, true); err != nil {
   401  		mlog.Error(err.Error())
   402  
   403  		time.Sleep(time.Second)
   404  		panic(err)
   405  	}
   406  	utils.EnableDebugLogForTest()
   407  	return post
   408  }
   409  
   410  func (me *TestHelper) CreateMessagePost(channel *model.Channel, message string) *model.Post {
   411  	post := &model.Post{
   412  		UserId:    me.BasicUser.Id,
   413  		ChannelId: channel.Id,
   414  		Message:   message,
   415  		CreateAt:  model.GetMillis() - 10000,
   416  	}
   417  
   418  	utils.DisableDebugLogForTest()
   419  	var err *model.AppError
   420  	if post, err = me.App.CreatePost(post, channel, false, true); err != nil {
   421  		mlog.Error(err.Error())
   422  
   423  		time.Sleep(time.Second)
   424  		panic(err)
   425  	}
   426  	utils.EnableDebugLogForTest()
   427  	return post
   428  }
   429  
   430  func (me *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
   431  	utils.DisableDebugLogForTest()
   432  
   433  	err := me.App.JoinUserToTeam(team, user, "")
   434  	if err != nil {
   435  		mlog.Error(err.Error())
   436  
   437  		time.Sleep(time.Second)
   438  		panic(err)
   439  	}
   440  
   441  	utils.EnableDebugLogForTest()
   442  }
   443  
   444  func (me *TestHelper) RemoveUserFromTeam(user *model.User, team *model.Team) {
   445  	utils.DisableDebugLogForTest()
   446  
   447  	err := me.App.RemoveUserFromTeam(team.Id, user.Id, "")
   448  	if err != nil {
   449  		mlog.Error(err.Error())
   450  
   451  		time.Sleep(time.Second)
   452  		panic(err)
   453  	}
   454  
   455  	utils.EnableDebugLogForTest()
   456  }
   457  
   458  func (me *TestHelper) AddUserToChannel(user *model.User, channel *model.Channel) *model.ChannelMember {
   459  	utils.DisableDebugLogForTest()
   460  
   461  	member, err := me.App.AddUserToChannel(user, channel)
   462  	if err != nil {
   463  		mlog.Error(err.Error())
   464  
   465  		time.Sleep(time.Second)
   466  		panic(err)
   467  	}
   468  
   469  	utils.EnableDebugLogForTest()
   470  
   471  	return member
   472  }
   473  
   474  func (me *TestHelper) CreateRole(roleName string) *model.Role {
   475  	role, _ := me.App.CreateRole(&model.Role{Name: roleName, DisplayName: roleName, Description: roleName, Permissions: []string{}})
   476  	return role
   477  }
   478  
   479  func (me *TestHelper) CreateScheme() (*model.Scheme, []*model.Role) {
   480  	utils.DisableDebugLogForTest()
   481  
   482  	scheme, err := me.App.CreateScheme(&model.Scheme{
   483  		DisplayName: "Test Scheme Display Name",
   484  		Name:        model.NewId(),
   485  		Description: "Test scheme description",
   486  		Scope:       model.SCHEME_SCOPE_TEAM,
   487  	})
   488  	if err != nil {
   489  		panic(err)
   490  	}
   491  
   492  	roleNames := []string{
   493  		scheme.DefaultTeamAdminRole,
   494  		scheme.DefaultTeamUserRole,
   495  		scheme.DefaultTeamGuestRole,
   496  		scheme.DefaultChannelAdminRole,
   497  		scheme.DefaultChannelUserRole,
   498  		scheme.DefaultChannelGuestRole,
   499  	}
   500  
   501  	var roles []*model.Role
   502  	for _, roleName := range roleNames {
   503  		role, err := me.App.GetRoleByName(roleName)
   504  		if err != nil {
   505  			panic(err)
   506  		}
   507  		roles = append(roles, role)
   508  	}
   509  
   510  	utils.EnableDebugLogForTest()
   511  
   512  	return scheme, roles
   513  }
   514  
   515  func (me *TestHelper) CreateGroup() *model.Group {
   516  	id := model.NewId()
   517  	group := &model.Group{
   518  		DisplayName: "dn_" + id,
   519  		Name:        model.NewString("name" + id),
   520  		Source:      model.GroupSourceLdap,
   521  		Description: "description_" + id,
   522  		RemoteId:    model.NewId(),
   523  	}
   524  
   525  	utils.DisableDebugLogForTest()
   526  	var err *model.AppError
   527  	if group, err = me.App.CreateGroup(group); err != nil {
   528  		mlog.Error(err.Error())
   529  
   530  		time.Sleep(time.Second)
   531  		panic(err)
   532  	}
   533  	utils.EnableDebugLogForTest()
   534  	return group
   535  }
   536  
   537  func (me *TestHelper) CreateEmoji() *model.Emoji {
   538  	utils.DisableDebugLogForTest()
   539  
   540  	emoji, err := me.App.Srv().Store.Emoji().Save(&model.Emoji{
   541  		CreatorId: me.BasicUser.Id,
   542  		Name:      model.NewRandomString(10),
   543  	})
   544  	if err != nil {
   545  		panic(err)
   546  	}
   547  
   548  	utils.EnableDebugLogForTest()
   549  
   550  	return emoji
   551  }
   552  
   553  func (me *TestHelper) AddReactionToPost(post *model.Post, user *model.User, emojiName string) *model.Reaction {
   554  	utils.DisableDebugLogForTest()
   555  
   556  	reaction, err := me.App.SaveReactionForPost(&model.Reaction{
   557  		UserId:    user.Id,
   558  		PostId:    post.Id,
   559  		EmojiName: emojiName,
   560  	})
   561  	if err != nil {
   562  		panic(err)
   563  	}
   564  
   565  	utils.EnableDebugLogForTest()
   566  
   567  	return reaction
   568  }
   569  
   570  func (me *TestHelper) ShutdownApp() {
   571  	done := make(chan bool)
   572  	go func() {
   573  		me.Server.Shutdown()
   574  		close(done)
   575  	}()
   576  
   577  	select {
   578  	case <-done:
   579  	case <-time.After(30 * time.Second):
   580  		// panic instead of fatal to terminate all tests in this package, otherwise the
   581  		// still running App could spuriously fail subsequent tests.
   582  		panic("failed to shutdown App within 30 seconds")
   583  	}
   584  }
   585  
   586  func (me *TestHelper) TearDown() {
   587  	if me.IncludeCacheLayer {
   588  		// Clean all the caches
   589  		me.App.Srv().InvalidateAllCaches()
   590  	}
   591  	me.ShutdownApp()
   592  	if me.tempWorkspace != "" {
   593  		os.RemoveAll(me.tempWorkspace)
   594  	}
   595  }
   596  
   597  func (me *TestHelper) GetSqlSupplier() *sqlstore.SqlSupplier {
   598  	return mainHelper.GetSQLSupplier()
   599  }
   600  
   601  func (me *TestHelper) ResetRoleMigration() {
   602  	sqlSupplier := mainHelper.GetSQLSupplier()
   603  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Roles"); err != nil {
   604  		panic(err)
   605  	}
   606  
   607  	mainHelper.GetClusterInterface().SendClearRoleCacheMessage()
   608  
   609  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil {
   610  		panic(err)
   611  	}
   612  }
   613  
   614  func (me *TestHelper) ResetEmojisMigration() {
   615  	sqlSupplier := mainHelper.GetSQLSupplier()
   616  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' create_emojis', '') WHERE builtin=True"); err != nil {
   617  		panic(err)
   618  	}
   619  
   620  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_emojis', '') WHERE builtin=True"); err != nil {
   621  		panic(err)
   622  	}
   623  
   624  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_others_emojis', '') WHERE builtin=True"); err != nil {
   625  		panic(err)
   626  	}
   627  
   628  	mainHelper.GetClusterInterface().SendClearRoleCacheMessage()
   629  
   630  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": EMOJIS_PERMISSIONS_MIGRATION_KEY}); err != nil {
   631  		panic(err)
   632  	}
   633  }
   634  
   635  func (me *TestHelper) CheckTeamCount(t *testing.T, expected int64) {
   636  	teamCount, err := me.App.Srv().Store.Team().AnalyticsTeamCount(false)
   637  	require.Nil(t, err, "Failed to get team count.")
   638  	require.Equalf(t, teamCount, expected, "Unexpected number of teams. Expected: %v, found: %v", expected, teamCount)
   639  }
   640  
   641  func (me *TestHelper) CheckChannelsCount(t *testing.T, expected int64) {
   642  	count, err := me.App.Srv().Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN)
   643  	require.Nilf(t, err, "Failed to get channel count.")
   644  	require.Equalf(t, count, expected, "Unexpected number of channels. Expected: %v, found: %v", expected, count)
   645  }
   646  
   647  func (me *TestHelper) SetupTeamScheme() *model.Scheme {
   648  	scheme := model.Scheme{
   649  		Name:        model.NewId(),
   650  		DisplayName: model.NewId(),
   651  		Scope:       model.SCHEME_SCOPE_TEAM,
   652  	}
   653  
   654  	if scheme, err := me.App.CreateScheme(&scheme); err == nil {
   655  		return scheme
   656  	} else {
   657  		panic(err)
   658  	}
   659  }
   660  
   661  func (me *TestHelper) SetupChannelScheme() *model.Scheme {
   662  	scheme := model.Scheme{
   663  		Name:        model.NewId(),
   664  		DisplayName: model.NewId(),
   665  		Scope:       model.SCHEME_SCOPE_CHANNEL,
   666  	}
   667  
   668  	if scheme, err := me.App.CreateScheme(&scheme); err == nil {
   669  		return scheme
   670  	} else {
   671  		panic(err)
   672  	}
   673  }
   674  
   675  func (me *TestHelper) SetupPluginAPI() *PluginAPI {
   676  	manifest := &model.Manifest{
   677  		Id: "pluginid",
   678  	}
   679  
   680  	return NewPluginAPI(me.App, manifest)
   681  }
   682  
   683  func (me *TestHelper) RemovePermissionFromRole(permission string, roleName string) {
   684  	utils.DisableDebugLogForTest()
   685  
   686  	role, err1 := me.App.GetRoleByName(roleName)
   687  	if err1 != nil {
   688  		utils.EnableDebugLogForTest()
   689  		panic(err1)
   690  	}
   691  
   692  	var newPermissions []string
   693  	for _, p := range role.Permissions {
   694  		if p != permission {
   695  			newPermissions = append(newPermissions, p)
   696  		}
   697  	}
   698  
   699  	if strings.Join(role.Permissions, " ") == strings.Join(newPermissions, " ") {
   700  		utils.EnableDebugLogForTest()
   701  		return
   702  	}
   703  
   704  	role.Permissions = newPermissions
   705  
   706  	_, err2 := me.App.UpdateRole(role)
   707  	if err2 != nil {
   708  		utils.EnableDebugLogForTest()
   709  		panic(err2)
   710  	}
   711  
   712  	utils.EnableDebugLogForTest()
   713  }
   714  
   715  func (me *TestHelper) AddPermissionToRole(permission string, roleName string) {
   716  	utils.DisableDebugLogForTest()
   717  
   718  	role, err1 := me.App.GetRoleByName(roleName)
   719  	if err1 != nil {
   720  		utils.EnableDebugLogForTest()
   721  		panic(err1)
   722  	}
   723  
   724  	for _, existingPermission := range role.Permissions {
   725  		if existingPermission == permission {
   726  			utils.EnableDebugLogForTest()
   727  			return
   728  		}
   729  	}
   730  
   731  	role.Permissions = append(role.Permissions, permission)
   732  
   733  	_, err2 := me.App.UpdateRole(role)
   734  	if err2 != nil {
   735  		utils.EnableDebugLogForTest()
   736  		panic(err2)
   737  	}
   738  
   739  	utils.EnableDebugLogForTest()
   740  }