github.com/crspeller/mattermost-server@v0.0.0-20190328001957-a200beb3d111/app/helper_test.go (about)

     1  // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"time"
    11  
    12  	"testing"
    13  
    14  	"github.com/crspeller/mattermost-server/config"
    15  	"github.com/crspeller/mattermost-server/mlog"
    16  	"github.com/crspeller/mattermost-server/model"
    17  	"github.com/crspeller/mattermost-server/utils"
    18  )
    19  
    20  type TestHelper struct {
    21  	App          *App
    22  	Server       *Server
    23  	BasicTeam    *model.Team
    24  	BasicUser    *model.User
    25  	BasicUser2   *model.User
    26  	BasicChannel *model.Channel
    27  	BasicPost    *model.Post
    28  
    29  	SystemAdminUser *model.User
    30  
    31  	tempWorkspace string
    32  }
    33  
    34  func setupTestHelper(enterprise bool, tb testing.TB) *TestHelper {
    35  	store := mainHelper.GetStore()
    36  	store.DropAllTables()
    37  
    38  	memoryStore, err := config.NewMemoryStore()
    39  	if err != nil {
    40  		panic("failed to initialize memory store: " + err.Error())
    41  	}
    42  
    43  	var options []Option
    44  	options = append(options, ConfigStore(memoryStore))
    45  	options = append(options, StoreOverride(mainHelper.Store))
    46  	options = append(options, SetLogger(mlog.NewTestingLogger(tb)))
    47  
    48  	s, err := NewServer(options...)
    49  	if err != nil {
    50  		panic(err)
    51  	}
    52  
    53  	th := &TestHelper{
    54  		App:    s.FakeApp(),
    55  		Server: s,
    56  	}
    57  
    58  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.MaxUsersPerTeam = 50 })
    59  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.RateLimitSettings.Enable = false })
    60  	prevListenAddress := *th.App.Config().ServiceSettings.ListenAddress
    61  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" })
    62  	serverErr := th.Server.Start()
    63  	if serverErr != nil {
    64  		panic(serverErr)
    65  	}
    66  
    67  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress })
    68  
    69  	th.App.Srv.Store.MarkSystemRanUnitTests()
    70  
    71  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = true })
    72  
    73  	if enterprise {
    74  		th.App.SetLicense(model.NewTestLicense())
    75  	} else {
    76  		th.App.SetLicense(nil)
    77  	}
    78  
    79  	if th.tempWorkspace == "" {
    80  		dir, err := ioutil.TempDir("", "apptest")
    81  		if err != nil {
    82  			panic(err)
    83  		}
    84  		th.tempWorkspace = dir
    85  	}
    86  
    87  	pluginDir := filepath.Join(th.tempWorkspace, "plugins")
    88  	webappDir := filepath.Join(th.tempWorkspace, "webapp")
    89  
    90  	th.App.InitPlugins(pluginDir, webappDir)
    91  
    92  	return th
    93  }
    94  
    95  func SetupEnterprise(tb testing.TB) *TestHelper {
    96  	return setupTestHelper(true, tb)
    97  }
    98  
    99  func Setup(tb testing.TB) *TestHelper {
   100  	return setupTestHelper(false, tb)
   101  }
   102  
   103  func (me *TestHelper) InitBasic() *TestHelper {
   104  	me.SystemAdminUser = me.CreateUser()
   105  	me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false)
   106  	me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id)
   107  
   108  	me.BasicTeam = me.CreateTeam()
   109  	me.BasicUser = me.CreateUser()
   110  
   111  	me.LinkUserToTeam(me.BasicUser, me.BasicTeam)
   112  	me.BasicUser2 = me.CreateUser()
   113  	me.LinkUserToTeam(me.BasicUser2, me.BasicTeam)
   114  	me.BasicChannel = me.CreateChannel(me.BasicTeam)
   115  	me.BasicPost = me.CreatePost(me.BasicChannel)
   116  
   117  	return me
   118  }
   119  
   120  func (me *TestHelper) MakeEmail() string {
   121  	return "success_" + model.NewId() + "@simulator.amazonses.com"
   122  }
   123  
   124  func (me *TestHelper) CreateTeam() *model.Team {
   125  	id := model.NewId()
   126  	team := &model.Team{
   127  		DisplayName: "dn_" + id,
   128  		Name:        "name" + id,
   129  		Email:       "success+" + id + "@simulator.amazonses.com",
   130  		Type:        model.TEAM_OPEN,
   131  	}
   132  
   133  	utils.DisableDebugLogForTest()
   134  	var err *model.AppError
   135  	if team, err = me.App.CreateTeam(team); err != nil {
   136  		mlog.Error(err.Error())
   137  
   138  		time.Sleep(time.Second)
   139  		panic(err)
   140  	}
   141  	utils.EnableDebugLogForTest()
   142  	return team
   143  }
   144  
   145  func (me *TestHelper) CreateUser() *model.User {
   146  	id := model.NewId()
   147  
   148  	user := &model.User{
   149  		Email:         "success+" + id + "@simulator.amazonses.com",
   150  		Username:      "un_" + id,
   151  		Nickname:      "nn_" + id,
   152  		Password:      "Password1",
   153  		EmailVerified: true,
   154  	}
   155  
   156  	utils.DisableDebugLogForTest()
   157  	var err *model.AppError
   158  	if user, err = me.App.CreateUser(user); err != nil {
   159  		mlog.Error(err.Error())
   160  
   161  		time.Sleep(time.Second)
   162  		panic(err)
   163  	}
   164  	utils.EnableDebugLogForTest()
   165  	return user
   166  }
   167  
   168  func (me *TestHelper) CreateChannel(team *model.Team) *model.Channel {
   169  	return me.createChannel(team, model.CHANNEL_OPEN)
   170  }
   171  
   172  func (me *TestHelper) CreatePrivateChannel(team *model.Team) *model.Channel {
   173  	return me.createChannel(team, model.CHANNEL_PRIVATE)
   174  }
   175  
   176  func (me *TestHelper) createChannel(team *model.Team, channelType string) *model.Channel {
   177  	id := model.NewId()
   178  
   179  	channel := &model.Channel{
   180  		DisplayName: "dn_" + id,
   181  		Name:        "name_" + id,
   182  		Type:        channelType,
   183  		TeamId:      team.Id,
   184  		CreatorId:   me.BasicUser.Id,
   185  	}
   186  
   187  	utils.DisableDebugLogForTest()
   188  	var err *model.AppError
   189  	if channel, err = me.App.CreateChannel(channel, true); err != nil {
   190  		mlog.Error(err.Error())
   191  
   192  		time.Sleep(time.Second)
   193  		panic(err)
   194  	}
   195  	utils.EnableDebugLogForTest()
   196  	return channel
   197  }
   198  
   199  func (me *TestHelper) createChannelWithAnotherUser(team *model.Team, channelType, userId string) *model.Channel {
   200  	id := model.NewId()
   201  
   202  	channel := &model.Channel{
   203  		DisplayName: "dn_" + id,
   204  		Name:        "name_" + id,
   205  		Type:        channelType,
   206  		TeamId:      team.Id,
   207  		CreatorId:   userId,
   208  	}
   209  
   210  	utils.DisableDebugLogForTest()
   211  	var err *model.AppError
   212  	if channel, err = me.App.CreateChannel(channel, true); err != nil {
   213  		mlog.Error(err.Error())
   214  
   215  		time.Sleep(time.Second)
   216  		panic(err)
   217  	}
   218  	utils.EnableDebugLogForTest()
   219  	return channel
   220  }
   221  
   222  func (me *TestHelper) CreateDmChannel(user *model.User) *model.Channel {
   223  	utils.DisableDebugLogForTest()
   224  	var err *model.AppError
   225  	var channel *model.Channel
   226  	if channel, err = me.App.GetOrCreateDirectChannel(me.BasicUser.Id, user.Id); err != nil {
   227  		mlog.Error(err.Error())
   228  
   229  		time.Sleep(time.Second)
   230  		panic(err)
   231  	}
   232  	utils.EnableDebugLogForTest()
   233  	return channel
   234  }
   235  
   236  func (me *TestHelper) CreateGroupChannel(user1 *model.User, user2 *model.User) *model.Channel {
   237  	utils.DisableDebugLogForTest()
   238  	var err *model.AppError
   239  	var channel *model.Channel
   240  	if channel, err = me.App.CreateGroupChannel([]string{me.BasicUser.Id, user1.Id, user2.Id}, me.BasicUser.Id); err != nil {
   241  		mlog.Error(err.Error())
   242  
   243  		time.Sleep(time.Second)
   244  		panic(err)
   245  	}
   246  	utils.EnableDebugLogForTest()
   247  	return channel
   248  }
   249  
   250  func (me *TestHelper) CreatePost(channel *model.Channel) *model.Post {
   251  	id := model.NewId()
   252  
   253  	post := &model.Post{
   254  		UserId:    me.BasicUser.Id,
   255  		ChannelId: channel.Id,
   256  		Message:   "message_" + id,
   257  		CreateAt:  model.GetMillis() - 10000,
   258  	}
   259  
   260  	utils.DisableDebugLogForTest()
   261  	var err *model.AppError
   262  	if post, err = me.App.CreatePost(post, channel, false); err != nil {
   263  		mlog.Error(err.Error())
   264  
   265  		time.Sleep(time.Second)
   266  		panic(err)
   267  	}
   268  	utils.EnableDebugLogForTest()
   269  	return post
   270  }
   271  
   272  func (me *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
   273  	utils.DisableDebugLogForTest()
   274  
   275  	err := me.App.JoinUserToTeam(team, user, "")
   276  	if err != nil {
   277  		mlog.Error(err.Error())
   278  
   279  		time.Sleep(time.Second)
   280  		panic(err)
   281  	}
   282  
   283  	utils.EnableDebugLogForTest()
   284  }
   285  
   286  func (me *TestHelper) AddUserToChannel(user *model.User, channel *model.Channel) *model.ChannelMember {
   287  	utils.DisableDebugLogForTest()
   288  
   289  	member, err := me.App.AddUserToChannel(user, channel)
   290  	if err != nil {
   291  		mlog.Error(err.Error())
   292  
   293  		time.Sleep(time.Second)
   294  		panic(err)
   295  	}
   296  
   297  	utils.EnableDebugLogForTest()
   298  
   299  	return member
   300  }
   301  
   302  func (me *TestHelper) CreateScheme() (*model.Scheme, []*model.Role) {
   303  	utils.DisableDebugLogForTest()
   304  
   305  	scheme, err := me.App.CreateScheme(&model.Scheme{
   306  		DisplayName: "Test Scheme Display Name",
   307  		Name:        model.NewId(),
   308  		Description: "Test scheme description",
   309  		Scope:       model.SCHEME_SCOPE_TEAM,
   310  	})
   311  	if err != nil {
   312  		panic(err)
   313  	}
   314  
   315  	roleNames := []string{
   316  		scheme.DefaultTeamAdminRole,
   317  		scheme.DefaultTeamUserRole,
   318  		scheme.DefaultChannelAdminRole,
   319  		scheme.DefaultChannelUserRole,
   320  	}
   321  
   322  	var roles []*model.Role
   323  	for _, roleName := range roleNames {
   324  		role, err := me.App.GetRoleByName(roleName)
   325  		if err != nil {
   326  			panic(err)
   327  		}
   328  		roles = append(roles, role)
   329  	}
   330  
   331  	utils.EnableDebugLogForTest()
   332  
   333  	return scheme, roles
   334  }
   335  
   336  func (me *TestHelper) CreateGroup() *model.Group {
   337  	id := model.NewId()
   338  	group := &model.Group{
   339  		DisplayName: "dn_" + id,
   340  		Name:        "name" + id,
   341  		Source:      model.GroupSourceLdap,
   342  		Description: "description_" + id,
   343  		RemoteId:    model.NewId(),
   344  	}
   345  
   346  	utils.DisableDebugLogForTest()
   347  	var err *model.AppError
   348  	if group, err = me.App.CreateGroup(group); err != nil {
   349  		mlog.Error(err.Error())
   350  
   351  		time.Sleep(time.Second)
   352  		panic(err)
   353  	}
   354  	utils.EnableDebugLogForTest()
   355  	return group
   356  }
   357  
   358  func (me *TestHelper) CreateEmoji() *model.Emoji {
   359  	utils.DisableDebugLogForTest()
   360  
   361  	result := <-me.App.Srv.Store.Emoji().Save(&model.Emoji{
   362  		CreatorId: me.BasicUser.Id,
   363  		Name:      model.NewRandomString(10),
   364  	})
   365  	if result.Err != nil {
   366  		panic(result.Err)
   367  	}
   368  
   369  	utils.EnableDebugLogForTest()
   370  
   371  	return result.Data.(*model.Emoji)
   372  }
   373  
   374  func (me *TestHelper) AddReactionToPost(post *model.Post, user *model.User, emojiName string) *model.Reaction {
   375  	utils.DisableDebugLogForTest()
   376  
   377  	reaction, err := me.App.SaveReactionForPost(&model.Reaction{
   378  		UserId:    user.Id,
   379  		PostId:    post.Id,
   380  		EmojiName: emojiName,
   381  	})
   382  	if err != nil {
   383  		panic(err)
   384  	}
   385  
   386  	utils.EnableDebugLogForTest()
   387  
   388  	return reaction
   389  }
   390  
   391  func (me *TestHelper) ShutdownApp() {
   392  	done := make(chan bool)
   393  	go func() {
   394  		me.Server.Shutdown()
   395  		close(done)
   396  	}()
   397  
   398  	select {
   399  	case <-done:
   400  	case <-time.After(30 * time.Second):
   401  		// panic instead of t.Fatal to terminate all tests in this package, otherwise the
   402  		// still running App could spuriously fail subsequent tests.
   403  		panic("failed to shutdown App within 30 seconds")
   404  	}
   405  }
   406  
   407  func (me *TestHelper) TearDown() {
   408  	me.ShutdownApp()
   409  	if err := recover(); err != nil {
   410  		panic(err)
   411  	}
   412  	if me.tempWorkspace != "" {
   413  		os.RemoveAll(me.tempWorkspace)
   414  	}
   415  }
   416  
   417  func (me *TestHelper) ResetRoleMigration() {
   418  	sqlSupplier := mainHelper.GetSqlSupplier()
   419  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Roles"); err != nil {
   420  		panic(err)
   421  	}
   422  
   423  	mainHelper.GetClusterInterface().SendClearRoleCacheMessage()
   424  
   425  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil {
   426  		panic(err)
   427  	}
   428  }
   429  
   430  func (me *TestHelper) ResetEmojisMigration() {
   431  	sqlSupplier := mainHelper.GetSqlSupplier()
   432  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' create_emojis', '') WHERE builtin=True"); err != nil {
   433  		panic(err)
   434  	}
   435  
   436  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_emojis', '') WHERE builtin=True"); err != nil {
   437  		panic(err)
   438  	}
   439  
   440  	if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_others_emojis', '') WHERE builtin=True"); err != nil {
   441  		panic(err)
   442  	}
   443  
   444  	mainHelper.GetClusterInterface().SendClearRoleCacheMessage()
   445  
   446  	if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": EMOJIS_PERMISSIONS_MIGRATION_KEY}); err != nil {
   447  		panic(err)
   448  	}
   449  }
   450  
   451  func (me *TestHelper) CheckTeamCount(t *testing.T, expected int64) {
   452  	if r := <-me.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil {
   453  		if r.Data.(int64) != expected {
   454  			t.Fatalf("Unexpected number of teams. Expected: %v, found: %v", expected, r.Data.(int64))
   455  		}
   456  	} else {
   457  		t.Fatalf("Failed to get team count.")
   458  	}
   459  }
   460  
   461  func (me *TestHelper) CheckChannelsCount(t *testing.T, expected int64) {
   462  	if r := <-me.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil {
   463  		if r.Data.(int64) != expected {
   464  			t.Fatalf("Unexpected number of channels. Expected: %v, found: %v", expected, r.Data.(int64))
   465  		}
   466  	} else {
   467  		t.Fatalf("Failed to get channel count.")
   468  	}
   469  }
   470  
   471  func (me *TestHelper) SetupTeamScheme() *model.Scheme {
   472  	scheme := model.Scheme{
   473  		Name:        model.NewId(),
   474  		DisplayName: model.NewId(),
   475  		Scope:       model.SCHEME_SCOPE_TEAM,
   476  	}
   477  
   478  	if scheme, err := me.App.CreateScheme(&scheme); err == nil {
   479  		return scheme
   480  	} else {
   481  		panic(err)
   482  	}
   483  }
   484  
   485  func (me *TestHelper) SetupChannelScheme() *model.Scheme {
   486  	scheme := model.Scheme{
   487  		Name:        model.NewId(),
   488  		DisplayName: model.NewId(),
   489  		Scope:       model.SCHEME_SCOPE_CHANNEL,
   490  	}
   491  
   492  	if scheme, err := me.App.CreateScheme(&scheme); err == nil {
   493  		return scheme
   494  	} else {
   495  		panic(err)
   496  	}
   497  }
   498  
   499  func (me *TestHelper) SetupPluginAPI() *PluginAPI {
   500  	manifest := &model.Manifest{
   501  		Id: "pluginid",
   502  	}
   503  
   504  	return NewPluginAPI(me.App, manifest)
   505  }