github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/cf/commands/service/update_user_provided_service_test.go (about) 1 package service_test 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "os" 7 8 "code.cloudfoundry.org/cli/cf/commandregistry" 9 "code.cloudfoundry.org/cli/cf/commands/service" 10 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 11 "code.cloudfoundry.org/cli/cf/flags" 12 "code.cloudfoundry.org/cli/cf/models" 13 "code.cloudfoundry.org/cli/cf/requirements" 14 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 15 "github.com/blang/semver" 16 17 "code.cloudfoundry.org/cli/cf/api/apifakes" 18 testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration" 19 testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal" 20 21 . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" 22 . "github.com/onsi/ginkgo" 23 . "github.com/onsi/gomega" 24 ) 25 26 var _ = Describe("UpdateUserProvidedService", func() { 27 var ( 28 ui *testterm.FakeUI 29 configRepo coreconfig.Repository 30 serviceInstanceRepo *apifakes.FakeUserProvidedServiceInstanceRepository 31 32 cmd commandregistry.Command 33 deps commandregistry.Dependency 34 factory *requirementsfakes.FakeFactory 35 flagContext flags.FlagContext 36 37 loginRequirement requirements.Requirement 38 minAPIVersionRequirement requirements.Requirement 39 serviceInstanceRequirement *requirementsfakes.FakeServiceInstanceRequirement 40 ) 41 42 BeforeEach(func() { 43 ui = &testterm.FakeUI{} 44 configRepo = testconfig.NewRepositoryWithDefaults() 45 serviceInstanceRepo = new(apifakes.FakeUserProvidedServiceInstanceRepository) 46 repoLocator := deps.RepoLocator.SetUserProvidedServiceInstanceRepository(serviceInstanceRepo) 47 48 deps = commandregistry.Dependency{ 49 UI: ui, 50 Config: configRepo, 51 RepoLocator: repoLocator, 52 } 53 54 cmd = &service.UpdateUserProvidedService{} 55 cmd.SetDependency(deps, false) 56 57 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 58 factory = new(requirementsfakes.FakeFactory) 59 60 loginRequirement = &passingRequirement{Name: "login-requirement"} 61 factory.NewLoginRequirementReturns(loginRequirement) 62 63 minAPIVersionRequirement = &passingRequirement{Name: "min-api-version-requirement"} 64 factory.NewMinAPIVersionRequirementReturns(minAPIVersionRequirement) 65 66 serviceInstanceRequirement = new(requirementsfakes.FakeServiceInstanceRequirement) 67 factory.NewServiceInstanceRequirementReturns(serviceInstanceRequirement) 68 }) 69 70 Describe("Requirements", func() { 71 Context("when not provided exactly one arg", func() { 72 BeforeEach(func() { 73 flagContext.Parse("service-instance", "extra-arg") 74 }) 75 76 It("fails with usage", func() { 77 _, err := cmd.Requirements(factory, flagContext) 78 Expect(err).To(HaveOccurred()) 79 Expect(ui.Outputs()).To(ContainSubstrings( 80 []string{"FAILED"}, 81 []string{"Incorrect Usage. Requires an argument"}, 82 )) 83 }) 84 }) 85 86 Context("when provided exactly one arg", func() { 87 BeforeEach(func() { 88 flagContext.Parse("service-instance") 89 }) 90 91 It("returns a LoginRequirement", func() { 92 actualRequirements, err := cmd.Requirements(factory, flagContext) 93 Expect(err).NotTo(HaveOccurred()) 94 Expect(factory.NewLoginRequirementCallCount()).To(Equal(1)) 95 Expect(actualRequirements).To(ContainElement(loginRequirement)) 96 }) 97 }) 98 99 Context("when provided the -r flag", func() { 100 BeforeEach(func() { 101 flagContext.Parse("service-instance", "-r", "route-service-url") 102 }) 103 104 It("returns a MinAPIVersionRequirement", func() { 105 actualRequirements, err := cmd.Requirements(factory, flagContext) 106 Expect(err).NotTo(HaveOccurred()) 107 Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1)) 108 Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement)) 109 110 feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0) 111 Expect(feature).To(Equal("Option '-r'")) 112 expectedRequiredVersion, err := semver.Make("2.51.0") 113 Expect(err).NotTo(HaveOccurred()) 114 Expect(requiredVersion).To(Equal(expectedRequiredVersion)) 115 }) 116 }) 117 118 Context("when provided the -t flag", func() { 119 BeforeEach(func() { 120 flagContext.Parse("service-instance", "-t", "tag,a,service") 121 }) 122 123 It("returns a MinAPIVersionRequirement", func() { 124 actualRequirements, err := cmd.Requirements(factory, flagContext) 125 Expect(err).NotTo(HaveOccurred()) 126 Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1)) 127 Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement)) 128 129 feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0) 130 Expect(feature).To(Equal("Option '-t'")) 131 expectedRequiredVersion, err := semver.Make("2.104.0") 132 Expect(err).NotTo(HaveOccurred()) 133 Expect(requiredVersion).To(Equal(expectedRequiredVersion)) 134 }) 135 }) 136 }) 137 138 Describe("Execute", func() { 139 var runCLIErr error 140 141 BeforeEach(func() { 142 err := flagContext.Parse("service-instance") 143 Expect(err).NotTo(HaveOccurred()) 144 cmd.Requirements(factory, flagContext) 145 }) 146 147 JustBeforeEach(func() { 148 runCLIErr = cmd.Execute(flagContext) 149 }) 150 151 Context("when the service instance is not user-provided", func() { 152 BeforeEach(func() { 153 serviceInstanceRequirement.GetServiceInstanceReturns(models.ServiceInstance{ 154 ServicePlan: models.ServicePlanFields{ 155 GUID: "service-plan-guid", 156 }, 157 }) 158 }) 159 160 It("fails with error", func() { 161 Expect(runCLIErr).To(HaveOccurred()) 162 }) 163 }) 164 165 Context("when the service instance is user-provided", func() { 166 var serviceInstance models.ServiceInstance 167 168 BeforeEach(func() { 169 serviceInstance = models.ServiceInstance{ 170 ServiceInstanceFields: models.ServiceInstanceFields{ 171 Name: "service-instance", 172 Params: map[string]interface{}{}, 173 }, 174 ServicePlan: models.ServicePlanFields{ 175 GUID: "", 176 Description: "service-plan-description", 177 }, 178 } 179 serviceInstanceRequirement.GetServiceInstanceReturns(serviceInstance) 180 }) 181 182 It("tells the user it is updating the user provided service", func() { 183 Expect(runCLIErr).NotTo(HaveOccurred()) 184 Expect(ui.Outputs()).To(ContainSubstrings( 185 []string{"Updating user provided service service-instance in org"}, 186 )) 187 }) 188 189 It("tries to update the service instance", func() { 190 Expect(runCLIErr).NotTo(HaveOccurred()) 191 Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1)) 192 expectedFields := serviceInstance.ServiceInstanceFields 193 expectedFields.Tags = []string{} 194 Expect(serviceInstanceRepo.UpdateArgsForCall(0)).To(Equal(expectedFields)) 195 }) 196 197 It("tells the user no changes were made", func() { 198 Expect(runCLIErr).NotTo(HaveOccurred()) 199 Expect(ui.Outputs()).To(ContainSubstrings( 200 []string{"No flags specified. No changes were made."}, 201 )) 202 }) 203 204 Context("when the -p flag is passed with inline JSON", func() { 205 BeforeEach(func() { 206 flagContext.Parse("service-instance", "-p", `"{"some":"json"}"`) 207 }) 208 209 It("tries to update the user provided service instance with the credentials", func() { 210 Expect(runCLIErr).NotTo(HaveOccurred()) 211 Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1)) 212 serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0) 213 Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{ 214 "some": "json", 215 })) 216 }) 217 218 It("does not tell the user that no changes were made", func() { 219 Expect(ui.Outputs()).NotTo(ContainSubstrings( 220 []string{"No flags specified. No changes were made."}, 221 )) 222 }) 223 }) 224 225 Context("when the -p flag is passed with a file containing JSON", func() { 226 var filename string 227 228 BeforeEach(func() { 229 tempfile, err := ioutil.TempFile("", "update-user-provided-service-test") 230 Expect(err).NotTo(HaveOccurred()) 231 Expect(tempfile.Close()).NotTo(HaveOccurred()) 232 filename = tempfile.Name() 233 234 jsonData := `{"some":"json"}` 235 ioutil.WriteFile(filename, []byte(jsonData), os.ModePerm) 236 flagContext.Parse("service-instance", "-p", filename) 237 }) 238 239 AfterEach(func() { 240 Expect(os.RemoveAll(filename)).NotTo(HaveOccurred()) 241 }) 242 243 It("tries to update the user provided service instance with the credentials", func() { 244 Expect(runCLIErr).NotTo(HaveOccurred()) 245 Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1)) 246 serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0) 247 Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{ 248 "some": "json", 249 })) 250 }) 251 252 It("does not tell the user that no changes were made", func() { 253 Expect(ui.Outputs()).NotTo(ContainSubstrings( 254 []string{"No flags specified. No changes were made."}, 255 )) 256 }) 257 }) 258 259 Context("when the -p flag is passed with inline JSON", func() { 260 BeforeEach(func() { 261 flagContext.Parse("service-instance", "-p", `key1,key2`) 262 ui.Inputs = []string{"value1", "value2"} 263 }) 264 265 It("prompts the user for the values", func() { 266 Expect(runCLIErr).NotTo(HaveOccurred()) 267 Expect(ui.Prompts).To(ContainSubstrings( 268 []string{"key1"}, 269 []string{"key2"}, 270 )) 271 }) 272 273 It("tries to update the user provided service instance with the credentials", func() { 274 Expect(runCLIErr).NotTo(HaveOccurred()) 275 276 Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1)) 277 serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0) 278 Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{ 279 "key1": "value1", 280 "key2": "value2", 281 })) 282 }) 283 284 It("does not tell the user that no changes were made", func() { 285 Expect(ui.Outputs()).NotTo(ContainSubstrings( 286 []string{"No flags specified. No changes were made."}, 287 )) 288 }) 289 }) 290 291 Context("when passing in tags", func() { 292 BeforeEach(func() { 293 flagContext.Parse("service-instance", "-t", "tag1, tag2, tag3, tag4") 294 }) 295 296 It("sucessfully updates the service instance and passes the tags as json", func() { 297 Expect(runCLIErr).NotTo(HaveOccurred()) 298 Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1)) 299 serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0) 300 Expect(serviceInstanceFields.Tags).To(ConsistOf("tag1", "tag2", "tag3", "tag4")) 301 }) 302 303 It("does not tell the user that no changes were made", func() { 304 Expect(ui.Outputs()).NotTo(ContainSubstrings( 305 []string{"No flags specified. No changes were made."}, 306 )) 307 }) 308 }) 309 310 Context("when updating succeeds", func() { 311 BeforeEach(func() { 312 serviceInstanceRepo.UpdateReturns(nil) 313 }) 314 315 It("tells the user OK", func() { 316 Expect(runCLIErr).NotTo(HaveOccurred()) 317 Expect(ui.Outputs()).To(ContainSubstrings( 318 []string{"OK"}, 319 )) 320 }) 321 322 It("prints a tip", func() { 323 Expect(runCLIErr).NotTo(HaveOccurred()) 324 Expect(ui.Outputs()).To(ContainSubstrings( 325 []string{"TIP"}, 326 )) 327 }) 328 }) 329 330 Context("when updating fails", func() { 331 BeforeEach(func() { 332 serviceInstanceRepo.UpdateReturns(errors.New("update-err")) 333 }) 334 335 It("fails with error", func() { 336 Expect(runCLIErr).To(HaveOccurred()) 337 Expect(runCLIErr.Error()).To(Equal("update-err")) 338 }) 339 }) 340 }) 341 }) 342 })