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 }