github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/integration/v7/isolated/create_user_provided_service_command_test.go (about) 1 package isolated 2 3 import ( 4 "os" 5 6 "code.cloudfoundry.org/cli/integration/helpers" 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 . "github.com/onsi/gomega/gbytes" 10 . "github.com/onsi/gomega/gexec" 11 ) 12 13 var _ = Describe("create-user-provided-service command", func() { 14 Describe("help", func() { 15 expectHelpMessage := func(session *Session) { 16 Expect(session).To(SatisfyAll( 17 Say(`NAME:`), 18 Say(`create-user-provided-service - Make a user-provided service instance available to CF apps`), 19 Say(`USAGE:`), 20 Say(`cf create-user-provided-service SERVICE_INSTANCE \[-p CREDENTIALS\] \[-l SYSLOG_DRAIN_URL\] \[-r ROUTE_SERVICE_URL\] \[-t TAGS\]`), 21 Say(`Pass comma separated credential parameter names to enable interactive mode:`), 22 Say(`cf create-user-provided-service SERVICE_INSTANCE -p "comma, separated, parameter, names"`), 23 Say(`Pass credential parameters as JSON to create a service non-interactively:`), 24 Say(`cf create-user-provided-service SERVICE_INSTANCE -p '\{"key1":"value1","key2":"value2"\}'`), 25 Say(`Specify a path to a file containing JSON:`), 26 Say(`cf create-user-provided-service SERVICE_INSTANCE -p PATH_TO_FILE`), 27 Say(`EXAMPLES:`), 28 Say(`cf create-user-provided-service my-db-mine -p "username, password"`), 29 Say(`cf create-user-provided-service my-db-mine -p /path/to/credentials.json`), 30 Say(`cf create-user-provided-service my-db-mine -t "list, of, tags"`), 31 Say(`cf create-user-provided-service my-drain-service -l syslog://example.com`), 32 Say(`cf create-user-provided-service my-route-service -r https://example.com`), 33 Say(`Linux/Mac:`), 34 Say(`cf create-user-provided-service my-db-mine -p '\{"username":"admin","password":"pa55woRD"\}'`), 35 Say(`Windows Command Line:`), 36 Say(`cf create-user-provided-service my-db-mine -p "\{\\"username\\":\\"admin\\",\\"password\\":\\"pa55woRD\\"\}"`), 37 Say(`Windows PowerShell:`), 38 Say(`cf create-user-provided-service my-db-mine -p '\{\\"username\\":\\"admin\\",\\"password\\":\\"pa55woRD\\"\}'`), 39 Say(`ALIAS:`), 40 Say(`cups`), 41 Say(`OPTIONS:`), 42 Say(`-l URL to which logs for bound applications will be streamed`), 43 Say(`-p Credentials, provided inline or in a file, to be exposed in the VCAP_SERVICES environment variable for bound applications`), 44 Say(`-r URL to which requests for bound routes will be forwarded. Scheme for this URL must be https`), 45 Say(`-t User provided tags`), 46 Say(`SEE ALSO:`), 47 Say(`bind-service, services`), 48 )) 49 } 50 51 When("--help flag is set", func() { 52 It("displays command usage to output", func() { 53 session := helpers.CF("create-user-provided-service", "--help") 54 Eventually(session).Should(Exit(0)) 55 56 expectHelpMessage(session) 57 }) 58 }) 59 60 When("no arguments provided", func() { 61 It("fails and displays command usage", func() { 62 session := helpers.CF("create-user-provided-service") 63 Eventually(session).Should(Exit(1)) 64 65 Expect(session.Err).To(Say("Incorrect Usage: the required argument `SERVICE_INSTANCE` was not provided")) 66 expectHelpMessage(session) 67 }) 68 }) 69 70 When("an superfluous argument is provided", func() { 71 It("fails and displays command usage", func() { 72 session := helpers.CF("create-user-provided-service", "name", "extraparam") 73 Eventually(session).Should(Exit(1)) 74 75 Expect(session.Err).To(Say(`Incorrect Usage: unexpected argument "extraparam"`)) 76 expectHelpMessage(session) 77 }) 78 }) 79 80 When("an unsupported flag is provided", func() { 81 It("fails and displays command usage", func() { 82 session := helpers.CF("create-user-provided-service", "name", "--do-magic") 83 Eventually(session).Should(Exit(1)) 84 85 Expect(session.Err).To(Say("Incorrect Usage: unknown flag `do-magic")) 86 expectHelpMessage(session) 87 }) 88 }) 89 }) 90 91 When("the environment is not setup correctly", func() { 92 It("fails with the appropriate errors", func() { 93 helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "create-user-provided-service", "foo") 94 }) 95 }) 96 97 When("targeting a space", func() { 98 var ( 99 userName string 100 orgName string 101 spaceName string 102 serviceName string 103 ) 104 105 expectOKMessage := func(session *Session, serviceName, orgName, spaceName, userName string) { 106 Expect(session.Out).To(SatisfyAll( 107 Say("Creating user provided service %s in org %s / space %s as %s...", serviceName, orgName, spaceName, userName), 108 Say("OK"), 109 )) 110 } 111 112 BeforeEach(func() { 113 orgName = helpers.NewOrgName() 114 spaceName = helpers.NewSpaceName() 115 helpers.SetupCF(orgName, spaceName) 116 userName, _ = helpers.GetCredentials() 117 serviceName = helpers.PrefixedRandomName("ups") 118 }) 119 120 AfterEach(func() { 121 helpers.QuickDeleteOrg(orgName) 122 }) 123 124 When("a name is provided", func() { 125 It("displays success message, exits 0, and creates the service", func() { 126 session := helpers.CF(`create-user-provided-service`, serviceName) 127 128 Eventually(session).Should(Exit(0)) 129 expectOKMessage(session, serviceName, orgName, spaceName, userName) 130 131 session = helpers.CF("service", serviceName) 132 Eventually(session).Should(Exit(0)) 133 Expect(session).To(Say(`name:\s+%s`, serviceName)) 134 }) 135 }) 136 137 When("all parameters are provided", func() { 138 It("displays success message, exits 0, and creates the service", func() { 139 session := helpers.CF( 140 `create-user-provided-service`, serviceName, 141 `-p`, `'{"username":"password"}'`, 142 `-t`, `"list, of, tags"`, 143 `-l`, `syslog://example-syslog.com`, 144 `-r`, `https://example-route.com`, 145 ) 146 147 Eventually(session).Should(Exit(0)) 148 expectOKMessage(session, serviceName, orgName, spaceName, userName) 149 150 session = helpers.CF("service", serviceName) 151 Eventually(session).Should(Exit(0)) 152 Expect(session).To(SatisfyAll( 153 Say(`name:\s+%s`, serviceName), 154 Say(`tags:\s+list,\s*of,\s*tags`), 155 Say(`route service url:\s+https://example-route.com`), 156 )) 157 }) 158 }) 159 160 When("requesting interactive credentials", func() { 161 var buffer *Buffer 162 163 BeforeEach(func() { 164 buffer = NewBuffer() 165 _, err := buffer.Write([]byte("fake-username\nfake-password\n")) 166 Expect(err).ToNot(HaveOccurred()) 167 }) 168 169 It("requests the credentials at a prompt", func() { 170 session := helpers.CFWithStdin(buffer, "create-user-provided-service", serviceName, "-p", `"username,password"`) 171 172 Eventually(session).Should(Say("username: ")) 173 Eventually(session).Should(Say("password: ")) 174 Consistently(session).ShouldNot(Say("fake-username"), "credentials should not be echoed to the user") 175 Consistently(session).ShouldNot(Say("fake-password"), "credentials should not be echoed to the user") 176 Eventually(session).Should(Exit(0)) 177 178 expectOKMessage(session, serviceName, orgName, spaceName, userName) 179 }) 180 }) 181 182 When("reading JSON credentials from a file", func() { 183 var path string 184 185 BeforeEach(func() { 186 path = helpers.TempFileWithContent(`{"some": "credentials"}`) 187 }) 188 189 AfterEach(func() { 190 Expect(os.Remove(path)).To(Succeed()) 191 }) 192 193 It("accepts a file path", func() { 194 session := helpers.CF("create-user-provided-service", serviceName, "-p", path) 195 196 By("checking that it does not interpret the file name as request for an interactive credential prompt") 197 Consistently(session.Out.Contents()).ShouldNot(ContainSubstring(path)) 198 199 By("succeeding") 200 Eventually(session).Should(Exit(0)) 201 expectOKMessage(session, serviceName, orgName, spaceName, userName) 202 }) 203 }) 204 }) 205 })