github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/command_autocomplete_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/mattermost/mattermost-server/v5/model"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestParseStaticListArgument(t *testing.T) {
    14  	items := []model.AutocompleteListItem{
    15  		{
    16  			Hint:     "[hint]",
    17  			Item:     "on",
    18  			HelpText: "help",
    19  		},
    20  	}
    21  	fixedArgs := &model.AutocompleteStaticListArg{PossibleArguments: items}
    22  
    23  	argument := &model.AutocompleteArg{
    24  		Name:     "", //positional
    25  		HelpText: "some_help",
    26  		Type:     model.AutocompleteArgTypeStaticList,
    27  		Data:     fixedArgs,
    28  	}
    29  	found, _, _, suggestions := parseStaticListArgument(argument, "", "") //TODO understand this!
    30  	assert.True(t, found)
    31  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "on", Suggestion: "on", Hint: "[hint]", Description: "help"}}, suggestions)
    32  
    33  	found, _, _, suggestions = parseStaticListArgument(argument, "", "o")
    34  	assert.True(t, found)
    35  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "on", Suggestion: "on", Hint: "[hint]", Description: "help"}}, suggestions)
    36  
    37  	found, parsed, toBeParsed, _ := parseStaticListArgument(argument, "", "on ")
    38  	assert.False(t, found)
    39  	assert.Equal(t, "on ", parsed)
    40  	assert.Equal(t, "", toBeParsed)
    41  
    42  	found, parsed, toBeParsed, _ = parseStaticListArgument(argument, "", "on some")
    43  	assert.False(t, found)
    44  	assert.Equal(t, "on ", parsed)
    45  	assert.Equal(t, "some", toBeParsed)
    46  
    47  	fixedArgs.PossibleArguments = append(fixedArgs.PossibleArguments,
    48  		model.AutocompleteListItem{Hint: "[hint]", Item: "off", HelpText: "help"})
    49  
    50  	found, _, _, suggestions = parseStaticListArgument(argument, "", "o")
    51  	assert.True(t, found)
    52  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "on", Suggestion: "on", Hint: "[hint]", Description: "help"}, {Complete: "off", Suggestion: "off", Hint: "[hint]", Description: "help"}}, suggestions)
    53  
    54  	found, _, _, suggestions = parseStaticListArgument(argument, "", "of")
    55  	assert.True(t, found)
    56  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "off", Suggestion: "off", Hint: "[hint]", Description: "help"}}, suggestions)
    57  
    58  	found, _, _, suggestions = parseStaticListArgument(argument, "", "o some")
    59  	assert.True(t, found)
    60  	assert.Len(t, suggestions, 0)
    61  
    62  	found, parsed, toBeParsed, _ = parseStaticListArgument(argument, "", "off some")
    63  	assert.False(t, found)
    64  	assert.Equal(t, "off ", parsed)
    65  	assert.Equal(t, "some", toBeParsed)
    66  
    67  	fixedArgs.PossibleArguments = append(fixedArgs.PossibleArguments,
    68  		model.AutocompleteListItem{Hint: "[hint]", Item: "onon", HelpText: "help"})
    69  
    70  	found, _, _, suggestions = parseStaticListArgument(argument, "", "on")
    71  	assert.True(t, found)
    72  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "on", Suggestion: "on", Hint: "[hint]", Description: "help"}, {Complete: "onon", Suggestion: "onon", Hint: "[hint]", Description: "help"}}, suggestions)
    73  
    74  	found, _, _, suggestions = parseStaticListArgument(argument, "bla ", "ono")
    75  	assert.True(t, found)
    76  	assert.Equal(t, []model.AutocompleteSuggestion{{Complete: "bla onon", Suggestion: "onon", Hint: "[hint]", Description: "help"}}, suggestions)
    77  
    78  	found, parsed, toBeParsed, _ = parseStaticListArgument(argument, "", "on some")
    79  	assert.False(t, found)
    80  	assert.Equal(t, "on ", parsed)
    81  	assert.Equal(t, "some", toBeParsed)
    82  
    83  	found, parsed, toBeParsed, _ = parseStaticListArgument(argument, "", "onon some")
    84  	assert.False(t, found)
    85  	assert.Equal(t, "onon ", parsed)
    86  	assert.Equal(t, "some", toBeParsed)
    87  }
    88  
    89  func TestParseInputTextArgument(t *testing.T) {
    90  	argument := &model.AutocompleteArg{
    91  		Name:     "", //positional
    92  		HelpText: "some_help",
    93  		Type:     model.AutocompleteArgTypeText,
    94  		Data:     &model.AutocompleteTextArg{Hint: "hint", Pattern: "pat"},
    95  	}
    96  
    97  	found, _, _, suggestion := parseInputTextArgument(argument, "", "")
    98  	assert.True(t, found)
    99  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "", Suggestion: "", Hint: "hint", Description: "some_help"}, suggestion)
   100  
   101  	found, _, _, suggestion = parseInputTextArgument(argument, "", " ")
   102  	assert.True(t, found)
   103  	assert.Equal(t, model.AutocompleteSuggestion{Complete: " ", Suggestion: "", Hint: "hint", Description: "some_help"}, suggestion)
   104  
   105  	found, _, _, suggestion = parseInputTextArgument(argument, "", "abc")
   106  	assert.True(t, found)
   107  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "abc", Suggestion: "", Hint: "hint", Description: "some_help"}, suggestion)
   108  
   109  	found, _, _, suggestion = parseInputTextArgument(argument, "", "\"abc dfd df ")
   110  	assert.True(t, found)
   111  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "\"abc dfd df ", Suggestion: "", Hint: "hint", Description: "some_help"}, suggestion)
   112  
   113  	found, parsed, toBeParsed, _ := parseInputTextArgument(argument, "", "abc efg ")
   114  	assert.False(t, found)
   115  	assert.Equal(t, "abc ", parsed)
   116  	assert.Equal(t, "efg ", toBeParsed)
   117  
   118  	found, parsed, toBeParsed, _ = parseInputTextArgument(argument, "", "abc ")
   119  	assert.False(t, found)
   120  	assert.Equal(t, "abc ", parsed)
   121  	assert.Equal(t, "", toBeParsed)
   122  
   123  	found, parsed, toBeParsed, _ = parseInputTextArgument(argument, "", "\"abc def\" abc")
   124  	assert.False(t, found)
   125  	assert.Equal(t, "\"abc def\" ", parsed)
   126  	assert.Equal(t, "abc", toBeParsed)
   127  
   128  	found, parsed, toBeParsed, _ = parseInputTextArgument(argument, "", "\"abc def\"")
   129  	assert.False(t, found)
   130  	assert.Equal(t, "\"abc def\"", parsed)
   131  	assert.Equal(t, "", toBeParsed)
   132  }
   133  
   134  func TestParseNamedArguments(t *testing.T) {
   135  	argument := &model.AutocompleteArg{
   136  		Name:     "name", //named
   137  		HelpText: "some_help",
   138  		Type:     model.AutocompleteArgTypeText,
   139  		Data:     &model.AutocompleteTextArg{Hint: "hint", Pattern: "pat"},
   140  	}
   141  
   142  	found, _, _, suggestion := parseNamedArgument(argument, "", "")
   143  	assert.True(t, found)
   144  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "--name ", Suggestion: "--name", Hint: "", Description: "some_help"}, suggestion)
   145  
   146  	found, _, _, suggestion = parseNamedArgument(argument, "", " ")
   147  	assert.True(t, found)
   148  	assert.Equal(t, model.AutocompleteSuggestion{Complete: " --name ", Suggestion: "--name", Hint: "", Description: "some_help"}, suggestion)
   149  
   150  	found, parsed, toBeParsed, _ := parseNamedArgument(argument, "", "abc")
   151  	assert.False(t, found)
   152  	assert.Equal(t, "abc", parsed)
   153  	assert.Equal(t, "", toBeParsed)
   154  
   155  	found, parsed, toBeParsed, suggestion = parseNamedArgument(argument, "", "-")
   156  	assert.True(t, found)
   157  	assert.Equal(t, "-", parsed)
   158  	assert.Equal(t, "", toBeParsed)
   159  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "--name ", Suggestion: "--name", Hint: "", Description: "some_help"}, suggestion)
   160  
   161  	found, parsed, toBeParsed, suggestion = parseNamedArgument(argument, "", " -")
   162  	assert.True(t, found)
   163  	assert.Equal(t, " -", parsed)
   164  	assert.Equal(t, "", toBeParsed)
   165  	assert.Equal(t, model.AutocompleteSuggestion{Complete: " --name ", Suggestion: "--name", Hint: "", Description: "some_help"}, suggestion)
   166  
   167  	found, parsed, toBeParsed, suggestion = parseNamedArgument(argument, "", "--name")
   168  	assert.True(t, found)
   169  	assert.Equal(t, "--name", parsed)
   170  	assert.Equal(t, "", toBeParsed)
   171  	assert.Equal(t, model.AutocompleteSuggestion{Complete: "--name ", Suggestion: "--name", Hint: "", Description: "some_help"}, suggestion)
   172  
   173  	found, parsed, toBeParsed, _ = parseNamedArgument(argument, "", "--name bla")
   174  	assert.False(t, found)
   175  	assert.Equal(t, "--name ", parsed)
   176  	assert.Equal(t, "bla", toBeParsed)
   177  
   178  	found, parsed, toBeParsed, _ = parseNamedArgument(argument, "", "--name bla gla")
   179  	assert.False(t, found)
   180  	assert.Equal(t, "--name ", parsed)
   181  	assert.Equal(t, "bla gla", toBeParsed)
   182  
   183  	found, parsed, toBeParsed, _ = parseNamedArgument(argument, "", "--name \"bla gla\"")
   184  	assert.False(t, found)
   185  	assert.Equal(t, "--name ", parsed)
   186  	assert.Equal(t, "\"bla gla\"", toBeParsed)
   187  
   188  	found, parsed, toBeParsed, _ = parseNamedArgument(argument, "", "--name \"bla gla\" ")
   189  	assert.False(t, found)
   190  	assert.Equal(t, "--name ", parsed)
   191  	assert.Equal(t, "\"bla gla\" ", toBeParsed)
   192  
   193  	found, parsed, toBeParsed, _ = parseNamedArgument(argument, "", "bla")
   194  	assert.False(t, found)
   195  	assert.Equal(t, "bla", parsed)
   196  	assert.Equal(t, "", toBeParsed)
   197  
   198  }
   199  
   200  func TestSuggestions(t *testing.T) {
   201  	th := Setup(t)
   202  	defer th.TearDown()
   203  
   204  	jira := createJiraAutocompleteData()
   205  	emptyCmdArgs := &model.CommandArgs{}
   206  
   207  	suggestions := th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "ji", model.SYSTEM_ADMIN_ROLE_ID)
   208  	assert.Len(t, suggestions, 1)
   209  	assert.Equal(t, jira.Trigger, suggestions[0].Complete)
   210  	assert.Equal(t, jira.Trigger, suggestions[0].Suggestion)
   211  	assert.Equal(t, "[command]", suggestions[0].Hint)
   212  	assert.Equal(t, jira.HelpText, suggestions[0].Description)
   213  
   214  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira crea", model.SYSTEM_ADMIN_ROLE_ID)
   215  	assert.Len(t, suggestions, 1)
   216  	assert.Equal(t, "jira create", suggestions[0].Complete)
   217  	assert.Equal(t, "create", suggestions[0].Suggestion)
   218  	assert.Equal(t, "[issue text]", suggestions[0].Hint)
   219  	assert.Equal(t, "Create a new Issue", suggestions[0].Description)
   220  
   221  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira c", model.SYSTEM_ADMIN_ROLE_ID)
   222  	assert.Len(t, suggestions, 2)
   223  	assert.Equal(t, "jira create", suggestions[1].Complete)
   224  	assert.Equal(t, "create", suggestions[1].Suggestion)
   225  	assert.Equal(t, "[issue text]", suggestions[1].Hint)
   226  	assert.Equal(t, "Create a new Issue", suggestions[1].Description)
   227  	assert.Equal(t, "jira connect", suggestions[0].Complete)
   228  	assert.Equal(t, "connect", suggestions[0].Suggestion)
   229  	assert.Equal(t, "[url]", suggestions[0].Hint)
   230  	assert.Equal(t, "Connect your Mattermost account to your Jira account", suggestions[0].Description)
   231  
   232  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira create ", model.SYSTEM_ADMIN_ROLE_ID)
   233  	assert.Len(t, suggestions, 1)
   234  	assert.Equal(t, "jira create ", suggestions[0].Complete)
   235  	assert.Equal(t, "", suggestions[0].Suggestion)
   236  	assert.Equal(t, "[text]", suggestions[0].Hint)
   237  	assert.Equal(t, "This text is optional, will be inserted into the description field", suggestions[0].Description)
   238  
   239  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira create some", model.SYSTEM_ADMIN_ROLE_ID)
   240  	assert.Len(t, suggestions, 1)
   241  	assert.Equal(t, "jira create some", suggestions[0].Complete)
   242  	assert.Equal(t, "", suggestions[0].Suggestion)
   243  	assert.Equal(t, "[text]", suggestions[0].Hint)
   244  	assert.Equal(t, "This text is optional, will be inserted into the description field", suggestions[0].Description)
   245  
   246  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira create some text ", model.SYSTEM_ADMIN_ROLE_ID)
   247  	assert.Len(t, suggestions, 0)
   248  
   249  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "invalid command", model.SYSTEM_ADMIN_ROLE_ID)
   250  	assert.Len(t, suggestions, 0)
   251  
   252  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira settings notifications o", model.SYSTEM_ADMIN_ROLE_ID)
   253  	assert.Len(t, suggestions, 2)
   254  	assert.Equal(t, "jira settings notifications On", suggestions[0].Complete)
   255  	assert.Equal(t, "On", suggestions[0].Suggestion)
   256  	assert.Equal(t, "Turn notifications on", suggestions[0].Hint)
   257  	assert.Equal(t, "", suggestions[0].Description)
   258  	assert.Equal(t, "jira settings notifications Off", suggestions[1].Complete)
   259  	assert.Equal(t, "Off", suggestions[1].Suggestion)
   260  	assert.Equal(t, "Turn notifications off", suggestions[1].Hint)
   261  	assert.Equal(t, "", suggestions[1].Description)
   262  
   263  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira ", model.SYSTEM_ADMIN_ROLE_ID)
   264  	assert.Len(t, suggestions, 11)
   265  
   266  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira ", model.SYSTEM_USER_ROLE_ID)
   267  	assert.Len(t, suggestions, 9)
   268  
   269  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira create \"some issue text", model.SYSTEM_ADMIN_ROLE_ID)
   270  	assert.Len(t, suggestions, 1)
   271  	assert.Equal(t, "jira create \"some issue text", suggestions[0].Complete)
   272  	assert.Equal(t, "", suggestions[0].Suggestion)
   273  	assert.Equal(t, "[text]", suggestions[0].Hint)
   274  	assert.Equal(t, "This text is optional, will be inserted into the description field", suggestions[0].Description)
   275  
   276  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira timezone ", model.SYSTEM_ADMIN_ROLE_ID)
   277  	assert.Len(t, suggestions, 1)
   278  	assert.Equal(t, "jira timezone --zone ", suggestions[0].Complete)
   279  	assert.Equal(t, "--zone", suggestions[0].Suggestion)
   280  	assert.Equal(t, "", suggestions[0].Hint)
   281  	assert.Equal(t, "Set timezone", suggestions[0].Description)
   282  
   283  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira timezone --", model.SYSTEM_ADMIN_ROLE_ID)
   284  	assert.Len(t, suggestions, 1)
   285  	assert.Equal(t, "jira timezone --zone ", suggestions[0].Complete)
   286  	assert.Equal(t, "--zone", suggestions[0].Suggestion)
   287  	assert.Equal(t, "", suggestions[0].Hint)
   288  	assert.Equal(t, "Set timezone", suggestions[0].Description)
   289  
   290  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira timezone --zone ", model.SYSTEM_ADMIN_ROLE_ID)
   291  	assert.Len(t, suggestions, 1)
   292  	assert.Equal(t, "jira timezone --zone ", suggestions[0].Complete)
   293  	assert.Equal(t, "", suggestions[0].Suggestion)
   294  	assert.Equal(t, "[UTC+07:00]", suggestions[0].Hint)
   295  	assert.Equal(t, "Set timezone", suggestions[0].Description)
   296  
   297  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira timezone --zone bla", model.SYSTEM_ADMIN_ROLE_ID)
   298  	assert.Len(t, suggestions, 1)
   299  	assert.Equal(t, "jira timezone --zone bla", suggestions[0].Complete)
   300  	assert.Equal(t, "", suggestions[0].Suggestion)
   301  	assert.Equal(t, "[UTC+07:00]", suggestions[0].Hint)
   302  	assert.Equal(t, "Set timezone", suggestions[0].Description)
   303  
   304  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{jira}, "", "jira timezone bla", model.SYSTEM_ADMIN_ROLE_ID)
   305  	assert.Len(t, suggestions, 0)
   306  
   307  	commandA := &model.Command{
   308  		Trigger:          "alice",
   309  		AutocompleteData: model.NewAutocompleteData("alice", "", ""),
   310  	}
   311  	commandB := &model.Command{
   312  		Trigger:          "bob",
   313  		AutocompleteData: model.NewAutocompleteData("bob", "", ""),
   314  	}
   315  	commandC := &model.Command{
   316  		Trigger:          "charles",
   317  		AutocompleteData: model.NewAutocompleteData("charles", "", ""),
   318  	}
   319  	suggestions = th.App.GetSuggestions(emptyCmdArgs, []*model.Command{commandB, commandC, commandA}, model.SYSTEM_ADMIN_ROLE_ID)
   320  	assert.Len(t, suggestions, 3)
   321  	assert.Equal(t, "alice", suggestions[0].Complete)
   322  	assert.Equal(t, "bob", suggestions[1].Complete)
   323  	assert.Equal(t, "charles", suggestions[2].Complete)
   324  }
   325  
   326  func TestCommandWithOptionalArgs(t *testing.T) {
   327  	th := Setup(t)
   328  	defer th.TearDown()
   329  
   330  	command := createCommandWithOptionalArgs()
   331  	emptyCmdArgs := &model.CommandArgs{}
   332  
   333  	suggestions := th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "comm", model.SYSTEM_ADMIN_ROLE_ID)
   334  	assert.Len(t, suggestions, 1)
   335  	assert.Equal(t, command.Trigger, suggestions[0].Complete)
   336  	assert.Equal(t, command.Trigger, suggestions[0].Suggestion)
   337  	assert.Equal(t, "", suggestions[0].Hint)
   338  	assert.Equal(t, command.HelpText, suggestions[0].Description)
   339  
   340  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command ", model.SYSTEM_ADMIN_ROLE_ID)
   341  	assert.Len(t, suggestions, 4)
   342  	assert.Equal(t, "command subcommand1", suggestions[0].Complete)
   343  	assert.Equal(t, "subcommand1", suggestions[0].Suggestion)
   344  	assert.Equal(t, "", suggestions[0].Hint)
   345  	assert.Equal(t, "", suggestions[0].Description)
   346  	assert.Equal(t, "command subcommand2", suggestions[1].Complete)
   347  	assert.Equal(t, "subcommand2", suggestions[1].Suggestion)
   348  	assert.Equal(t, "", suggestions[1].Hint)
   349  	assert.Equal(t, "", suggestions[1].Description)
   350  	assert.Equal(t, "command subcommand3", suggestions[2].Complete)
   351  	assert.Equal(t, "subcommand3", suggestions[2].Suggestion)
   352  	assert.Equal(t, "", suggestions[2].Hint)
   353  	assert.Equal(t, "", suggestions[2].Description)
   354  
   355  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand1 ", model.SYSTEM_ADMIN_ROLE_ID)
   356  	assert.Len(t, suggestions, 2)
   357  	assert.Equal(t, "command subcommand1 item1", suggestions[0].Complete)
   358  	assert.Equal(t, "item1", suggestions[0].Suggestion)
   359  	assert.Equal(t, "", suggestions[0].Hint)
   360  	assert.Equal(t, "", suggestions[0].Description)
   361  	assert.Equal(t, "command subcommand1 item2", suggestions[1].Complete)
   362  	assert.Equal(t, "item2", suggestions[1].Suggestion)
   363  	assert.Equal(t, "", suggestions[1].Hint)
   364  	assert.Equal(t, "", suggestions[1].Description)
   365  
   366  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand1 item1 ", model.SYSTEM_ADMIN_ROLE_ID)
   367  	assert.Len(t, suggestions, 1)
   368  	assert.Equal(t, "command subcommand1 item1 --name2 ", suggestions[0].Complete)
   369  	assert.Equal(t, "--name2", suggestions[0].Suggestion)
   370  	assert.Equal(t, "", suggestions[0].Hint)
   371  	assert.Equal(t, "arg2", suggestions[0].Description)
   372  
   373  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand1 item1 --name2 bla", model.SYSTEM_ADMIN_ROLE_ID)
   374  	assert.Len(t, suggestions, 1)
   375  	assert.Equal(t, "command subcommand1 item1 --name2 bla", suggestions[0].Complete)
   376  	assert.Equal(t, "", suggestions[0].Suggestion)
   377  	assert.Equal(t, "", suggestions[0].Hint)
   378  	assert.Equal(t, "arg2", suggestions[0].Description)
   379  
   380  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 ", model.SYSTEM_ADMIN_ROLE_ID)
   381  	assert.Len(t, suggestions, 2)
   382  	assert.Equal(t, "command subcommand2 --name1 ", suggestions[0].Complete)
   383  	assert.Equal(t, "--name1", suggestions[0].Suggestion)
   384  	assert.Equal(t, "", suggestions[0].Hint)
   385  	assert.Equal(t, "arg1", suggestions[0].Description)
   386  	assert.Equal(t, "command subcommand2 ", suggestions[1].Complete)
   387  	assert.Equal(t, "", suggestions[1].Suggestion)
   388  	assert.Equal(t, "", suggestions[1].Hint)
   389  	assert.Equal(t, "arg2", suggestions[1].Description)
   390  
   391  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 -", model.SYSTEM_ADMIN_ROLE_ID)
   392  	assert.Len(t, suggestions, 2)
   393  	assert.Equal(t, "command subcommand2 --name1 ", suggestions[0].Complete)
   394  	assert.Equal(t, "--name1", suggestions[0].Suggestion)
   395  	assert.Equal(t, "", suggestions[0].Hint)
   396  	assert.Equal(t, "arg1", suggestions[0].Description)
   397  	assert.Equal(t, "command subcommand2 -", suggestions[1].Complete)
   398  	assert.Equal(t, "", suggestions[1].Suggestion)
   399  	assert.Equal(t, "", suggestions[1].Hint)
   400  	assert.Equal(t, "arg2", suggestions[1].Description)
   401  
   402  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 --name1 ", model.SYSTEM_ADMIN_ROLE_ID)
   403  	assert.Len(t, suggestions, 3)
   404  	assert.Equal(t, "command subcommand2 --name1 item1", suggestions[0].Complete)
   405  	assert.Equal(t, "item1", suggestions[0].Suggestion)
   406  	assert.Equal(t, "", suggestions[0].Hint)
   407  	assert.Equal(t, "", suggestions[0].Description)
   408  	assert.Equal(t, "command subcommand2 --name1 item2", suggestions[1].Complete)
   409  	assert.Equal(t, "item2", suggestions[1].Suggestion)
   410  	assert.Equal(t, "", suggestions[1].Hint)
   411  	assert.Equal(t, "", suggestions[1].Description)
   412  	assert.Equal(t, "command subcommand2 --name1 ", suggestions[2].Complete)
   413  	assert.Equal(t, "", suggestions[2].Suggestion)
   414  	assert.Equal(t, "", suggestions[2].Hint)
   415  	assert.Equal(t, "arg3", suggestions[2].Description)
   416  
   417  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 --name1 item", model.SYSTEM_ADMIN_ROLE_ID)
   418  	assert.Len(t, suggestions, 3)
   419  	assert.Equal(t, "command subcommand2 --name1 item1", suggestions[0].Complete)
   420  	assert.Equal(t, "item1", suggestions[0].Suggestion)
   421  	assert.Equal(t, "", suggestions[0].Hint)
   422  	assert.Equal(t, "", suggestions[0].Description)
   423  	assert.Equal(t, "command subcommand2 --name1 item2", suggestions[1].Complete)
   424  	assert.Equal(t, "item2", suggestions[1].Suggestion)
   425  	assert.Equal(t, "", suggestions[1].Hint)
   426  	assert.Equal(t, "", suggestions[1].Description)
   427  	assert.Equal(t, "command subcommand2 --name1 item", suggestions[2].Complete)
   428  	assert.Equal(t, "", suggestions[2].Suggestion)
   429  	assert.Equal(t, "", suggestions[2].Hint)
   430  	assert.Equal(t, "arg3", suggestions[2].Description)
   431  
   432  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 --name1 item1 ", model.SYSTEM_ADMIN_ROLE_ID)
   433  	assert.Len(t, suggestions, 1)
   434  	assert.Equal(t, "command subcommand2 --name1 item1 ", suggestions[0].Complete)
   435  	assert.Equal(t, "", suggestions[0].Suggestion)
   436  	assert.Equal(t, "", suggestions[0].Hint)
   437  	assert.Equal(t, "arg2", suggestions[0].Description)
   438  
   439  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 --name1 item1 bla ", model.SYSTEM_ADMIN_ROLE_ID)
   440  	assert.Len(t, suggestions, 1)
   441  	assert.Equal(t, "command subcommand2 --name1 item1 bla ", suggestions[0].Complete)
   442  	assert.Equal(t, "", suggestions[0].Suggestion)
   443  	assert.Equal(t, "", suggestions[0].Hint)
   444  	assert.Equal(t, "arg3", suggestions[0].Description)
   445  
   446  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand2 --name1 item1 bla bla ", model.SYSTEM_ADMIN_ROLE_ID)
   447  	assert.Len(t, suggestions, 0)
   448  
   449  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand3 ", model.SYSTEM_ADMIN_ROLE_ID)
   450  	assert.Len(t, suggestions, 3)
   451  	assert.Equal(t, "command subcommand3 --name1 ", suggestions[0].Complete)
   452  	assert.Equal(t, "--name1", suggestions[0].Suggestion)
   453  	assert.Equal(t, "", suggestions[0].Hint)
   454  	assert.Equal(t, "arg1", suggestions[0].Description)
   455  	assert.Equal(t, "command subcommand3 --name2 ", suggestions[1].Complete)
   456  	assert.Equal(t, "--name2", suggestions[1].Suggestion)
   457  	assert.Equal(t, "", suggestions[1].Hint)
   458  	assert.Equal(t, "arg2", suggestions[1].Description)
   459  	assert.Equal(t, "command subcommand3 --name3 ", suggestions[2].Complete)
   460  	assert.Equal(t, "--name3", suggestions[2].Suggestion)
   461  	assert.Equal(t, "", suggestions[2].Hint)
   462  	assert.Equal(t, "arg3", suggestions[2].Description)
   463  
   464  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand3 --name", model.SYSTEM_ADMIN_ROLE_ID)
   465  	assert.Len(t, suggestions, 3)
   466  	assert.Equal(t, "command subcommand3 --name1 ", suggestions[0].Complete)
   467  	assert.Equal(t, "--name1", suggestions[0].Suggestion)
   468  	assert.Equal(t, "", suggestions[0].Hint)
   469  	assert.Equal(t, "arg1", suggestions[0].Description)
   470  	assert.Equal(t, "command subcommand3 --name2 ", suggestions[1].Complete)
   471  	assert.Equal(t, "--name2", suggestions[1].Suggestion)
   472  	assert.Equal(t, "", suggestions[1].Hint)
   473  	assert.Equal(t, "arg2", suggestions[1].Description)
   474  	assert.Equal(t, "command subcommand3 --name3 ", suggestions[2].Complete)
   475  	assert.Equal(t, "--name3", suggestions[2].Suggestion)
   476  	assert.Equal(t, "", suggestions[2].Hint)
   477  	assert.Equal(t, "arg3", suggestions[2].Description)
   478  
   479  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand3 --name1 ", model.SYSTEM_ADMIN_ROLE_ID)
   480  	assert.Len(t, suggestions, 2)
   481  	assert.Equal(t, "command subcommand3 --name1 item1", suggestions[0].Complete)
   482  	assert.Equal(t, "item1", suggestions[0].Suggestion)
   483  	assert.Equal(t, "", suggestions[0].Hint)
   484  	assert.Equal(t, "", suggestions[0].Description)
   485  	assert.Equal(t, "command subcommand3 --name1 item2", suggestions[1].Complete)
   486  	assert.Equal(t, "item2", suggestions[1].Suggestion)
   487  	assert.Equal(t, "", suggestions[1].Hint)
   488  	assert.Equal(t, "", suggestions[1].Description)
   489  
   490  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand4 ", model.SYSTEM_ADMIN_ROLE_ID)
   491  	assert.Len(t, suggestions, 2)
   492  	assert.Equal(t, "command subcommand4 item1", suggestions[0].Complete)
   493  	assert.Equal(t, "item1", suggestions[0].Suggestion)
   494  	assert.Equal(t, "(optional)", suggestions[0].Hint)
   495  	assert.Equal(t, "help3", suggestions[0].Description)
   496  	assert.Equal(t, "command subcommand4 ", suggestions[1].Complete)
   497  	assert.Equal(t, "", suggestions[1].Suggestion)
   498  	assert.Equal(t, "message", suggestions[1].Hint)
   499  	assert.Equal(t, "help4", suggestions[1].Description)
   500  
   501  	suggestions = th.App.getSuggestions(emptyCmdArgs, []*model.AutocompleteData{command}, "", "command subcommand4 item1 ", model.SYSTEM_ADMIN_ROLE_ID)
   502  	assert.Len(t, suggestions, 1)
   503  	assert.Equal(t, "command subcommand4 item1 ", suggestions[0].Complete)
   504  	assert.Equal(t, "", suggestions[0].Suggestion)
   505  	assert.Equal(t, "message", suggestions[0].Hint)
   506  	assert.Equal(t, "help4", suggestions[0].Description)
   507  }
   508  
   509  func createCommandWithOptionalArgs() *model.AutocompleteData {
   510  	command := model.NewAutocompleteData("command", "", "")
   511  	subCommand1 := model.NewAutocompleteData("subcommand1", "", "")
   512  	subCommand1.AddStaticListArgument("arg1", true, []model.AutocompleteListItem{{Item: "item1"}, {Item: "item2"}})
   513  	subCommand1.AddNamedTextArgument("name2", "arg2", "", "", false)
   514  	command.AddCommand(subCommand1)
   515  	subCommand2 := model.NewAutocompleteData("subcommand2", "", "")
   516  	subCommand2.AddNamedStaticListArgument("name1", "arg1", false, []model.AutocompleteListItem{{Item: "item1"}, {Item: "item2"}})
   517  	subCommand2.AddTextArgument("arg2", "", "")
   518  	subCommand2.AddTextArgument("arg3", "", "")
   519  	command.AddCommand(subCommand2)
   520  	subCommand3 := model.NewAutocompleteData("subcommand3", "", "")
   521  	subCommand3.AddNamedStaticListArgument("name1", "arg1", false, []model.AutocompleteListItem{{Item: "item1"}, {Item: "item2"}})
   522  	subCommand3.AddNamedTextArgument("name2", "arg2", "", "", false)
   523  	subCommand3.AddNamedTextArgument("name3", "arg3", "", "", false)
   524  	command.AddCommand(subCommand3)
   525  	subcommand4 := model.NewAutocompleteData("subcommand4", "", "help1")
   526  	subcommand4.AddStaticListArgument("help2", false, []model.AutocompleteListItem{{
   527  		HelpText: "help3",
   528  		Hint:     "(optional)",
   529  		Item:     "item1",
   530  	}})
   531  	subcommand4.AddTextArgument("help4", "message", "")
   532  	command.AddCommand(subcommand4)
   533  
   534  	return command
   535  }
   536  
   537  // createJiraAutocompleteData will create autocomplete data for jira plugin. For testing purposes only.
   538  func createJiraAutocompleteData() *model.AutocompleteData {
   539  	jira := model.NewAutocompleteData("jira", "[command]", "Available commands: connect, assign, disconnect, create, transition, view, subscribe, settings, install cloud/server, uninstall cloud/server, help")
   540  
   541  	connect := model.NewAutocompleteData("connect", "[url]", "Connect your Mattermost account to your Jira account")
   542  	jira.AddCommand(connect)
   543  
   544  	disconnect := model.NewAutocompleteData("disconnect", "", "Disconnect your Mattermost account from your Jira account")
   545  	jira.AddCommand(disconnect)
   546  
   547  	assign := model.NewAutocompleteData("assign", "[issue]", "Change the assignee of a Jira issue")
   548  	assign.AddDynamicListArgument("List of issues is downloading from your Jira account", "/url/issue-key", true)
   549  	assign.AddDynamicListArgument("List of assignees is downloading from your Jira account", "/url/assignee", true)
   550  	jira.AddCommand(assign)
   551  
   552  	create := model.NewAutocompleteData("create", "[issue text]", "Create a new Issue")
   553  	create.AddTextArgument("This text is optional, will be inserted into the description field", "[text]", "")
   554  	jira.AddCommand(create)
   555  
   556  	transition := model.NewAutocompleteData("transition", "[issue]", "Change the state of a Jira issue")
   557  	assign.AddDynamicListArgument("List of issues is downloading from your Jira account", "/url/issue-key", true)
   558  	assign.AddDynamicListArgument("List of states is downloading from your Jira account", "/url/states", true)
   559  	jira.AddCommand(transition)
   560  
   561  	subscribe := model.NewAutocompleteData("subscribe", "", "Configure the Jira notifications sent to this channel")
   562  	jira.AddCommand(subscribe)
   563  
   564  	view := model.NewAutocompleteData("view", "[issue]", "View the details of a specific Jira issue")
   565  	assign.AddDynamicListArgument("List of issues is downloading from your Jira account", "/url/issue-key", true)
   566  	jira.AddCommand(view)
   567  
   568  	settings := model.NewAutocompleteData("settings", "", "Update your user settings")
   569  	notifications := model.NewAutocompleteData("notifications", "[on/off]", "Turn notifications on or off")
   570  
   571  	items := []model.AutocompleteListItem{
   572  		{
   573  			Hint: "Turn notifications on",
   574  			Item: "On",
   575  		},
   576  		{
   577  			Hint: "Turn notifications off",
   578  			Item: "Off",
   579  		},
   580  	}
   581  	notifications.AddStaticListArgument("Turn notifications on or off", true, items)
   582  	settings.AddCommand(notifications)
   583  	jira.AddCommand(settings)
   584  
   585  	timezone := model.NewAutocompleteData("timezone", "", "Update your timezone")
   586  	timezone.AddNamedTextArgument("zone", "Set timezone", "[UTC+07:00]", "", true)
   587  	jira.AddCommand(timezone)
   588  
   589  	install := model.NewAutocompleteData("install", "", "Connect Mattermost to a Jira instance")
   590  	install.RoleID = model.SYSTEM_ADMIN_ROLE_ID
   591  	cloud := model.NewAutocompleteData("cloud", "", "Connect to a Jira Cloud instance")
   592  	urlPattern := "https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)"
   593  	cloud.AddTextArgument("input URL of the Jira Cloud instance", "[URL]", urlPattern)
   594  	install.AddCommand(cloud)
   595  	server := model.NewAutocompleteData("server", "", "Connect to a Jira Server or Data Center instance")
   596  	server.AddTextArgument("input URL of the Jira Server or Data Center instance", "[URL]", urlPattern)
   597  	install.AddCommand(server)
   598  	jira.AddCommand(install)
   599  
   600  	uninstall := model.NewAutocompleteData("uninstall", "", "Disconnect Mattermost from a Jira instance")
   601  	uninstall.RoleID = model.SYSTEM_ADMIN_ROLE_ID
   602  	cloud = model.NewAutocompleteData("cloud", "", "Disconnect from a Jira Cloud instance")
   603  	cloud.AddTextArgument("input URL of the Jira Cloud instance", "[URL]", urlPattern)
   604  	uninstall.AddCommand(cloud)
   605  	server = model.NewAutocompleteData("server", "", "Disconnect from a Jira Server or Data Center instance")
   606  	server.AddTextArgument("input URL of the Jira Server or Data Center instance", "[URL]", urlPattern)
   607  	uninstall.AddCommand(server)
   608  	jira.AddCommand(uninstall)
   609  
   610  	return jira
   611  }