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 })