github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/cli/command_test.go (about) 1 package cli 2 3 import ( 4 "errors" 5 "flag" 6 "fmt" 7 "io/ioutil" 8 "strings" 9 "testing" 10 ) 11 12 func TestCommandFlagParsing(t *testing.T) { 13 cases := []struct { 14 testArgs []string 15 skipFlagParsing bool 16 expectedErr error 17 }{ 18 {[]string{"blah", "blah", "-break"}, false, errors.New("flag provided but not defined: -break")}, // Test normal "not ignoring flags" flow 19 {[]string{"blah", "blah"}, true, nil}, // Test SkipFlagParsing without any args that look like flags 20 {[]string{"blah", "-break"}, true, nil}, // Test SkipFlagParsing with random flag arg 21 {[]string{"blah", "-help"}, true, nil}, // Test SkipFlagParsing with "special" help flag arg 22 } 23 24 for _, c := range cases { 25 app := NewApp() 26 app.Writer = ioutil.Discard 27 set := flag.NewFlagSet("test", 0) 28 set.Parse(c.testArgs) 29 30 context := NewContext(app, set, nil) 31 32 command := Command{ 33 Name: "test-cmd", 34 Aliases: []string{"tc"}, 35 Usage: "this is for testing", 36 Description: "testing", 37 Action: func(_ *Context) {}, 38 } 39 40 command.SkipFlagParsing = c.skipFlagParsing 41 42 err := command.Run(context) 43 44 expect(t, err, c.expectedErr) 45 expect(t, []string(context.Args()), c.testArgs) 46 } 47 } 48 49 func TestCommand_Run_DoesNotOverwriteErrorFromBefore(t *testing.T) { 50 app := NewApp() 51 app.Commands = []Command{ 52 Command{ 53 Name: "bar", 54 Before: func(c *Context) error { return fmt.Errorf("before error") }, 55 After: func(c *Context) error { return fmt.Errorf("after error") }, 56 }, 57 } 58 59 err := app.Run([]string{"foo", "bar"}) 60 if err == nil { 61 t.Fatalf("expected to receive error from Run, got none") 62 } 63 64 if !strings.Contains(err.Error(), "before error") { 65 t.Errorf("expected text of error from Before method, but got none in \"%v\"", err) 66 } 67 if !strings.Contains(err.Error(), "after error") { 68 t.Errorf("expected text of error from After method, but got none in \"%v\"", err) 69 } 70 } 71 72 func TestCommand_OnUsageError_WithWrongFlagValue(t *testing.T) { 73 app := NewApp() 74 app.Commands = []Command{ 75 Command{ 76 Name: "bar", 77 Flags: []Flag{ 78 IntFlag{Name: "flag"}, 79 }, 80 OnUsageError: func(c *Context, err error) error { 81 if !strings.HasPrefix(err.Error(), "invalid value \"wrong\"") { 82 t.Errorf("Expect an invalid value error, but got \"%v\"", err) 83 } 84 return errors.New("intercepted: " + err.Error()) 85 }, 86 }, 87 } 88 89 err := app.Run([]string{"foo", "bar", "--flag=wrong"}) 90 if err == nil { 91 t.Fatalf("expected to receive error from Run, got none") 92 } 93 94 if !strings.HasPrefix(err.Error(), "intercepted: invalid value") { 95 t.Errorf("Expect an intercepted error, but got \"%v\"", err) 96 } 97 }