MM-21343: Recognize multi-line slash commands without requiring trailing space after trigger word (#13646)
* change how we are parsing the args.command * change comment * atttempt to write unit test * remove quotes * use unicode.IsSpace * MM-21343 fix panic * use table * test cases * bad request, add test for missing '/' * mispelled err * Update app/command.go Co-Authored-By: Jesse Hallam <jesse.hallam@gmail.com> * Update app/command.go Co-Authored-By: Jesse Hallam <jesse.hallam@gmail.com> * use a map * use subtest and add test case of empty command * go fmt * do not use t.fatal * Update app/command.go Co-Authored-By: Bot from GolangCI <42910462+golangcibot@users.noreply.github.com> * fix missing unicode import Co-authored-by: wiggin77 <wiggin77@warpmail.net> Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com> Co-authored-by: mattermod <mattermod@users.noreply.github.com> Co-authored-by: Bot from GolangCI <42910462+golangcibot@users.noreply.github.com>
Этот коммит содержится в:
@@ -10,6 +10,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
goi18n "github.com/mattermost/go-i18n/i18n"
|
goi18n "github.com/mattermost/go-i18n/i18n"
|
||||||
"github.com/mattermost/mattermost-server/v5/mlog"
|
"github.com/mattermost/mattermost-server/v5/mlog"
|
||||||
@@ -159,10 +160,20 @@ func (a *App) ListAllCommands(teamId string, T goi18n.TranslateFunc) ([]*model.C
|
|||||||
|
|
||||||
// @openTracingParams args
|
// @openTracingParams args
|
||||||
func (a *App) ExecuteCommand(args *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
|
func (a *App) ExecuteCommand(args *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
|
||||||
parts := strings.Split(args.Command, " ")
|
trigger := ""
|
||||||
trigger := parts[0][1:]
|
message := ""
|
||||||
|
index := strings.IndexFunc(args.Command, unicode.IsSpace)
|
||||||
|
if index != -1 {
|
||||||
|
trigger = args.Command[:index]
|
||||||
|
message = args.Command[index+1:]
|
||||||
|
} else {
|
||||||
|
trigger = args.Command
|
||||||
|
}
|
||||||
trigger = strings.ToLower(trigger)
|
trigger = strings.ToLower(trigger)
|
||||||
message := strings.Join(parts[1:], " ")
|
if !strings.HasPrefix(trigger, "/") {
|
||||||
|
return nil, model.NewAppError("command", "api.command.execute_command.format.app_error", map[string]interface{}{"Trigger": trigger}, "", http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
trigger = strings.TrimPrefix(trigger, "/")
|
||||||
|
|
||||||
clientTriggerId, triggerId, appErr := model.GenerateTriggerId(args.UserId, a.AsymmetricSigningKey())
|
clientTriggerId, triggerId, appErr := model.GenerateTriggerId(args.UserId, a.AsymmetricSigningKey())
|
||||||
if appErr != nil {
|
if appErr != nil {
|
||||||
|
|||||||
@@ -75,6 +75,49 @@ func TestCreateCommandPost(t *testing.T) {
|
|||||||
require.Equal(t, err.Id, "api.context.invalid_param.app_error")
|
require.Equal(t, err.Id, "api.context.invalid_param.app_error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExecuteCommand(t *testing.T) {
|
||||||
|
th := Setup(t).InitBasic()
|
||||||
|
defer th.TearDown()
|
||||||
|
|
||||||
|
t.Run("valid tests with different whitespace characters", func(t *testing.T) {
|
||||||
|
TestCases := map[string]string{
|
||||||
|
"/code happy path": " happy path",
|
||||||
|
"/code\nnewline path": " newline path",
|
||||||
|
"/code\n/nDouble newline path": " /nDouble newline path",
|
||||||
|
"/code double space": " double space",
|
||||||
|
"/code\ttab": " tab",
|
||||||
|
}
|
||||||
|
|
||||||
|
for TestCase, result := range TestCases {
|
||||||
|
args := &model.CommandArgs{
|
||||||
|
Command: TestCase,
|
||||||
|
T: func(s string, args ...interface{}) string { return s },
|
||||||
|
}
|
||||||
|
resp, _ := th.App.ExecuteCommand(args)
|
||||||
|
|
||||||
|
assert.Equal(t, resp.Text, result)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("missing slash character", func(t *testing.T) {
|
||||||
|
argsMissingSlashCharacter := &model.CommandArgs{
|
||||||
|
Command: "missing leading slash character",
|
||||||
|
T: func(s string, args ...interface{}) string { return s },
|
||||||
|
}
|
||||||
|
_, err := th.App.ExecuteCommand(argsMissingSlashCharacter)
|
||||||
|
require.Equal(t, "api.command.execute_command.format.app_error", err.Id)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("empty", func(t *testing.T) {
|
||||||
|
argsMissingSlashCharacter := &model.CommandArgs{
|
||||||
|
Command: "",
|
||||||
|
T: func(s string, args ...interface{}) string { return s },
|
||||||
|
}
|
||||||
|
_, err := th.App.ExecuteCommand(argsMissingSlashCharacter)
|
||||||
|
require.Equal(t, "api.command.execute_command.format.app_error", err.Id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestHandleCommandResponsePost(t *testing.T) {
|
func TestHandleCommandResponsePost(t *testing.T) {
|
||||||
th := Setup(t).InitBasic()
|
th := Setup(t).InitBasic()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|||||||
@@ -499,6 +499,10 @@
|
|||||||
"id": "api.command.execute_command.failed_resp.app_error",
|
"id": "api.command.execute_command.failed_resp.app_error",
|
||||||
"translation": "Command with a trigger of '{{.Trigger}}' returned response {{.Status}}."
|
"translation": "Command with a trigger of '{{.Trigger}}' returned response {{.Status}}."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "api.command.execute_command.format.app_error",
|
||||||
|
"translation": "Command trigger word is missing the leading slash character"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "api.command.execute_command.not_found.app_error",
|
"id": "api.command.execute_command.not_found.app_error",
|
||||||
"translation": "Command with a trigger of '{{.Trigger}}' not found. To send a message beginning with \"/\", try adding an empty space at the beginning of the message."
|
"translation": "Command with a trigger of '{{.Trigger}}' not found. To send a message beginning with \"/\", try adding an empty space at the beginning of the message."
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user