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

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