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  }