2015-07-20 19:18:25 +00:00
|
|
|
package cli
|
2015-05-04 01:02:03 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2016-05-08 00:22:09 +00:00
|
|
|
"flag"
|
|
|
|
"strings"
|
2015-05-04 01:02:03 +00:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2015-05-04 01:04:45 +00:00
|
|
|
func Test_ShowAppHelp_NoAuthor(t *testing.T) {
|
2015-05-04 01:02:03 +00:00
|
|
|
output := new(bytes.Buffer)
|
2016-06-22 16:47:57 +00:00
|
|
|
app := &App{Writer: output}
|
2015-05-04 01:02:03 +00:00
|
|
|
|
2015-07-20 19:18:25 +00:00
|
|
|
c := NewContext(app, nil, nil)
|
2015-05-04 01:02:03 +00:00
|
|
|
|
2015-07-20 19:18:25 +00:00
|
|
|
ShowAppHelp(c)
|
2015-05-04 01:02:03 +00:00
|
|
|
|
|
|
|
if bytes.Index(output.Bytes(), []byte("AUTHOR(S):")) != -1 {
|
|
|
|
t.Errorf("expected\n%snot to include %s", output.String(), "AUTHOR(S):")
|
|
|
|
}
|
|
|
|
}
|
2015-06-25 06:07:32 +00:00
|
|
|
|
|
|
|
func Test_ShowAppHelp_NoVersion(t *testing.T) {
|
|
|
|
output := new(bytes.Buffer)
|
2016-06-22 16:47:57 +00:00
|
|
|
app := &App{Writer: output}
|
2015-06-25 06:07:32 +00:00
|
|
|
|
2015-06-25 06:11:59 +00:00
|
|
|
app.Version = ""
|
|
|
|
|
2015-07-20 19:18:25 +00:00
|
|
|
c := NewContext(app, nil, nil)
|
2015-06-25 06:07:32 +00:00
|
|
|
|
2015-07-20 19:18:25 +00:00
|
|
|
ShowAppHelp(c)
|
2015-06-25 06:07:32 +00:00
|
|
|
|
|
|
|
if bytes.Index(output.Bytes(), []byte("VERSION:")) != -1 {
|
|
|
|
t.Errorf("expected\n%snot to include %s", output.String(), "VERSION:")
|
|
|
|
}
|
|
|
|
}
|
2015-10-13 22:03:47 +00:00
|
|
|
|
2016-03-11 16:25:30 +00:00
|
|
|
func Test_ShowAppHelp_HideVersion(t *testing.T) {
|
|
|
|
output := new(bytes.Buffer)
|
2016-06-22 16:47:57 +00:00
|
|
|
app := &App{Writer: output}
|
2016-03-11 16:25:30 +00:00
|
|
|
|
|
|
|
app.HideVersion = true
|
|
|
|
|
|
|
|
c := NewContext(app, nil, nil)
|
|
|
|
|
|
|
|
ShowAppHelp(c)
|
|
|
|
|
|
|
|
if bytes.Index(output.Bytes(), []byte("VERSION:")) != -1 {
|
|
|
|
t.Errorf("expected\n%snot to include %s", output.String(), "VERSION:")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-13 22:03:47 +00:00
|
|
|
func Test_Help_Custom_Flags(t *testing.T) {
|
|
|
|
oldFlag := HelpFlag
|
|
|
|
defer func() {
|
|
|
|
HelpFlag = oldFlag
|
|
|
|
}()
|
|
|
|
|
2016-05-22 19:20:52 +00:00
|
|
|
HelpFlag = &BoolFlag{
|
2016-05-22 01:29:45 +00:00
|
|
|
Name: "help",
|
|
|
|
Aliases: []string{"x"},
|
|
|
|
Usage: "show help",
|
2015-10-13 22:03:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
app := App{
|
|
|
|
Flags: []Flag{
|
2016-05-22 19:20:52 +00:00
|
|
|
&BoolFlag{Name: "foo", Aliases: []string{"h"}},
|
2015-10-13 22:03:47 +00:00
|
|
|
},
|
2016-04-27 13:12:34 +00:00
|
|
|
Action: func(ctx *Context) error {
|
2015-10-13 22:03:47 +00:00
|
|
|
if ctx.Bool("h") != true {
|
|
|
|
t.Errorf("custom help flag not set")
|
|
|
|
}
|
2016-04-27 13:12:34 +00:00
|
|
|
return nil
|
2015-10-13 22:03:47 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
output := new(bytes.Buffer)
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"test", "-h"})
|
|
|
|
if output.Len() > 0 {
|
|
|
|
t.Errorf("unexpected output: %s", output.String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_Version_Custom_Flags(t *testing.T) {
|
|
|
|
oldFlag := VersionFlag
|
|
|
|
defer func() {
|
|
|
|
VersionFlag = oldFlag
|
|
|
|
}()
|
|
|
|
|
2016-05-22 19:20:52 +00:00
|
|
|
VersionFlag = &BoolFlag{
|
2016-05-22 01:29:45 +00:00
|
|
|
Name: "version",
|
|
|
|
Aliases: []string{"V"},
|
|
|
|
Usage: "show version",
|
2015-10-13 22:03:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
app := App{
|
|
|
|
Flags: []Flag{
|
2016-05-22 19:20:52 +00:00
|
|
|
&BoolFlag{Name: "foo", Aliases: []string{"v"}},
|
2015-10-13 22:03:47 +00:00
|
|
|
},
|
2016-04-27 13:12:34 +00:00
|
|
|
Action: func(ctx *Context) error {
|
2015-10-13 22:03:47 +00:00
|
|
|
if ctx.Bool("v") != true {
|
|
|
|
t.Errorf("custom version flag not set")
|
|
|
|
}
|
2016-04-27 13:12:34 +00:00
|
|
|
return nil
|
2015-10-13 22:03:47 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
output := new(bytes.Buffer)
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"test", "-v"})
|
|
|
|
if output.Len() > 0 {
|
|
|
|
t.Errorf("unexpected output: %s", output.String())
|
|
|
|
}
|
|
|
|
}
|
2016-05-08 00:22:09 +00:00
|
|
|
|
|
|
|
func Test_helpCommand_Action_ErrorIfNoTopic(t *testing.T) {
|
2016-06-22 16:47:57 +00:00
|
|
|
app := &App{}
|
2016-05-08 00:22:09 +00:00
|
|
|
|
|
|
|
set := flag.NewFlagSet("test", 0)
|
|
|
|
set.Parse([]string{"foo"})
|
|
|
|
|
|
|
|
c := NewContext(app, set, nil)
|
|
|
|
|
2016-05-17 19:11:44 +00:00
|
|
|
err := helpCommand.Action(c)
|
2016-05-08 00:22:09 +00:00
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expected error from helpCommand.Action(), but got nil")
|
|
|
|
}
|
|
|
|
|
2016-05-25 16:05:14 +00:00
|
|
|
exitErr, ok := err.(*exitError)
|
2016-05-08 00:22:09 +00:00
|
|
|
if !ok {
|
2016-05-25 16:05:14 +00:00
|
|
|
t.Fatalf("expected *exitError from helpCommand.Action(), but instead got: %v", err.Error())
|
2016-05-08 00:22:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.HasPrefix(exitErr.Error(), "No help topic for") {
|
|
|
|
t.Fatalf("expected an unknown help topic error, but got: %v", exitErr.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
if exitErr.exitCode != 3 {
|
|
|
|
t.Fatalf("expected exit value = 3, got %d instead", exitErr.exitCode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-22 13:41:42 +00:00
|
|
|
func Test_helpCommand_InHelpOutput(t *testing.T) {
|
2016-06-23 03:07:20 +00:00
|
|
|
app := &App{}
|
2016-06-22 13:41:42 +00:00
|
|
|
output := &bytes.Buffer{}
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"test", "--help"})
|
|
|
|
|
|
|
|
s := output.String()
|
|
|
|
|
|
|
|
if strings.Contains(s, "\nCOMMANDS:\nGLOBAL OPTIONS:\n") {
|
|
|
|
t.Fatalf("empty COMMANDS section detected: %q", s)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.Contains(s, "help, h") {
|
|
|
|
t.Fatalf("missing \"help, h\": %q", s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-08 00:22:09 +00:00
|
|
|
func Test_helpSubcommand_Action_ErrorIfNoTopic(t *testing.T) {
|
2016-06-22 16:47:57 +00:00
|
|
|
app := &App{}
|
2016-05-08 00:22:09 +00:00
|
|
|
|
|
|
|
set := flag.NewFlagSet("test", 0)
|
|
|
|
set.Parse([]string{"foo"})
|
|
|
|
|
|
|
|
c := NewContext(app, set, nil)
|
|
|
|
|
2016-05-17 19:11:44 +00:00
|
|
|
err := helpSubcommand.Action(c)
|
2016-05-08 00:22:09 +00:00
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expected error from helpCommand.Action(), but got nil")
|
|
|
|
}
|
|
|
|
|
2016-05-25 16:05:14 +00:00
|
|
|
exitErr, ok := err.(*exitError)
|
2016-05-08 00:22:09 +00:00
|
|
|
if !ok {
|
2016-05-25 16:05:14 +00:00
|
|
|
t.Fatalf("expected *exitError from helpCommand.Action(), but instead got: %v", err.Error())
|
2016-05-08 00:22:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.HasPrefix(exitErr.Error(), "No help topic for") {
|
|
|
|
t.Fatalf("expected an unknown help topic error, but got: %v", exitErr.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
if exitErr.exitCode != 3 {
|
|
|
|
t.Fatalf("expected exit value = 3, got %d instead", exitErr.exitCode)
|
|
|
|
}
|
|
|
|
}
|
2016-05-09 04:59:36 +00:00
|
|
|
|
2016-05-10 17:41:43 +00:00
|
|
|
func TestShowAppHelp_CommandAliases(t *testing.T) {
|
|
|
|
app := &App{
|
2016-05-22 19:20:52 +00:00
|
|
|
Commands: []*Command{
|
2016-05-10 17:41:43 +00:00
|
|
|
{
|
|
|
|
Name: "frobbly",
|
|
|
|
Aliases: []string{"fr", "frob"},
|
|
|
|
Action: func(ctx *Context) error {
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
output := &bytes.Buffer{}
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"foo", "--help"})
|
|
|
|
|
|
|
|
if !strings.Contains(output.String(), "frobbly, fr, frob") {
|
|
|
|
t.Errorf("expected output to include all command aliases; got: %q", output.String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestShowCommandHelp_CommandAliases(t *testing.T) {
|
|
|
|
app := &App{
|
2016-05-22 19:20:52 +00:00
|
|
|
Commands: []*Command{
|
2016-05-10 17:41:43 +00:00
|
|
|
{
|
|
|
|
Name: "frobbly",
|
|
|
|
Aliases: []string{"fr", "frob", "bork"},
|
|
|
|
Action: func(ctx *Context) error {
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
output := &bytes.Buffer{}
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"foo", "help", "fr"})
|
|
|
|
|
|
|
|
if !strings.Contains(output.String(), "frobbly") {
|
|
|
|
t.Errorf("expected output to include command name; got: %q", output.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.Contains(output.String(), "bork") {
|
|
|
|
t.Errorf("expected output to exclude command aliases; got: %q", output.String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestShowSubcommandHelp_CommandAliases(t *testing.T) {
|
|
|
|
app := &App{
|
2016-05-22 19:20:52 +00:00
|
|
|
Commands: []*Command{
|
2016-05-10 17:41:43 +00:00
|
|
|
{
|
|
|
|
Name: "frobbly",
|
|
|
|
Aliases: []string{"fr", "frob", "bork"},
|
|
|
|
Action: func(ctx *Context) error {
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
output := &bytes.Buffer{}
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"foo", "help"})
|
|
|
|
|
|
|
|
if !strings.Contains(output.String(), "frobbly, fr, frob, bork") {
|
2016-05-10 17:51:54 +00:00
|
|
|
t.Errorf("expected output to include all command aliases; got: %q", output.String())
|
2016-05-10 17:41:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-03 09:51:26 +00:00
|
|
|
func TestShowAppHelp_HiddenCommand(t *testing.T) {
|
|
|
|
app := &App{
|
2016-05-22 19:20:52 +00:00
|
|
|
Commands: []*Command{
|
2016-05-09 13:40:09 +00:00
|
|
|
{
|
2016-05-03 09:51:26 +00:00
|
|
|
Name: "frobbly",
|
|
|
|
Action: func(ctx *Context) error {
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
},
|
2016-05-09 13:40:09 +00:00
|
|
|
{
|
2016-05-03 09:51:26 +00:00
|
|
|
Name: "secretfrob",
|
|
|
|
Hidden: true,
|
|
|
|
Action: func(ctx *Context) error {
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
output := &bytes.Buffer{}
|
|
|
|
app.Writer = output
|
|
|
|
app.Run([]string{"app", "--help"})
|
|
|
|
|
|
|
|
if strings.Contains(output.String(), "secretfrob") {
|
2016-05-03 10:54:05 +00:00
|
|
|
t.Errorf("expected output to exclude \"secretfrob\"; got: %q", output.String())
|
2016-05-03 09:51:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.Contains(output.String(), "frobbly") {
|
2016-05-03 10:54:05 +00:00
|
|
|
t.Errorf("expected output to include \"frobbly\"; got: %q", output.String())
|
2016-05-03 09:51:26 +00:00
|
|
|
}
|
|
|
|
}
|