github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/integration/v6/isolated/help_command_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"os/exec"
     5  	"strings"
     6  
     7  	"code.cloudfoundry.org/cli/integration/helpers"
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/ginkgo/extensions/table"
    10  	. "github.com/onsi/gomega"
    11  	. "github.com/onsi/gomega/gbytes"
    12  	. "github.com/onsi/gomega/gexec"
    13  )
    14  
    15  var _ = Describe("help command", func() {
    16  	DescribeTable("displays help for common commands",
    17  		func(setup func() *exec.Cmd) {
    18  			cmd := setup()
    19  			session, err := Start(cmd, GinkgoWriter, GinkgoWriter)
    20  			Expect(err).NotTo(HaveOccurred())
    21  
    22  			Eventually(session).Should(Say("Cloud Foundry command line tool"))
    23  			Eventually(session).Should(Say(`\[global options\] command \[arguments...\] \[command options\]`))
    24  			Eventually(session).Should(Say("Before getting started:"))
    25  			Eventually(session).Should(Say(`  config\s+login,l\s+target,t`))
    26  			Eventually(session).Should(Say("Application lifecycle:"))
    27  			Eventually(session).Should(Say(`  apps,a\s+run-task,rt\s+events`))
    28  			Eventually(session).Should(Say(`  restage,rg\s+scale`))
    29  
    30  			Eventually(session).Should(Say("Services integration:"))
    31  			Eventually(session).Should(Say(`  marketplace,m\s+create-user-provided-service,cups`))
    32  			Eventually(session).Should(Say(`  services,s\s+update-user-provided-service,uups`))
    33  
    34  			Eventually(session).Should(Say("Route and domain management:"))
    35  			Eventually(session).Should(Say(`  routes,r\s+delete-route\s+create-domain`))
    36  			Eventually(session).Should(Say(`  domains\s+map-route`))
    37  
    38  			Eventually(session).Should(Say("Space management:"))
    39  			Eventually(session).Should(Say(`  spaces\s+create-space\s+set-space-role`))
    40  
    41  			Eventually(session).Should(Say("Org management:"))
    42  			Eventually(session).Should(Say(`  orgs,o\s+set-org-role`))
    43  
    44  			Eventually(session).Should(Say("CLI plugin management:"))
    45  			Eventually(session).Should(Say("  install-plugin    list-plugin-repos"))
    46  			Eventually(session).Should(Say("Global options:"))
    47  			Eventually(session).Should(Say("  --help, -h                         Show help"))
    48  			Eventually(session).Should(Say("  -v                                 Print API request diagnostics to stdout"))
    49  
    50  			Eventually(session).Should(Say(`TIP: Use 'cf help -a' to see all commands\.`))
    51  			Eventually(session).Should(Exit(0))
    52  		},
    53  
    54  		Entry("when cf is run without providing a command or a flag", func() *exec.Cmd {
    55  			return exec.Command("cf")
    56  		}),
    57  
    58  		Entry("when cf help is run", func() *exec.Cmd {
    59  			return exec.Command("cf", "help")
    60  		}),
    61  
    62  		Entry("when cf is run with -h flag alone", func() *exec.Cmd {
    63  			return exec.Command("cf", "-h")
    64  		}),
    65  
    66  		Entry("when cf is run with --help flag alone", func() *exec.Cmd {
    67  			return exec.Command("cf", "--help")
    68  		}),
    69  	)
    70  
    71  	DescribeTable("displays help for all commands",
    72  		func(setup func() *exec.Cmd) {
    73  			cmd := setup()
    74  			session, err := Start(cmd, GinkgoWriter, GinkgoWriter)
    75  			Expect(err).NotTo(HaveOccurred())
    76  
    77  			Eventually(session).Should(Say("NAME:"))
    78  			Eventually(session).Should(Say("USAGE:"))
    79  			Eventually(session).Should(Say("VERSION:"))
    80  			Eventually(session).Should(Say("GETTING STARTED:"))
    81  			Eventually(session).Should(Say("ENVIRONMENT VARIABLES:"))
    82  			Eventually(session).Should(Say(`CF_DIAL_TIMEOUT=6\s+Max wait time to establish a connection, including name resolution, in seconds`))
    83  			Eventually(session).Should(Say("GLOBAL OPTIONS:"))
    84  			Eventually(session).Should(Say(`APPS \(experimental\):`))
    85  			Eventually(session).Should(Exit(0))
    86  		},
    87  
    88  		Entry("when cf help is run", func() *exec.Cmd {
    89  			return exec.Command("cf", "help", "-a")
    90  		}),
    91  
    92  		Entry("when cf is run with -h -a flag", func() *exec.Cmd {
    93  			return exec.Command("cf", "-h", "-a")
    94  		}),
    95  
    96  		Entry("when cf is run with --help -a flag", func() *exec.Cmd {
    97  			return exec.Command("cf", "--help", "-a")
    98  		}),
    99  	)
   100  
   101  	Describe("commands that appear in cf help -a", func() {
   102  		It("includes run-task", func() {
   103  			session := helpers.CF("help", "-a")
   104  			Eventually(session).Should(Say(`run-task\s+Run a one-off task on an app`))
   105  			Eventually(session).Should(Exit(0))
   106  		})
   107  
   108  		It("includes list-task", func() {
   109  			session := helpers.CF("help", "-a")
   110  			Eventually(session).Should(Say(`tasks\s+List tasks of an app`))
   111  			Eventually(session).Should(Exit(0))
   112  		})
   113  
   114  		It("includes terminate-task", func() {
   115  			session := helpers.CF("help", "-a")
   116  			Eventually(session).Should(Say(`terminate-task\s+Terminate a running task of an app`))
   117  			Eventually(session).Should(Exit(0))
   118  		})
   119  	})
   120  
   121  	Context("displays the help text for a given command", func() {
   122  		DescribeTable("displays the help",
   123  			func(setup func() (*exec.Cmd, int)) {
   124  				cmd, exitCode := setup()
   125  				session, err := Start(cmd, GinkgoWriter, GinkgoWriter)
   126  				Expect(err).NotTo(HaveOccurred())
   127  
   128  				Eventually(session).Should(Say("NAME:"))
   129  				Eventually(session).Should(Say("create-user-provided-service - Make a user-provided service instance available to CF apps"))
   130  				Eventually(session).Should(Say(`cf create-user-provided-service SERVICE_INSTANCE \[-p CREDENTIALS\] \[-l SYSLOG_DRAIN_URL\] \[-r ROUTE_SERVICE_URL\]`))
   131  				Eventually(session).Should(Say(`-l\s+URL to which logs for bound applications will be streamed`))
   132  				Eventually(session).Should(Exit(exitCode))
   133  			},
   134  
   135  			Entry("when a command is called with the --help flag", func() (*exec.Cmd, int) {
   136  				return exec.Command("cf", "create-user-provided-service", "--help"), 0
   137  			}),
   138  
   139  			Entry("when a command is called with the --help flag and command arguments", func() (*exec.Cmd, int) {
   140  				return exec.Command("cf", "create-user-provided-service", "-l", "http://example.com", "--help"), 0
   141  			}),
   142  
   143  			Entry("when a command is called with the --help flag and command arguments prior to the command", func() (*exec.Cmd, int) {
   144  				return exec.Command("cf", "-l", "create-user-provided-service", "--help"), 1
   145  			}),
   146  
   147  			Entry("when the help command is passed a command name", func() (*exec.Cmd, int) {
   148  				return exec.Command("cf", "help", "create-user-provided-service"), 0
   149  			}),
   150  
   151  			Entry("when the --help flag is passed with a command name", func() (*exec.Cmd, int) {
   152  				return exec.Command("cf", "--help", "create-user-provided-service"), 0
   153  			}),
   154  
   155  			Entry("when the -h flag is passed with a command name", func() (*exec.Cmd, int) {
   156  				return exec.Command("cf", "-h", "create-user-provided-service"), 0
   157  			}),
   158  
   159  			Entry("when the help command is passed a command alias", func() (*exec.Cmd, int) {
   160  				return exec.Command("cf", "help", "cups"), 0
   161  			}),
   162  
   163  			Entry("when the --help flag is passed with a command alias", func() (*exec.Cmd, int) {
   164  				return exec.Command("cf", "--help", "cups"), 0
   165  			}),
   166  
   167  			Entry("when the --help flag is passed after a command alias", func() (*exec.Cmd, int) {
   168  				return exec.Command("cf", "cups", "--help"), 0
   169  			}),
   170  
   171  			Entry("when an invalid flag is passed", func() (*exec.Cmd, int) {
   172  				return exec.Command("cf", "create-user-provided-service", "--invalid-flag"), 1
   173  			}),
   174  
   175  			Entry("when missing required arguments", func() (*exec.Cmd, int) {
   176  				return exec.Command("cf", "create-user-provided-service"), 1
   177  			}),
   178  
   179  			Entry("when missing arguments to flags", func() (*exec.Cmd, int) {
   180  				return exec.Command("cf", "create-user-provided-service", "foo", "-l"), 1
   181  			}),
   182  		)
   183  
   184  		When("the command uses timeout environment variables", func() {
   185  			DescribeTable("shows the CF_STAGING_TIMEOUT and CF_STARTUP_TIMEOUT environment variables",
   186  				func(setup func() (*exec.Cmd, int)) {
   187  					cmd, exitCode := setup()
   188  					session, err := Start(cmd, GinkgoWriter, GinkgoWriter)
   189  					Expect(err).NotTo(HaveOccurred())
   190  
   191  					Eventually(session).Should(Say("ENVIRONMENT:"))
   192  					Eventually(session).Should(Say("CF_STAGING_TIMEOUT=15\\s+Max wait time for buildpack staging, in minutes"))
   193  					Eventually(session).Should(Say("CF_STARTUP_TIMEOUT=5\\s+Max wait time for app instance startup, in minutes"))
   194  					Eventually(session).Should(Exit(exitCode))
   195  				},
   196  
   197  				Entry("cf push", func() (*exec.Cmd, int) {
   198  					return exec.Command("cf", "h", "push"), 0
   199  				}),
   200  
   201  				Entry("cf start", func() (*exec.Cmd, int) {
   202  					return exec.Command("cf", "h", "start"), 0
   203  				}),
   204  
   205  				Entry("cf restart", func() (*exec.Cmd, int) {
   206  					return exec.Command("cf", "h", "restart"), 0
   207  				}),
   208  
   209  				Entry("cf restage", func() (*exec.Cmd, int) {
   210  					return exec.Command("cf", "h", "restage"), 0
   211  				}),
   212  
   213  				Entry("cf copy-source", func() (*exec.Cmd, int) {
   214  					return exec.Command("cf", "h", "copy-source"), 0
   215  				}),
   216  			)
   217  		})
   218  	})
   219  
   220  	When("the command does not exist", func() {
   221  		DescribeTable("help displays an error message",
   222  			func(command func() *exec.Cmd) {
   223  				session, err := Start(command(), GinkgoWriter, GinkgoWriter)
   224  				Expect(err).NotTo(HaveOccurred())
   225  
   226  				Eventually(session.Err).Should(Say("'rock' is not a registered command. See 'cf help -a'"))
   227  				Eventually(session).Should(Exit(1))
   228  			},
   229  
   230  			Entry("passing --help into rock (cf rock --help)", func() *exec.Cmd {
   231  				return exec.Command("cf", "rock", "--help")
   232  			}),
   233  
   234  			Entry("passing the --help flag (cf --help rock)", func() *exec.Cmd {
   235  				return exec.Command("cf", "--help", "rock")
   236  			}),
   237  
   238  			Entry("calling the help command directly", func() *exec.Cmd {
   239  				return exec.Command("cf", "help", "rock")
   240  			}),
   241  		)
   242  
   243  	})
   244  
   245  	When("the option does not exist", func() {
   246  		DescribeTable("help display an error message as well as help for common commands",
   247  
   248  			func(command func() *exec.Cmd) {
   249  				session, err := Start(command(), GinkgoWriter, GinkgoWriter)
   250  				Expect(err).NotTo(HaveOccurred())
   251  
   252  				Eventually(session).Should(Exit(1))
   253  				Eventually(session).Should(Say("Before getting started:")) // common help
   254  				Expect(strings.Count(string(session.Err.Contents()), "unknown flag")).To(Equal(1))
   255  			},
   256  
   257  			Entry("passing invalid option", func() *exec.Cmd {
   258  				return exec.Command("cf", "-c")
   259  			}),
   260  
   261  			Entry("passing -a option", func() *exec.Cmd {
   262  				return exec.Command("cf", "-a")
   263  			}),
   264  		)
   265  	})
   266  })