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 }