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 }