github.com/dschalla/mattermost-server@v4.8.1-rc1+incompatible/web/web_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package web 5 6 import ( 7 "fmt" 8 "os" 9 "testing" 10 11 "github.com/mattermost/mattermost-server/api" 12 "github.com/mattermost/mattermost-server/api4" 13 "github.com/mattermost/mattermost-server/app" 14 "github.com/mattermost/mattermost-server/model" 15 "github.com/mattermost/mattermost-server/store" 16 "github.com/mattermost/mattermost-server/store/sqlstore" 17 "github.com/mattermost/mattermost-server/store/storetest" 18 "github.com/mattermost/mattermost-server/utils" 19 ) 20 21 var ApiClient *model.Client 22 var URL string 23 24 type persistentTestStore struct { 25 store.Store 26 } 27 28 func (*persistentTestStore) Close() {} 29 30 var testStoreContainer *storetest.RunningContainer 31 var testStore *persistentTestStore 32 33 func StopTestStore() { 34 if testStoreContainer != nil { 35 testStoreContainer.Stop() 36 testStoreContainer = nil 37 } 38 } 39 40 func Setup() *app.App { 41 a, err := app.New(app.StoreOverride(testStore), app.DisableConfigWatch) 42 if err != nil { 43 panic(err) 44 } 45 prevListenAddress := *a.Config().ServiceSettings.ListenAddress 46 a.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" }) 47 serverErr := a.StartServer() 48 if serverErr != nil { 49 panic(serverErr) 50 } 51 a.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress }) 52 api4.Init(a, a.Srv.Router, false) 53 api3 := api.Init(a, a.Srv.Router) 54 Init(api3) 55 URL = fmt.Sprintf("http://localhost:%v", a.Srv.ListenAddr.Port) 56 ApiClient = model.NewClient(URL) 57 58 a.Srv.Store.MarkSystemRanUnitTests() 59 60 a.UpdateConfig(func(cfg *model.Config) { 61 *cfg.TeamSettings.EnableOpenServer = true 62 *cfg.ServiceSettings.EnableAPIv3 = true 63 }) 64 65 return a 66 } 67 68 func TearDown(a *app.App) { 69 a.Shutdown() 70 if err := recover(); err != nil { 71 StopTestStore() 72 panic(err) 73 } 74 } 75 76 /* Test disabled for now so we don't requrie the client to build. Maybe re-enable after client gets moved out. 77 func TestStatic(t *testing.T) { 78 Setup() 79 80 // add a short delay to make sure the server is ready to receive requests 81 time.Sleep(1 * time.Second) 82 83 resp, err := http.Get(URL + "/static/root.html") 84 85 if err != nil { 86 t.Fatalf("got error while trying to get static files %v", err) 87 } else if resp.StatusCode != http.StatusOK { 88 t.Fatalf("couldn't get static files %v", resp.StatusCode) 89 } 90 } 91 */ 92 93 func TestIncomingWebhook(t *testing.T) { 94 a := Setup() 95 defer TearDown(a) 96 97 user := &model.User{Email: model.NewId() + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"} 98 user = ApiClient.Must(ApiClient.CreateUser(user, "")).Data.(*model.User) 99 store.Must(a.Srv.Store.User().VerifyEmail(user.Id)) 100 101 ApiClient.Login(user.Email, "passwd1") 102 103 team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} 104 team = ApiClient.Must(ApiClient.CreateTeam(team)).Data.(*model.Team) 105 106 a.JoinUserToTeam(team, user, "") 107 108 a.UpdateUserRoles(user.Id, model.SYSTEM_ADMIN_ROLE_ID, false) 109 ApiClient.SetTeamId(team.Id) 110 111 channel1 := &model.Channel{DisplayName: "Test API Name", Name: "zz" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} 112 channel1 = ApiClient.Must(ApiClient.CreateChannel(channel1)).Data.(*model.Channel) 113 114 if a.Config().ServiceSettings.EnableIncomingWebhooks { 115 hook1 := &model.IncomingWebhook{ChannelId: channel1.Id} 116 hook1 = ApiClient.Must(ApiClient.CreateIncomingWebhook(hook1)).Data.(*model.IncomingWebhook) 117 118 payload := "payload={\"text\": \"test text\"}" 119 if _, err := ApiClient.PostToWebhook(hook1.Id, payload); err != nil { 120 t.Fatal(err) 121 } 122 123 payload = "payload={\"text\": \"\"}" 124 if _, err := ApiClient.PostToWebhook(hook1.Id, payload); err == nil { 125 t.Fatal("should have errored - no text to post") 126 } 127 128 payload = "payload={\"text\": \"test text\", \"channel\": \"junk\"}" 129 if _, err := ApiClient.PostToWebhook(hook1.Id, payload); err == nil { 130 t.Fatal("should have errored - bad channel") 131 } 132 133 payload = "payload={\"text\": \"test text\"}" 134 if _, err := ApiClient.PostToWebhook("abc123", payload); err == nil { 135 t.Fatal("should have errored - bad hook") 136 } 137 138 payloadMultiPart := "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"username\"\r\n\r\nwebhook-bot\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nthis is a test :tada:\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--" 139 if _, err := ApiClient.DoPost("/hooks/"+hook1.Id, payloadMultiPart, "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); err != nil { 140 t.Fatal("should have errored - bad hook") 141 } 142 143 } else { 144 if _, err := ApiClient.PostToWebhook("123", "123"); err == nil { 145 t.Fatal("should have failed - webhooks turned off") 146 } 147 } 148 } 149 150 func TestMain(m *testing.M) { 151 utils.TranslationsPreInit() 152 153 status := 0 154 155 container, settings, err := storetest.NewPostgreSQLContainer() 156 if err != nil { 157 panic(err) 158 } 159 160 testStoreContainer = container 161 testStore = &persistentTestStore{store.NewLayeredStore(sqlstore.NewSqlSupplier(*settings, nil), nil, nil)} 162 163 defer func() { 164 StopTestStore() 165 os.Exit(status) 166 }() 167 168 status = m.Run() 169 }