github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/flags/flags_test.go (about)

     1  package flags_test
     2  
     3  import (
     4  	. "github.com/cloudfoundry/cli/flags"
     5  	"github.com/cloudfoundry/cli/flags/flag"
     6  
     7  	. "github.com/onsi/ginkgo"
     8  	. "github.com/onsi/gomega"
     9  )
    10  
    11  var _ = Describe("Flags", func() {
    12  
    13  	Describe("FlagContext", func() {
    14  
    15  		Describe("Parsing and retriving values", func() {
    16  
    17  			var (
    18  				fCtx       FlagContext
    19  				cmdFlagMap map[string]FlagSet
    20  			)
    21  
    22  			BeforeEach(func() {
    23  				cmdFlagMap = make(map[string]FlagSet)
    24  
    25  				cmdFlagMap["name"] = &cliFlags.StringFlag{Name: "name", Usage: "test string flag"}
    26  				cmdFlagMap["skip"] = &cliFlags.BoolFlag{Name: "skip", Usage: "test bool flag"}
    27  				cmdFlagMap["instance"] = &cliFlags.IntFlag{Name: "instance", Usage: "test int flag"}
    28  				cmdFlagMap["skip2"] = &cliFlags.BoolFlag{Name: "skip2", Usage: "test bool flag"}
    29  				cmdFlagMap["slice"] = &cliFlags.StringSliceFlag{Name: "slice", Usage: "test stringSlice flag"}
    30  
    31  				fCtx = NewFlagContext(cmdFlagMap)
    32  			})
    33  
    34  			It("accepts flags with either single '-' or double '-' ", func() {
    35  				err := fCtx.Parse("--name", "blue")
    36  				Ω(err).ToNot(HaveOccurred())
    37  
    38  				err = fCtx.Parse("-name", "")
    39  				Ω(err).ToNot(HaveOccurred())
    40  			})
    41  
    42  			It("checks if a flag is defined in the FlagContext", func() {
    43  				err := fCtx.Parse("-not_defined", "")
    44  				Ω(err).To(HaveOccurred())
    45  
    46  				err = fCtx.Parse("-name", "blue")
    47  				Ω(err).ToNot(HaveOccurred())
    48  
    49  				err = fCtx.Parse("--skip", "")
    50  				Ω(err).ToNot(HaveOccurred())
    51  			})
    52  
    53  			It("sets Bool(<flag>) to return value if bool flag is provided with value true/false", func() {
    54  				err := fCtx.Parse("--skip=false", "-skip2", "true", "-name=johndoe")
    55  				Ω(err).ToNot(HaveOccurred())
    56  
    57  				Ω(len(fCtx.Args())).To(Equal(0), "Length of Args() should be 0")
    58  				Ω(fCtx.Bool("skip")).To(Equal(false), "skip should be false")
    59  				Ω(fCtx.Bool("skip2")).To(Equal(true), "skip2 should be true")
    60  				Ω(fCtx.Bool("name")).To(Equal(false), "name should be false")
    61  				Ω(fCtx.String("name")).To(Equal("johndoe"), "name should be johndoe")
    62  				Ω(fCtx.Bool("non-exisit-flag")).To(Equal(false))
    63  			})
    64  
    65  			It("sets Bool(<flag>) to return true if bool flag is provided with invalid value", func() {
    66  				err := fCtx.Parse("--skip=Not_Valid", "skip2", "FALSE", "-name", "johndoe")
    67  				Ω(err).ToNot(HaveOccurred())
    68  
    69  				Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true")
    70  				Ω(fCtx.Bool("skip2")).To(Equal(false), "skip2 should be false")
    71  			})
    72  
    73  			It("sets Bool(<flag>) to return true when a bool flag is provided without value", func() {
    74  				err := fCtx.Parse("--skip", "-name", "johndoe")
    75  				Ω(err).ToNot(HaveOccurred())
    76  
    77  				Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true")
    78  				Ω(fCtx.Bool("name")).To(Equal(false), "name should be false")
    79  				Ω(fCtx.Bool("non-exisit-flag")).To(Equal(false))
    80  			})
    81  
    82  			It("sets String(<flag>) to return provided value when a string flag is provided", func() {
    83  				err := fCtx.Parse("--skip", "-name", "doe")
    84  				Ω(err).ToNot(HaveOccurred())
    85  
    86  				Ω(fCtx.String("name")).To(Equal("doe"))
    87  				Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true")
    88  			})
    89  
    90  			It("sets StringSlice(<flag>) to return provided value when a stringSlice flag is provided", func() {
    91  				err := fCtx.Parse("-slice", "value1", "-slice", "value2")
    92  				Ω(err).ToNot(HaveOccurred())
    93  
    94  				Ω(fCtx.StringSlice("slice")[0]).To(Equal("value1"), "slice[0] should be 'value1'")
    95  				Ω(fCtx.StringSlice("slice")[1]).To(Equal("value2"), "slice[1] should be 'value2'")
    96  			})
    97  
    98  			It("errors when a non-boolean flag is provided without a value", func() {
    99  				err := fCtx.Parse("-name")
   100  				Ω(err).To(HaveOccurred())
   101  				Ω(err.Error()).To(ContainSubstring("No value provided for flag"))
   102  				Ω(fCtx.String("name")).To(Equal(""))
   103  			})
   104  
   105  			It("sets Int(<flag>) to return provided value when a int flag is provided", func() {
   106  				err := fCtx.Parse("--instance", "10")
   107  				Ω(err).ToNot(HaveOccurred())
   108  
   109  				Ω(fCtx.Int("instance")).To(Equal(10))
   110  				Ω(fCtx.IsSet("instance")).To(Equal(true))
   111  
   112  				Ω(fCtx.Int("non-exist-flag")).To(Equal(0))
   113  				Ω(fCtx.IsSet("non-exist-flag")).To(Equal(false))
   114  			})
   115  
   116  			It("returns any non-flag arguments in Args()", func() {
   117  				err := fCtx.Parse("Arg-1", "--instance", "10", "--skip", "Arg-2")
   118  				Ω(err).ToNot(HaveOccurred())
   119  
   120  				Ω(len(fCtx.Args())).To(Equal(2))
   121  				Ω(fCtx.Args()[0]).To(Equal("Arg-1"))
   122  				Ω(fCtx.Args()[1]).To(Equal("Arg-2"))
   123  			})
   124  
   125  			It("accepts flag/value in the forms of '-flag=value' and '-flag value'", func() {
   126  				err := fCtx.Parse("-instance", "10", "--name=foo", "--skip", "Arg-1")
   127  				Ω(err).ToNot(HaveOccurred())
   128  
   129  				Ω(fCtx.IsSet("instance")).To(Equal(true))
   130  				Ω(fCtx.Int("instance")).To(Equal(10))
   131  
   132  				Ω(fCtx.IsSet("name")).To(Equal(true))
   133  				Ω(fCtx.String("name")).To(Equal("foo"))
   134  
   135  				Ω(fCtx.IsSet("skip")).To(Equal(true))
   136  
   137  				Ω(len(fCtx.Args())).To(Equal(1))
   138  				Ω(fCtx.Args()[0]).To(Equal("Arg-1"))
   139  			})
   140  
   141  			Context("Default Flag Value", func() {
   142  
   143  				BeforeEach(func() {
   144  					cmdFlagMap = make(map[string]FlagSet)
   145  
   146  					cmdFlagMap["defaultStringFlag"] = &cliFlags.StringFlag{Name: "defaultStringFlag", Value: "Set by default"}
   147  					cmdFlagMap["defaultBoolFlag"] = &cliFlags.BoolFlag{Name: "defaultBoolFlag", Value: true}
   148  					cmdFlagMap["defaultIntFlag"] = &cliFlags.IntFlag{Name: "defaultIntFlag", Value: 100}
   149  					cmdFlagMap["defaultStringAryFlag"] = &cliFlags.StringSliceFlag{Name: "defaultStringAryFlag", Value: []string{"abc", "def"}}
   150  					cmdFlagMap["noDefaultStringFlag"] = &cliFlags.StringFlag{Name: "noDefaultStringFlag"}
   151  
   152  					fCtx = NewFlagContext(cmdFlagMap)
   153  				})
   154  
   155  				It("sets flag with default value if 'Value' is provided", func() {
   156  					err := fCtx.Parse()
   157  					Ω(err).ToNot(HaveOccurred())
   158  
   159  					Ω(fCtx.String("defaultStringFlag")).To(Equal("Set by default"))
   160  					Ω(fCtx.IsSet("defaultStringFlag")).To(BeTrue())
   161  
   162  					Ω(fCtx.Bool("defaultBoolFlag")).To(BeTrue())
   163  					Ω(fCtx.IsSet("defaultBoolFlag")).To(BeTrue())
   164  
   165  					Ω(fCtx.Int("defaultIntFlag")).To(Equal(100))
   166  					Ω(fCtx.IsSet("defaultIntFlag")).To(BeTrue())
   167  
   168  					Ω(fCtx.StringSlice("defaultStringAryFlag")).To(Equal([]string{"abc", "def"}))
   169  					Ω(fCtx.IsSet("defaultStringAryFlag")).To(BeTrue())
   170  
   171  					Ω(fCtx.String("noDefaultStringFlag")).To(Equal(""))
   172  					Ω(fCtx.IsSet("noDefaultStringFlag")).To(BeFalse())
   173  				})
   174  
   175  				It("overrides default value if argument is provided, except StringSlice Flag", func() {
   176  					err := fCtx.Parse("-defaultStringFlag=foo", "-defaultBoolFlag=false", "-defaultIntFlag=200", "-defaultStringAryFlag=foo", "-defaultStringAryFlag=bar", "-noDefaultStringFlag=baz")
   177  					Ω(err).ToNot(HaveOccurred())
   178  
   179  					Ω(fCtx.String("defaultStringFlag")).To(Equal("foo"))
   180  					Ω(fCtx.IsSet("defaultStringFlag")).To(BeTrue())
   181  
   182  					Ω(fCtx.Bool("defaultBoolFlag")).To(BeFalse())
   183  					Ω(fCtx.IsSet("defaultBoolFlag")).To(BeTrue())
   184  
   185  					Ω(fCtx.Int("defaultIntFlag")).To(Equal(200))
   186  					Ω(fCtx.IsSet("defaultIntFlag")).To(BeTrue())
   187  
   188  					Ω(fCtx.String("noDefaultStringFlag")).To(Equal("baz"))
   189  					Ω(fCtx.IsSet("noDefaultStringFlag")).To(BeTrue())
   190  				})
   191  
   192  				It("appends argument value to StringSliceFlag to the default values", func() {
   193  					err := fCtx.Parse("-defaultStringAryFlag=foo", "-defaultStringAryFlag=bar")
   194  					Ω(err).ToNot(HaveOccurred())
   195  
   196  					Ω(fCtx.StringSlice("defaultStringAryFlag")).To(Equal([]string{"abc", "def", "foo", "bar"}))
   197  					Ω(fCtx.IsSet("defaultStringAryFlag")).To(BeTrue())
   198  				})
   199  
   200  			})
   201  
   202  			Context("SkipFlagParsing", func() {
   203  				It("skips flag parsing and treats all arguments as values", func() {
   204  					fCtx.SkipFlagParsing(true)
   205  					err := fCtx.Parse("value1", "--name", "foo")
   206  					Ω(err).ToNot(HaveOccurred())
   207  
   208  					Ω(fCtx.IsSet("name")).To(Equal(false))
   209  
   210  					Ω(len(fCtx.Args())).To(Equal(3))
   211  					Ω(fCtx.Args()[0]).To(Equal("value1"))
   212  					Ω(fCtx.Args()[1]).To(Equal("--name"))
   213  					Ω(fCtx.Args()[2]).To(Equal("foo"))
   214  				})
   215  			})
   216  
   217  		})
   218  
   219  	})
   220  })