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  }