command_test.go 8.79 KB
Newer Older
1
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
=Corey Hulen's avatar
=Corey Hulen committed
2 3 4 5 6
// See License.txt for license information.

package api

import (
7
	"strings"
nickago's avatar
nickago committed
8
	"testing"
9
	"time"
nickago's avatar
nickago committed
10

=Corey Hulen's avatar
=Corey Hulen committed
11
	"github.com/mattermost/platform/model"
=Corey Hulen's avatar
=Corey Hulen committed
12
	"github.com/mattermost/platform/store"
13
	"github.com/mattermost/platform/utils"
=Corey Hulen's avatar
=Corey Hulen committed
14 15 16 17 18
)

func TestSuggestRootCommands(t *testing.T) {
	Setup()

19
	team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
=Corey Hulen's avatar
=Corey Hulen committed
20 21
	team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)

22
	user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
=Corey Hulen's avatar
=Corey Hulen committed
23
	user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
24
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user1.Id))
=Corey Hulen's avatar
=Corey Hulen committed
25

26
	Client.LoginByEmail(team.Name, user1.Email, "pwd")
=Corey Hulen's avatar
=Corey Hulen committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

	if _, err := Client.Command("", "", true); err == nil {
		t.Fatal("Should fail")
	}

	rs1 := Client.Must(Client.Command("", "/", true)).Data.(*model.Command)

	hasLogout := false
	for _, v := range rs1.Suggestions {
		if v.Suggestion == "/logout" {
			hasLogout = true
		}
	}

	if !hasLogout {
		t.Log(rs1.Suggestions)
		t.Fatal("should have logout cmd")
	}

	rs2 := Client.Must(Client.Command("", "/log", true)).Data.(*model.Command)

	if rs2.Suggestions[0].Suggestion != "/logout" {
		t.Fatal("should have logout cmd")
	}

	rs3 := Client.Must(Client.Command("", "/joi", true)).Data.(*model.Command)

	if rs3.Suggestions[0].Suggestion != "/join" {
		t.Fatal("should have join cmd")
	}
nickago's avatar
nickago committed
57 58 59 60 61 62

	rs4 := Client.Must(Client.Command("", "/ech", true)).Data.(*model.Command)

	if rs4.Suggestions[0].Suggestion != "/echo" {
		t.Fatal("should have echo cmd")
	}
=Corey Hulen's avatar
=Corey Hulen committed
63 64 65 66 67
}

func TestLogoutCommands(t *testing.T) {
	Setup()

68
	team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
=Corey Hulen's avatar
=Corey Hulen committed
69 70
	team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)

71
	user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
=Corey Hulen's avatar
=Corey Hulen committed
72
	user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
73
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user1.Id))
=Corey Hulen's avatar
=Corey Hulen committed
74

75
	Client.LoginByEmail(team.Name, user1.Email, "pwd")
=Corey Hulen's avatar
=Corey Hulen committed
76 77 78 79 80 81 82 83 84 85

	rs1 := Client.Must(Client.Command("", "/logout", false)).Data.(*model.Command)
	if rs1.GotoLocation != "/logout" {
		t.Fatal("failed to logout")
	}
}

func TestJoinCommands(t *testing.T) {
	Setup()

86
	team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
=Corey Hulen's avatar
=Corey Hulen committed
87 88
	team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)

89
	user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
=Corey Hulen's avatar
=Corey Hulen committed
90
	user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
91
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user1.Id))
=Corey Hulen's avatar
=Corey Hulen committed
92

93
	Client.LoginByEmail(team.Name, user1.Email, "pwd")
=Corey Hulen's avatar
=Corey Hulen committed
94 95 96 97 98 99 100 101 102

	channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
	channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
	Client.Must(Client.LeaveChannel(channel1.Id))

	channel2 := &model.Channel{DisplayName: "BB", Name: "bb" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
	channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel)
	Client.Must(Client.LeaveChannel(channel2.Id))

103
	user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
=Corey Hulen's avatar
=Corey Hulen committed
104
	user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
105
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user1.Id))
=Corey Hulen's avatar
=Corey Hulen committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

	data := make(map[string]string)
	data["user_id"] = user2.Id
	channel3 := Client.Must(Client.CreateDirectChannel(data)).Data.(*model.Channel)

	rs1 := Client.Must(Client.Command("", "/join aa", true)).Data.(*model.Command)
	if rs1.Suggestions[0].Suggestion != "/join "+channel1.Name {
		t.Fatal("should have join cmd")
	}

	rs2 := Client.Must(Client.Command("", "/join bb", true)).Data.(*model.Command)
	if rs2.Suggestions[0].Suggestion != "/join "+channel2.Name {
		t.Fatal("should have join cmd")
	}

	rs3 := Client.Must(Client.Command("", "/join", true)).Data.(*model.Command)
	if len(rs3.Suggestions) != 2 {
		t.Fatal("should have 2 join cmd")
	}

	rs4 := Client.Must(Client.Command("", "/join ", true)).Data.(*model.Command)
	if len(rs4.Suggestions) != 2 {
		t.Fatal("should have 2 join cmd")
	}

	rs5 := Client.Must(Client.Command("", "/join "+channel2.Name, false)).Data.(*model.Command)
132
	if !strings.HasSuffix(rs5.GotoLocation, "/"+team.Name+"/channels/"+channel2.Name) {
=Corey Hulen's avatar
=Corey Hulen committed
133 134 135 136
		t.Fatal("failed to join channel")
	}

	rs6 := Client.Must(Client.Command("", "/join "+channel3.Name, false)).Data.(*model.Command)
137
	if strings.HasSuffix(rs6.GotoLocation, "/"+team.Name+"/channels/"+channel3.Name) {
=Corey Hulen's avatar
=Corey Hulen committed
138 139 140 141 142
		t.Fatal("should not have joined direct message channel")
	}

	c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList)

143
	if len(c1.Channels) != 4 { // 4 because of town-square, off-topic and direct
=Corey Hulen's avatar
=Corey Hulen committed
144 145 146 147 148 149 150 151 152 153 154 155 156 157
		t.Fatal("didn't join channel")
	}

	found := false
	for _, c := range c1.Channels {
		if c.Name == channel2.Name {
			found = true
			break
		}
	}
	if !found {
		t.Fatal("didn't join channel")
	}
}
nickago's avatar
nickago committed
158 159 160 161 162 163 164

func TestEchoCommand(t *testing.T) {
	Setup()

	team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
	team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)

165
	user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
nickago's avatar
nickago committed
166
	user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
167
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user1.Id))
nickago's avatar
nickago committed
168 169 170 171 172 173 174 175 176 177 178 179 180

	Client.LoginByEmail(team.Name, user1.Email, "pwd")

	channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
	channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)

	echoTestString := "/echo test"

	r1 := Client.Must(Client.Command(channel1.Id, echoTestString, false)).Data.(*model.Command)
	if r1.Response != model.RESP_EXECUTED {
		t.Fatal("Echo command failed to execute")
	}

181 182
	time.Sleep(100 * time.Millisecond)

nickago's avatar
nickago committed
183 184 185 186 187
	p1 := Client.Must(Client.GetPosts(channel1.Id, 0, 2, "")).Data.(*model.PostList)
	if len(p1.Order) != 1 {
		t.Fatal("Echo command failed to send")
	}
}
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

func TestLoadTestUrlCommand(t *testing.T) {
	Setup()

	// enable testing to use /loadtest but don't save it since we don't want to overwrite config.json
	enableTesting := utils.Cfg.ServiceSettings.EnableTesting
	defer func() {
		utils.Cfg.ServiceSettings.EnableTesting = enableTesting
	}()

	utils.Cfg.ServiceSettings.EnableTesting = true

	team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
	team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)

203
	user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey+test@test.com", Nickname: "Corey Hulen", Password: "pwd"}
204
	user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
205
	store.Must(Srv.Store.User().VerifyEmail(utils.T, user.Id))
206 207 208 209 210 211 212 213 214 215 216

	Client.LoginByEmail(team.Name, user.Email, "pwd")

	channel := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
	channel = Client.Must(Client.CreateChannel(channel)).Data.(*model.Channel)

	command := "/loadtest url "
	if _, err := Client.Command(channel.Id, command, false); err == nil {
		t.Fatal("/loadtest url with no url should've failed")
	}

217 218 219 220
	// command = "/loadtest url http://www.hopefullynonexistent.file/path/asdf/qwerty"
	// if _, err := Client.Command(channel.Id, command, false); err == nil {
	// 	t.Fatal("/loadtest url with invalid url should've failed")
	// }
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

	command = "/loadtest url https://raw.githubusercontent.com/mattermost/platform/master/README.md"
	if r := Client.Must(Client.Command(channel.Id, command, false)).Data.(*model.Command); r.Response != model.RESP_EXECUTED {
		t.Fatal("/loadtest url for README.md should've executed")
	}

	command = "/loadtest url test-emoticons.md"
	if r := Client.Must(Client.Command(channel.Id, command, false)).Data.(*model.Command); r.Response != model.RESP_EXECUTED {
		t.Fatal("/loadtest url for test-emoticons.md should've executed")
	}

	command = "/loadtest url test-emoticons"
	if r := Client.Must(Client.Command(channel.Id, command, false)).Data.(*model.Command); r.Response != model.RESP_EXECUTED {
		t.Fatal("/loadtest url for test-emoticons should've executed")
	}

	posts := Client.Must(Client.GetPosts(channel.Id, 0, 5, "")).Data.(*model.PostList)
	// note that this may make more than 3 posts if files are too long to fit in an individual post
	if len(posts.Order) < 3 {
		t.Fatal("/loadtest url made too few posts, perhaps there needs to be a delay before GetPosts in the test?")
	}
}