123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
- // See LICENSE.txt for license information.
- package manualtesting
- import (
- "hash/fnv"
- "math/rand"
- "net/http"
- "net/url"
- "strconv"
- "time"
- "github.com/mattermost/mattermost-server/v5/api4"
- "github.com/mattermost/mattermost-server/v5/app"
- "github.com/mattermost/mattermost-server/v5/mlog"
- "github.com/mattermost/mattermost-server/v5/model"
- "github.com/mattermost/mattermost-server/v5/utils"
- "github.com/mattermost/mattermost-server/v5/web"
- )
- // TestEnvironment is a helper struct used for tests in manualtesting.
- type TestEnvironment struct {
- Params map[string][]string
- Client *model.Client4
- CreatedTeamID string
- CreatedUserID string
- Context *web.Context
- Writer http.ResponseWriter
- Request *http.Request
- }
- // Init adds manualtest endpoint to the API.
- func Init(api4 *api4.API) {
- api4.BaseRoutes.Root.Handle("/manualtest", api4.ApiHandler(manualTest)).Methods("GET")
- }
- func manualTest(c *web.Context, w http.ResponseWriter, r *http.Request) {
- // Let the world know
- mlog.Info("Setting up for manual test...")
- // URL Parameters
- params, err := url.ParseQuery(r.URL.RawQuery)
- if err != nil {
- c.Err = model.NewAppError("/manual", "manaultesting.manual_test.parse.app_error", nil, "", http.StatusBadRequest)
- return
- }
- // Grab a uuid (if available) to seed the random number generator so we don't get conflicts.
- uid, ok := params["uid"]
- if ok {
- hasher := fnv.New32a()
- hasher.Write([]byte(uid[0] + strconv.Itoa(int(time.Now().UTC().UnixNano()))))
- hash := hasher.Sum32()
- rand.Seed(int64(hash))
- } else {
- mlog.Debug("No uid in URL")
- }
- // Create a client for tests to use
- client := model.NewAPIv4Client("http://localhost" + *c.App.Config().ServiceSettings.ListenAddress)
- // Check for username parameter and create a user if present
- username, ok1 := params["username"]
- teamDisplayName, ok2 := params["teamname"]
- var teamID string
- var userID string
- if ok1 && ok2 {
- mlog.Info("Creating user and team")
- // Create team for testing
- team := &model.Team{
- DisplayName: teamDisplayName[0],
- Name: "zz" + utils.RandomName(utils.Range{Begin: 20, End: 20}, utils.LOWERCASE),
- Email: "success+" + model.NewId() + "simulator.amazonses.com",
- Type: model.TEAM_OPEN,
- }
- createdTeam, err := c.App.Srv().Store.Team().Save(team)
- if err != nil {
- c.Err = err
- return
- }
- channel := &model.Channel{DisplayName: "Town Square", Name: "town-square", Type: model.CHANNEL_OPEN, TeamId: createdTeam.Id}
- if _, err := c.App.CreateChannel(channel, false); err != nil {
- c.Err = err
- return
- }
- teamID = createdTeam.Id
- // Create user for testing
- user := &model.User{
- Email: "success+" + model.NewId() + "simulator.amazonses.com",
- Nickname: username[0],
- Password: app.USER_PASSWORD}
- user, resp := client.CreateUser(user)
- if resp.Error != nil {
- c.Err = resp.Error
- return
- }
- c.App.Srv().Store.User().VerifyEmail(user.Id, user.Email)
- c.App.Srv().Store.Team().SaveMember(&model.TeamMember{TeamId: teamID, UserId: user.Id}, *c.App.Config().TeamSettings.MaxUsersPerTeam)
- userID = user.Id
- // Login as user to generate auth token
- _, resp = client.LoginById(user.Id, app.USER_PASSWORD)
- if resp.Error != nil {
- c.Err = resp.Error
- return
- }
- // Respond with an auth token this can be overridden by a specific test as required
- sessionCookie := &http.Cookie{
- Name: model.SESSION_COOKIE_TOKEN,
- Value: client.AuthToken,
- Path: "/",
- MaxAge: *c.App.Config().ServiceSettings.SessionLengthWebInDays * 60 * 60 * 24,
- HttpOnly: true,
- }
- http.SetCookie(w, sessionCookie)
- http.Redirect(w, r, "/channels/town-square", http.StatusTemporaryRedirect)
- }
- // Setup test environment
- env := TestEnvironment{
- Params: params,
- Client: client,
- CreatedTeamID: teamID,
- CreatedUserID: userID,
- Context: c,
- Writer: w,
- Request: r,
- }
- // Grab the test ID and pick the test
- testname, ok := params["test"]
- if !ok {
- c.Err = model.NewAppError("/manual", "manaultesting.manual_test.parse.app_error", nil, "", http.StatusBadRequest)
- return
- }
- switch testname[0] {
- case "autolink":
- c.Err = testAutoLink(env)
- // ADD YOUR NEW TEST HERE!
- case "general":
- }
- }
- func getChannelID(a app.AppIface, channelname string, teamid string, userid string) (string, bool) {
- // Grab all the channels
- channels, err := a.Srv().Store.Channel().GetChannels(teamid, userid, false, 0)
- if err != nil {
- mlog.Debug("Unable to get channels")
- return "", false
- }
- for _, channel := range *channels {
- if channel.Name == channelname {
- return channel.Id, true
- }
- }
- mlog.Debug("Could not find channel", mlog.String("Channel name", channelname), mlog.Int("Possibilities searched", len(*channels)))
- return "", false
- }
|