github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/integration/shared/isolated/update_user_provided_service_command_test.go (about) 1 package isolated 2 3 import ( 4 "os" 5 6 "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" 7 "code.cloudfoundry.org/cli/integration/helpers" 8 . "github.com/onsi/ginkgo" 9 . "github.com/onsi/gomega" 10 . "github.com/onsi/gomega/gbytes" 11 . "github.com/onsi/gomega/gexec" 12 ) 13 14 var _ = Describe("update-user-provided-service command", func() { 15 BeforeEach(func() { 16 helpers.SkipIfVersionLessThan(ccversion.MinVersionTagsOnUserProvidedServices) 17 }) 18 19 Describe("help", func() { 20 When("--help flag is set", func() { 21 It("displays command usage to output", func() { 22 session := helpers.CF("update-user-provided-service", "--help") 23 eventuallyExpectHelpMessage(session) 24 Eventually(session).Should(Exit(0)) 25 }) 26 }) 27 }) 28 29 When("the environment is not setup correctly", func() { 30 It("fails with the appropriate errors", func() { 31 helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "update-user-provided-service", "foo") 32 }) 33 }) 34 35 When("an api is targeted, the user is logged in, and an org and space are targeted", func() { 36 var ( 37 userName string 38 orgName string 39 spaceName string 40 ) 41 42 BeforeEach(func() { 43 orgName = helpers.NewOrgName() 44 spaceName = helpers.NewSpaceName() 45 helpers.SetupCF(orgName, spaceName) 46 userName, _ = helpers.GetCredentials() 47 }) 48 49 AfterEach(func() { 50 helpers.QuickDeleteOrg(orgName) 51 }) 52 53 When("the user-provided service instance name is not provided", func() { 54 It("displays the help message and exits 1", func() { 55 session := helpers.CF("update-user-provided-service") 56 eventuallyExpectHelpMessage(session) 57 Eventually(session).Should(Exit(1)) 58 }) 59 }) 60 61 When("there are unknown additional arguments", func() { 62 It("displays the help message and exits 1", func() { 63 session := helpers.CF("update-user-provided-service", "service-name", "additional", "invalid", "arguments") 64 eventuallyExpectHelpMessage(session) 65 Eventually(session).Should(Exit(1)) 66 }) 67 }) 68 69 When("the user-provided service instance does not exist", func() { 70 It("displays an informative error and exits 1", func() { 71 session := helpers.CF("update-user-provided-service", "non-existent-service") 72 Eventually(session.Err).Should(Say("Service instance non-existent-service not found")) 73 Eventually(session.Out).Should(Say("FAILED")) 74 Eventually(session).Should(Exit(1)) 75 }) 76 }) 77 78 When("the user-provided service exists", func() { 79 var serviceName string 80 81 BeforeEach(func() { 82 serviceName = randomUserProvidedServiceName() 83 createUserProvidedService(serviceName) 84 }) 85 86 AfterEach(func() { 87 deleteUserProvidedService(serviceName) 88 }) 89 90 When("no flags are provided", func() { 91 It("displays an informative message and exits 0", func() { 92 session := helpers.CF("update-user-provided-service", serviceName) 93 Eventually(session.Out).Should(Say("No flags specified. No changes were made.")) 94 Eventually(session).Should(Exit(0)) 95 }) 96 }) 97 98 When("flags are provided", func() { 99 It("displays success message, exits 0, and updates the service", func() { 100 session := helpers.CF( 101 `update-user-provided-service`, serviceName, 102 `-l`, `syslog://example.com`, 103 `-p`, `{"some": "credentials"}`, 104 `-r`, `https://example.com`, 105 `-t`, `"tag1,tag2"`, 106 ) 107 108 eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName) 109 Eventually(session).Should(Exit(0)) 110 111 session = helpers.CF("service", serviceName) 112 Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`)) 113 Eventually(session).Should(Say(`route service url:\s+https://example.com`)) 114 }) 115 }) 116 117 Context("when the user-provided service already has values", func() { 118 BeforeEach(func() { 119 session := helpers.CF( 120 `update-user-provided-service`, serviceName, 121 `-l`, `syslog://example.com`, 122 `-p`, `{"some": "credentials"}`, 123 `-r`, `https://example.com`, 124 `-t`, `"tag1,tag2"`, 125 ) 126 Eventually(session).Should(Exit(0)) 127 128 session = helpers.CF("service", serviceName) 129 Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`)) 130 Eventually(session).Should(Say(`route service url:\s+https://example.com`)) 131 }) 132 133 It("can unset previous values provideding empty strings as flag values", func() { 134 session := helpers.CF( 135 `update-user-provided-service`, serviceName, 136 `-l`, `""`, 137 `-p`, `""`, 138 `-r`, `""`, 139 `-t`, `""`, 140 ) 141 Eventually(session).Should(Exit(0)) 142 143 session = helpers.CF("service", serviceName) 144 Consistently(session).ShouldNot(Say(`tags:\s+tag1,\s*tag2`)) 145 Consistently(session).ShouldNot(Say(`route service url:\s+https://example.com`)) 146 }) 147 148 It("does not unset previous values for flags that are not provided", func() { 149 session := helpers.CF( 150 `update-user-provided-service`, serviceName, 151 `-l`, `""`, 152 `-p`, `""`, 153 ) 154 Eventually(session).Should(Exit(0)) 155 156 session = helpers.CF("service", serviceName) 157 Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`)) 158 Eventually(session).Should(Say(`route service url:\s+https://example.com`)) 159 }) 160 }) 161 162 When("requesting interactive credentials", func() { 163 var buffer *Buffer 164 165 BeforeEach(func() { 166 buffer = NewBuffer() 167 _, err := buffer.Write([]byte("fake-username\nfake-password\n")) 168 Expect(err).ToNot(HaveOccurred()) 169 }) 170 171 It("requests the credentials at a prompt", func() { 172 session := helpers.CFWithStdin(buffer, "update-user-provided-service", serviceName, "-p", `"username,password"`) 173 174 Eventually(session).Should(Say("username: ")) 175 Eventually(session).Should(Say("password: ")) 176 Consistently(session).ShouldNot(Say("fake-username"), "credentials should not be echoed to the user") 177 Consistently(session).ShouldNot(Say("fake-password"), "credentials should not be echoed to the user") 178 eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName) 179 Eventually(session).Should(Exit(0)) 180 }) 181 }) 182 183 When("reading JSON credentials from a file", func() { 184 var path string 185 186 BeforeEach(func() { 187 path = helpers.TempFileWithContent(`{"some": "credentials"}`) 188 }) 189 190 AfterEach(func() { 191 Expect(os.Remove(path)).To(Succeed()) 192 }) 193 194 It("accepts a file path", func() { 195 session := helpers.CF("update-user-provided-service", serviceName, "-p", path) 196 197 By("checking that it does not interpret the file name as request for an interactive credential prompt") 198 Consistently(session.Out.Contents()).ShouldNot(ContainSubstring(path)) 199 200 By("succeeding") 201 eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName) 202 Eventually(session).Should(Exit(0)) 203 }) 204 }) 205 }) 206 }) 207 }) 208 209 func eventuallyExpectHelpMessage(session *Session) { 210 Eventually(session).Should(Say(`NAME:`)) 211 Eventually(session).Should(Say(`\s+update-user-provided-service - Update user-provided service instance`)) 212 Eventually(session).Should(Say(`USAGE:`)) 213 Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE \[-p CREDENTIALS\] \[-l SYSLOG_DRAIN_URL\] \[-r ROUTE_SERVICE_URL\] \[-t TAGS\]`)) 214 Eventually(session).Should(Say(`\s+Pass comma separated credential parameter names to enable interactive mode:`)) 215 Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p "comma, separated, parameter, names"`)) 216 Eventually(session).Should(Say(`\s+Pass credential parameters as JSON to create a service non-interactively:`)) 217 Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p '{"key1":"value1","key2":"value2"}'`)) 218 Eventually(session).Should(Say(`\s+Specify a path to a file containing JSON:`)) 219 Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p PATH_TO_FILE`)) 220 Eventually(session).Should(Say(`EXAMPLES:`)) 221 Eventually(session).Should(Say(`\s+cf update-user-provided-service my-db-mine -p '{"username":"admin", "password":"pa55woRD"}'`)) 222 Eventually(session).Should(Say(`\s+cf update-user-provided-service my-db-mine -p /path/to/credentials.json`)) 223 Eventually(session).Should(Say(`\s+cf create-user-provided-service my-db-mine -t "list, of, tags"`)) 224 Eventually(session).Should(Say(`\s+cf update-user-provided-service my-drain-service -l syslog://example.com`)) 225 Eventually(session).Should(Say(`\s+cf update-user-provided-service my-route-service -r https://example.com`)) 226 Eventually(session).Should(Say(`ALIAS:`)) 227 Eventually(session).Should(Say(`\s+uups`)) 228 Eventually(session).Should(Say(`OPTIONS:`)) 229 Eventually(session).Should(Say(`\s+-l\s+URL to which logs for bound applications will be streamed`)) 230 Eventually(session).Should(Say(`\s+-p\s+Credentials, provided inline or in a file, to be exposed in the VCAP_SERVICES environment variable for bound applications. Provided credentials will override existing credentials.`)) 231 Eventually(session).Should(Say(`\s+-r\s+URL to which requests for bound routes will be forwarded. Scheme for this URL must be https`)) 232 Eventually(session).Should(Say(`\s+-t\s+User provided tags`)) 233 Eventually(session).Should(Say(`SEE ALSO:`)) 234 Eventually(session).Should(Say(`\s+rename-service, services, update-service`)) 235 } 236 237 func eventuallyExpectOKMessage(session *Session, serviceName, orgName, spaceName, userName string) { 238 Eventually(session.Out).Should(Say("Updating user provided service %s in org %s / space %s as %s...", serviceName, orgName, spaceName, userName)) 239 Eventually(session.Out).Should(Say("OK")) 240 Eventually(session.Out).Should(Say("TIP: Use 'cf restage' for any bound apps to ensure your env variable changes take effect")) 241 } 242 243 func randomUserProvidedServiceName() string { 244 return helpers.PrefixedRandomName("ups") 245 } 246 247 func createUserProvidedService(name string) { 248 Eventually(helpers.CF("create-user-provided-service", name)).Should(Exit(0)) 249 } 250 251 func deleteUserProvidedService(name string) { 252 Eventually(helpers.CF("delete-service", name)).Should(Exit(0)) 253 }