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 }